From a681fc64d6907b1a3db984a041562fbd2d8a21b2 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sat, 30 Jul 2005 00:17:52 +0000 Subject: [PATCH] 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 --- lib/Target/X86/X86ISelPattern.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/lib/Target/X86/X86ISelPattern.cpp b/lib/Target/X86/X86ISelPattern.cpp index 5913d8b19b4..eef57839895 100644 --- a/lib/Target/X86/X86ISelPattern.cpp +++ b/lib/Target/X86/X86ISelPattern.cpp @@ -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()) {