diff options
| author | Strahinja Petrovic <strahinja.petrovic@rt-rk.com> | 2016-08-05 08:47:26 +0000 |
|---|---|---|
| committer | Strahinja Petrovic <strahinja.petrovic@rt-rk.com> | 2016-08-05 08:47:26 +0000 |
| commit | 30e0ce8e9fc4598388fcd3c4d57894036cdd5903 (patch) | |
| tree | ca5c55feadd0372d4ecc959e00f5213d96b8bc1d /llvm/test | |
| parent | 928d7573ddace6e2bd0cd220d661c3e8cbae128e (diff) | |
| download | bcm5719-llvm-30e0ce8e9fc4598388fcd3c4d57894036cdd5903.tar.gz bcm5719-llvm-30e0ce8e9fc4598388fcd3c4d57894036cdd5903.zip | |
[PowerPC] fix passing long double arguments to function (soft-float)
This patch fixes passing long double type arguments to function in
soft float mode. If there is less than 4 argument registers free
(long double type is mapped in 4 gpr registers in soft float mode)
long double type argument must be passed through stack.
Differential Revision: https://reviews.llvm.org/D20114.
llvm-svn: 277804
Diffstat (limited to 'llvm/test')
| -rw-r--r-- | llvm/test/CodeGen/PowerPC/ppc32-skip-regs.ll | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/PowerPC/ppc32-skip-regs.ll b/llvm/test/CodeGen/PowerPC/ppc32-skip-regs.ll new file mode 100644 index 00000000000..4acfd3c5ca0 --- /dev/null +++ b/llvm/test/CodeGen/PowerPC/ppc32-skip-regs.ll @@ -0,0 +1,26 @@ +; RUN: llc -O2 -mtriple=powerpc-unknown-linux-gnu < %s | FileCheck %s + +target datalayout = "E-m:e-p:32:32-i64:64-n32" +target triple = "powerpc-buildroot-linux-gnu" + +@x = global ppc_fp128 0xM3FF00000000000000000000000000000, align 16 +@.str = private unnamed_addr constant [9 x i8] c"%Lf %Lf\0A\00", align 1 + +define void @foo() #0 { +entry: + %0 = load ppc_fp128, ppc_fp128* @x, align 16 + %call = tail call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i32 0, i32 0), ppc_fp128 %0, ppc_fp128 %0) + ret void +} +; Do not put second argument of function in r8 register, because there is no enough registers +; left for long double type (4 registers in soft float mode). Instead in r8 register this +; argument put on stack. +; CHECK-NOT: mr 8, 4 +; CHECK: stw 7, 20(1) +; CHECK: stw 6, 16(1) +; CHECK: stw 5, 12(1) +; CHECK: stw 4, 8(1) + +declare i32 @printf(i8* nocapture readonly, ...) + +attributes #0 = { "use-soft-float"="true" } |

