mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 12:12:47 +01:00
Change the fp to integer code to not perform 2-byte stores followed by
1 byte loads and other operations. This is bad for store-forwarding on common CPUs. We now do this: fnstcw WORD PTR [%ESP] mov %AX, WORD PTR [%ESP] instead of: fnstcw WORD PTR [%ESP] mov %AL, BYTE PTR [%ESP + 1] llvm-svn: 22559
This commit is contained in:
parent
454caae5bd
commit
a681fc64d6
@ -4332,20 +4332,17 @@ void ISel::Select(SDOperand N) {
|
||||
addFrameReference(BuildMI(BB, X86::FNSTCW16m, 4), CWFrameIdx);
|
||||
|
||||
// Load the old value of the high byte of the control word...
|
||||
unsigned HighPartOfCW = MakeReg(MVT::i8);
|
||||
addFrameReference(BuildMI(BB, X86::MOV8rm, 4, HighPartOfCW),
|
||||
CWFrameIdx, 1);
|
||||
unsigned OldCW = MakeReg(MVT::i16);
|
||||
addFrameReference(BuildMI(BB, X86::MOV16rm, 4, OldCW), CWFrameIdx);
|
||||
|
||||
// Set the high part to be round to zero...
|
||||
addFrameReference(BuildMI(BB, X86::MOV8mi, 5),
|
||||
CWFrameIdx, 1).addImm(12);
|
||||
addFrameReference(BuildMI(BB, X86::MOV16mi, 5), CWFrameIdx).addImm(0xB7F);
|
||||
|
||||
// Reload the modified control word now...
|
||||
addFrameReference(BuildMI(BB, X86::FLDCW16m, 4), CWFrameIdx);
|
||||
|
||||
// Restore the memory image of control word to original value
|
||||
addFrameReference(BuildMI(BB, X86::MOV8mr, 5),
|
||||
CWFrameIdx, 1).addReg(HighPartOfCW);
|
||||
addFrameReference(BuildMI(BB, X86::MOV16mr, 5), CWFrameIdx).addReg(OldCW);
|
||||
|
||||
// Get the X86 opcode to use.
|
||||
switch (N.getOpcode()) {
|
||||
|
Loading…
Reference in New Issue
Block a user