parent
884eb3adc3
commit
f474034432
|
@ -158,39 +158,28 @@ SDOperand PPCTargetLowering::LowerOperation(SDOperand Op, SelectionDAG &DAG) {
|
||||||
if (Src.getValueType() == MVT::f32)
|
if (Src.getValueType() == MVT::f32)
|
||||||
Src = DAG.getNode(ISD::FP_EXTEND, MVT::f64, Src);
|
Src = DAG.getNode(ISD::FP_EXTEND, MVT::f64, Src);
|
||||||
|
|
||||||
|
SDOperand Tmp;
|
||||||
switch (Op.getValueType()) {
|
switch (Op.getValueType()) {
|
||||||
default: assert(0 && "Unhandled FP_TO_SINT type in custom expander!");
|
default: assert(0 && "Unhandled FP_TO_SINT type in custom expander!");
|
||||||
case MVT::i32:
|
case MVT::i32:
|
||||||
Op = DAG.getNode(PPCISD::FCTIWZ, MVT::f64, Src);
|
Tmp = DAG.getNode(PPCISD::FCTIWZ, MVT::f64, Src);
|
||||||
break;
|
break;
|
||||||
case MVT::i64:
|
case MVT::i64:
|
||||||
Op = DAG.getNode(PPCISD::FCTIDZ, MVT::f64, Src);
|
Tmp = DAG.getNode(PPCISD::FCTIDZ, MVT::f64, Src);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
int FrameIdx =
|
// Convert the FP value to an int value through memory.
|
||||||
DAG.getMachineFunction().getFrameInfo()->CreateStackObject(8, 8);
|
SDOperand Bits = DAG.getNode(ISD::BIT_CONVERT, MVT::i64, Tmp);
|
||||||
SDOperand FI = DAG.getFrameIndex(FrameIdx, MVT::i32);
|
if (Op.getValueType() == MVT::i32)
|
||||||
SDOperand ST = DAG.getNode(ISD::STORE, MVT::Other, DAG.getEntryNode(),
|
Bits = DAG.getNode(ISD::TRUNCATE, MVT::i32, Bits);
|
||||||
Op, FI, DAG.getSrcValue(0));
|
return Bits;
|
||||||
if (Op.getOpcode() == PPCISD::FCTIDZ) {
|
|
||||||
Op = DAG.getLoad(MVT::i64, ST, FI, DAG.getSrcValue(0));
|
|
||||||
} else {
|
|
||||||
FI = DAG.getNode(ISD::ADD, MVT::i32, FI, DAG.getConstant(4, MVT::i32));
|
|
||||||
Op = DAG.getLoad(MVT::i32, ST, FI, DAG.getSrcValue(0));
|
|
||||||
}
|
|
||||||
return Op;
|
|
||||||
}
|
}
|
||||||
case ISD::SINT_TO_FP: {
|
case ISD::SINT_TO_FP: {
|
||||||
assert(MVT::i64 == Op.getOperand(0).getValueType() &&
|
assert(MVT::i64 == Op.getOperand(0).getValueType() &&
|
||||||
"Unhandled SINT_TO_FP type in custom expander!");
|
"Unhandled SINT_TO_FP type in custom expander!");
|
||||||
int FrameIdx =
|
SDOperand Bits = DAG.getNode(ISD::BIT_CONVERT, MVT::f64, Op.getOperand(0));
|
||||||
DAG.getMachineFunction().getFrameInfo()->CreateStackObject(8, 8);
|
SDOperand FP = DAG.getNode(PPCISD::FCFID, MVT::f64, Bits);
|
||||||
SDOperand FI = DAG.getFrameIndex(FrameIdx, MVT::i32);
|
|
||||||
SDOperand ST = DAG.getNode(ISD::STORE, MVT::Other, DAG.getEntryNode(),
|
|
||||||
Op.getOperand(0), FI, DAG.getSrcValue(0));
|
|
||||||
SDOperand LD = DAG.getLoad(MVT::f64, ST, FI, DAG.getSrcValue(0));
|
|
||||||
SDOperand FP = DAG.getNode(PPCISD::FCFID, MVT::f64, LD);
|
|
||||||
if (MVT::f32 == Op.getValueType())
|
if (MVT::f32 == Op.getValueType())
|
||||||
FP = DAG.getNode(ISD::FP_ROUND, MVT::f32, FP);
|
FP = DAG.getNode(ISD::FP_ROUND, MVT::f32, FP);
|
||||||
return FP;
|
return FP;
|
||||||
|
|
Loading…
Reference in New Issue