From c0354c904bfcf8f627d9d0aecc9845cc387d88dd Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 13 Dec 2004 17:23:11 +0000 Subject: [PATCH] Set the rounding mode for the X86 FPU to 64-bits instead of 80-bits. We don't support long double anyway, and this gives us FP results closer to other targets. This also speeds up 179.art from 41.4s to 18.32s, by eliminating a problem with extra precision that causes an FP == comparison to fail (leading to extra loop iterations). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18895 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86ISelSimple.cpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/lib/Target/X86/X86ISelSimple.cpp b/lib/Target/X86/X86ISelSimple.cpp index bb0fb826220..ed93101ecb7 100644 --- a/lib/Target/X86/X86ISelSimple.cpp +++ b/lib/Target/X86/X86ISelSimple.cpp @@ -115,6 +115,10 @@ namespace { // Copy incoming arguments off of the stack... LoadArgumentsToVirtualRegs(Fn); + // If this is main, emit special code. + if (Fn.hasExternalLinkage() && Fn.getName() == "main") + EmitSpecialCodeForMain(); + // Instruction select everything except PHI nodes visit(Fn); @@ -136,6 +140,10 @@ namespace { return "X86 Simple Instruction Selection"; } + /// EmitSpecialCodeForMain - Emit any code that needs to be executed only in + /// the main function. + void EmitSpecialCodeForMain(); + /// visitBasicBlock - This method is called when we are visiting a new basic /// block. This simply creates a new MachineBasicBlock to emit code into /// and adds it to the current MachineFunction. Subsequent visit* for @@ -650,6 +658,20 @@ void X86ISel::LoadArgumentsToVirtualRegs(Function &Fn) { VarArgsFrameIndex = MFI->CreateFixedObject(1, ArgOffset); } +/// EmitSpecialCodeForMain - Emit any code that needs to be executed only in +/// the main function. +void X86ISel::EmitSpecialCodeForMain() { + // Switch the FPU to 64-bit precision mode for better compatibility and speed. + int CWFrameIdx = F->getFrameInfo()->CreateStackObject(2, 2); + addFrameReference(BuildMI(BB, X86::FNSTCW16m, 4), CWFrameIdx); + + // Set the high part to be 64-bit precision. + addFrameReference(BuildMI(BB, X86::MOV8mi, 5), + CWFrameIdx, 1).addImm(2); + + // Reload the modified control word now. + addFrameReference(BuildMI(BB, X86::FLDCW16m, 4), CWFrameIdx); +} /// SelectPHINodes - Insert machine code to generate phis. This is tricky /// because we have to generate our sources into the source basic blocks, not -- 2.11.0