Hi,
I'm trying to emit FP_ROUND f64 -> f32 considering a mips target that
only supports single
float point operations. The problem is that f32 is considered legal on this
target but f64 doesn't and the only way I can codegen this instruction is using
setConvertAction(MVT::f64, MVT::f32, Expand), which issues a EmitStackConvert.
What if I want a libcall instead? What should I do? The libcall FROUND_F64_F32
is there, but it seems that it cannot be reached without hacking. What
should I do
to support this? Am I missing something?
Thanks,
Hi Bruno,
I'm trying to emit FP_ROUND f64 -> f32 considering a mips target that
only supports single
float point operations. The problem is that f32 is considered legal on this
target but f64 doesn't and the only way I can codegen this instruction is using
setConvertAction(MVT::f64, MVT::f32, Expand), which issues a EmitStackConvert.
What if I want a libcall instead? What should I do? The libcall FROUND_F64_F32
is there, but it seems that it cannot be reached without hacking. What
should I do
to support this? Am I missing something?
with the new LegalizeTypes infrastructure you could add a method to
DAGTypeLegalizer::SoftenFloatOperand which would turn FP_ROUND into
a libcall (this logic will only be called if FP_ROUND has a legal
return value but an illegal operand [f64] that is converted to an
integer of the same size [i64]).
Ciao,
Duncan.
Seems that it's exactly what I'm looking for!
Thanks Duncan
Hi,
I'm trying to emit FP_ROUND f64 -> f32 considering a mips target that
only supports single
float point operations. The problem is that f32 is considered legal on this
target but f64 doesn't and the only way I can codegen this instruction is using
setConvertAction(MVT::f64, MVT::f32, Expand), which issues a EmitStackConvert.
What if I want a libcall instead? What should I do? The libcall FROUND_F64_F32
is there, but it seems that it cannot be reached without hacking. What
should I do
to support this? Am I missing something?
There really isn't an easy way to achieve this without modifying legalizer. You should add the support in legalizer. By default it would call EmitStackConvert unless the corresponding libcall name is not null. So if the target want to expand it to a libcall, it can issue setLibcallName(RTLIB::FP_ROUND, "__foo").
Evan
Is it possible to handle this with a custom expander?
-Chris
I think don't, If you don't call setConvertAction it considers the return
type legal (f32, which is true) and asserts into LegalizeOp, whether
the action is Custom or Expand.