diff options
Diffstat (limited to 'test/CodeGen/ARM/hfa-in-contiguous-registers.ll')
-rw-r--r-- | test/CodeGen/ARM/hfa-in-contiguous-registers.ll | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/test/CodeGen/ARM/hfa-in-contiguous-registers.ll b/test/CodeGen/ARM/hfa-in-contiguous-registers.ll new file mode 100644 index 0000000000..f9ec6e0c64 --- /dev/null +++ b/test/CodeGen/ARM/hfa-in-contiguous-registers.ll @@ -0,0 +1,94 @@ +; RUN: llc < %s | FileCheck %s + +target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-n32-S64" +target triple = "armv7-none--gnueabihf" + +%struct.s = type { float, float } +%union.t = type { [4 x float] } + +; Equivalent C code: +; struct s { float a; float b; }; +; float foo(float a, double b, struct s c) { return c.a; } +; Argument allocation: +; a -> s0 +; b -> d1 +; c -> s4, s5 +; s1 is unused +; return in s0 +define float @test1(float %a, double %b, %struct.s %c) { +entry: +; CHECK-LABEL: test1 +; CHECK: vmov.f32 s0, s4 +; CHECK-NOT: vmov.f32 s0, s1 + + %result = extractvalue %struct.s %c, 0 + ret float %result +} + +; Equivalent C code: +; union t { float a[4] }; +; float foo(float a, double b, union s c) { return c.a[0]; } +; Argument allocation: +; a -> s0 +; b -> d1 +; c -> s4..s7 +define float @test2(float %a, double %b, %union.t %c) #0 { +entry: +; CHECK-LABEL: test2 +; CHECK: vmov.f32 s0, s4 +; CHECK-NOT: vmov.f32 s0, s1 + + %result = extractvalue %union.t %c, 0, 0 + ret float %result +} + +; Equivalent C code: +; struct s { float a; float b; }; +; float foo(float a, double b, struct s c, float d) { return d; } +; Argument allocation: +; a -> s0 +; b -> d1 +; c -> s4, s5 +; d -> s1 +; return in s0 +define float @test3(float %a, double %b, %struct.s %c, float %d) { +entry: +; CHECK-LABEL: test3 +; CHECK: vmov.f32 s0, s1 +; CHECK-NOT: vmov.f32 s0, s5 + + ret float %d +} + +; Equivalent C code: +; struct s { float a; float b; }; +; float foo(struct s a, struct s b) { return b.b; } +; Argument allocation: +; a -> s0, s1 +; b -> s2, s3 +; return in s0 +define float @test4(%struct.s %a, %struct.s %b) { +entry: +; CHECK-LABEL: test4 +; CHECK: vmov.f32 s0, s3 + + %result = extractvalue %struct.s %b, 1 + ret float %result +} + +; Equivalent C code: +; struct s { float a; float b; }; +; float foo(struct s a, float b, struct s c) { return c.a; } +; Argument allocation: +; a -> s0, s1 +; b -> s2 +; c -> s3, s4 +; return in s0 +define float @test5(%struct.s %a, float %b, %struct.s %c) { +entry: +; CHECK-LABEL: test5 +; CHECK: vmov.f32 s0, s3 + + %result = extractvalue %struct.s %c, 0 + ret float %result +} |