[llvm-commits] [llvm-gcc][arm][patch] Lower function signatures a bit more
Rafael Espindola
espindola at google.com
Thu Sep 9 14:34:52 PDT 2010
> I haven't reviewed the patch, but in principle this sounds like a great idea!
>
> What IR does:
> double foo(double X, double Y) { return X+Y; }
>
> get lowered into, and what ARM code ends up generated?
With the patch the generated IL is
----------------------------------------------------------------------
define double @foo(i32 %X.0, i32 %X.1, i32 %Y.0, i32 %Y.1) nounwind
readnone optsize {
entry:
%tmp17 = zext i32 %X.0 to i64
%tmp12 = zext i32 %X.1 to i64
%tmp13 = shl i64 %tmp12, 32
%ins15 = or i64 %tmp13, %tmp17
%tmp6 = zext i32 %Y.0 to i64
%tmp3 = zext i32 %Y.1 to i64
%tmp4 = shl i64 %tmp3, 32
%ins = or i64 %tmp4, %tmp6
%tmp10 = bitcast i64 %ins15 to double
%tmp2 = bitcast i64 %ins to double
%0 = fadd double %tmp10, %tmp2
ret double %0
}
---------------------------------------------------------------------
and the asm is
----------------------------------------------------------------
foo:
vmov d0, r2, r3
vmov d1, r0, r1
vadd.f64 d0, d1, d0
vmov r0, r1, d0
bx lr
----------------------------------------------------------------
or with -mfloat-abi=soft
-------------------------------------------------------------
foo:
stmdb sp!, {r11, lr}
bl __adddf3
ldmia sp!, {r11, pc}
-------------------------------------------------------------
Currently we get a more compact but less explicit IL:
----------------------------------------
define double @foo(double %X, double %Y) nounwind readnone optsize {
entry:
%0 = fadd double %X, %Y
ret double %0
}
----------------------------------------
And exactly the same assembly.
> -Chris
Cheers,
--
Rafael Ávila de Espíndola
More information about the llvm-commits
mailing list