[llvm-commits] [llvm] r41967 - in /llvm/trunk: include/llvm/ADT/APInt.h include/llvm/ADT/FoldingSet.h include/llvm/Constants.h lib/CodeGen/SelectionDAG/LegalizeDAG.cpp lib/CodeGen/SelectionDAG/SelectionDAG.cpp lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp lib/Support/APInt.cpp lib/Support/FoldingSet.cpp lib/Target/CBackend/CBackend.cpp lib/Target/X86/X86ISelLowering.cpp lib/Target/X86/X86RegisterInfo.cpp lib/Transforms/Scalar/InstructionCombining.cpp lib/VMCore/Constants.cpp
Dale Johannesen
dalej at apple.com
Sat Sep 15 00:16:59 PDT 2007
On Sep 14, 2007, at 11:12 PM, Chris Lattner wrote:
>> @@ -4722,9 +4737,11 @@
>> if (DestVT == MVT::f64) {
>> // do nothing
>> Result = Sub;
>> - } else {
>> + } else if (DestVT == MVT::f32) {
>> // if f32 then cast to f32
>> Result = DAG.getNode(ISD::FP_ROUND, MVT::f32, Sub);
>> + } else if (DestVT == MVT::f80) {
>> + Result = DAG.getNode(ISD::FP_EXTEND, MVT::f80, Sub);
>> }
>
> How about "if DestVT < f32 use round. If DestVT > f64, use
> FP_EXTEND"?
Comparisons other than equality against an enum? Ick. IMO, that
sort of thing
is a bad misuse of enums. Obviously you disagree, we should talk?
>> =====================================================================
>> =
>> ========
>> --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Fri Sep 14
>> 17:26:36 2007
>> @@ -3724,9 +3714,15 @@
>> if (const ConstantSDNode *CSDN = dyn_cast<ConstantSDNode>(this)) {
>> cerr << "<" << CSDN->getValue() << ">";
>> } else if (const ConstantFPSDNode *CSDN =
>> dyn_cast<ConstantFPSDNode>(this)) {
>> - cerr << "<" << (&CSDN->getValueAPF().getSemantics()
>> ==&APFloat::IEEEsingle ?
>> - CSDN->getValueAPF().convertToFloat() :
>> - CSDN->getValueAPF().convertToDouble()) << ">";
>> + if (&CSDN->getValueAPF().getSemantics()==&APFloat::IEEEsingle)
>> + cerr << "<" << CSDN->getValueAPF().convertToFloat() << ">";
>> + else if (&CSDN->getValueAPF().getSemantics()
>> ==&APFloat::IEEEdouble)
>> + cerr << "<" << CSDN->getValueAPF().convertToDouble() << ">";
>> + else {
>> + cerr << "<APFloat(";
>> + CSDN->getValueAPF().convertToAPInt().dump();
>> + cerr << ")>";
>> + }
>
> APFloat really needs a "convertToString" method. :)
Yeah. That would help CBackend too. It's not trivial.
>> =====================================================================
>> =
>> ========
>> --- llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp (original)
>> +++ llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp Fri Sep 14
>> 17:26:36 2007
>> @@ -168,7 +168,11 @@
>> Opc = X86::MOV32_mr;
>> } else if (RC == &X86::GR16_RegClass) {
>> Opc = X86::MOV16_mr;
>> + } else if (RC == &X86::RFP80RegClass) {
>> + Opc = X86::ST_FpP80m; // pops
>> } else if (RC == &X86::RFP64RegClass || RC == &X86::RSTRegClass) {
>> + /// FIXME spilling long double values as 64 bit does not work.
>> + /// We need RST80, unfortunately.
>
> The FP Stack has 80 bit load and store instructions, what is the
> issue? or is it just a todo?
I may be missing something, but I think when we've gotten to the RST
regclass,
we don't know what size the value in the register is, so we'd need to
use the 80-bit
insns for all spills. That's possible, but slower and more
consumptive of stack space.
I haven't looked recently, but IIRC the time difference is significant.
(There's a difference in precision of the result also, but that's
randomly
optimization-dependent anyway.)
More information about the llvm-commits
mailing list