From: Chris Lattner Date: Mon, 2 Feb 2004 18:56:30 +0000 (+0000) Subject: Codegen -0.0 correctly. Do not use fldz! This is another -0.0 == +0.0 problem,... X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=af70362e405d58afc7a69036ed93c421abf9e8e8;p=oota-llvm.git Codegen -0.0 correctly. Do not use fldz! This is another -0.0 == +0.0 problem, arg. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11070 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/X86/InstSelectSimple.cpp b/lib/Target/X86/InstSelectSimple.cpp index 5135385ddff..fd4c44f99e0 100644 --- a/lib/Target/X86/InstSelectSimple.cpp +++ b/lib/Target/X86/InstSelectSimple.cpp @@ -438,10 +438,9 @@ void ISel::copyConstantToRegister(MachineBasicBlock *MBB, BMI(MBB, IP, IntegralOpcodeTab[Class], 1, R).addZImm(CI->getRawValue()); } } else if (ConstantFP *CFP = dyn_cast(C)) { - double Value = CFP->getValue(); - if (Value == +0.0) + if (CFP->isExactlyValue(+0.0)) BMI(MBB, IP, X86::FLD0, 0, R); - else if (Value == +1.0) + else if (CFP->isExactlyValue(+1.0)) BMI(MBB, IP, X86::FLD1, 0, R); else { // Otherwise we need to spill the constant to memory... @@ -1212,7 +1211,7 @@ void ISel::emitSimpleBinaryOperation(MachineBasicBlock *MBB, // sub 0, X -> neg X if (OperatorClass == 1 && Class != cLong) - if (ConstantInt *CI = dyn_cast(Op0)) + if (ConstantInt *CI = dyn_cast(Op0)) { if (CI->isNullValue()) { unsigned op1Reg = getReg(Op1, MBB, IP); switch (Class) { @@ -1228,6 +1227,7 @@ void ISel::emitSimpleBinaryOperation(MachineBasicBlock *MBB, return; } } + } if (!isa(Op1) || Class == cLong) { static const unsigned OpcodeTab[][4] = { diff --git a/lib/Target/X86/X86ISelSimple.cpp b/lib/Target/X86/X86ISelSimple.cpp index 5135385ddff..fd4c44f99e0 100644 --- a/lib/Target/X86/X86ISelSimple.cpp +++ b/lib/Target/X86/X86ISelSimple.cpp @@ -438,10 +438,9 @@ void ISel::copyConstantToRegister(MachineBasicBlock *MBB, BMI(MBB, IP, IntegralOpcodeTab[Class], 1, R).addZImm(CI->getRawValue()); } } else if (ConstantFP *CFP = dyn_cast(C)) { - double Value = CFP->getValue(); - if (Value == +0.0) + if (CFP->isExactlyValue(+0.0)) BMI(MBB, IP, X86::FLD0, 0, R); - else if (Value == +1.0) + else if (CFP->isExactlyValue(+1.0)) BMI(MBB, IP, X86::FLD1, 0, R); else { // Otherwise we need to spill the constant to memory... @@ -1212,7 +1211,7 @@ void ISel::emitSimpleBinaryOperation(MachineBasicBlock *MBB, // sub 0, X -> neg X if (OperatorClass == 1 && Class != cLong) - if (ConstantInt *CI = dyn_cast(Op0)) + if (ConstantInt *CI = dyn_cast(Op0)) { if (CI->isNullValue()) { unsigned op1Reg = getReg(Op1, MBB, IP); switch (Class) { @@ -1228,6 +1227,7 @@ void ISel::emitSimpleBinaryOperation(MachineBasicBlock *MBB, return; } } + } if (!isa(Op1) || Class == cLong) { static const unsigned OpcodeTab[][4] = {