xref: /llvm-project/llvm/test/CodeGen/ARM/hfa-in-contiguous-registers.ll (revision c24f2171ca2fc8c7e16cd0a3a6c38f63a49caedd)
1*c24f2171SOliver Stannard; RUN: llc < %s | FileCheck %s
2*c24f2171SOliver Stannard
3*c24f2171SOliver Stannardtarget datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-n32-S64"
4*c24f2171SOliver Stannardtarget triple = "armv7-none--gnueabihf"
5*c24f2171SOliver Stannard
6*c24f2171SOliver Stannard%struct.s = type { float, float }
7*c24f2171SOliver Stannard%union.t = type { [4 x float] }
8*c24f2171SOliver Stannard
9*c24f2171SOliver Stannard; Equivalent C code:
10*c24f2171SOliver Stannard; struct s { float a; float b; };
11*c24f2171SOliver Stannard; float foo(float a, double b, struct s c) { return c.a; }
12*c24f2171SOliver Stannard; Argument allocation:
13*c24f2171SOliver Stannard; a -> s0
14*c24f2171SOliver Stannard; b -> d1
15*c24f2171SOliver Stannard; c -> s4, s5
16*c24f2171SOliver Stannard; s1 is unused
17*c24f2171SOliver Stannard; return in s0
18*c24f2171SOliver Stannarddefine float @test1(float %a, double %b, %struct.s %c) {
19*c24f2171SOliver Stannardentry:
20*c24f2171SOliver Stannard; CHECK-LABEL: test1
21*c24f2171SOliver Stannard; CHECK: vmov.f32  s0, s4
22*c24f2171SOliver Stannard; CHECK-NOT: vmov.f32        s0, s1
23*c24f2171SOliver Stannard
24*c24f2171SOliver Stannard  %result = extractvalue %struct.s %c, 0
25*c24f2171SOliver Stannard  ret float %result
26*c24f2171SOliver Stannard}
27*c24f2171SOliver Stannard
28*c24f2171SOliver Stannard; Equivalent C code:
29*c24f2171SOliver Stannard; union t { float a[4] };
30*c24f2171SOliver Stannard; float foo(float a, double b, union s c) { return c.a[0]; }
31*c24f2171SOliver Stannard; Argument allocation:
32*c24f2171SOliver Stannard; a -> s0
33*c24f2171SOliver Stannard; b -> d1
34*c24f2171SOliver Stannard; c -> s4..s7
35*c24f2171SOliver Stannarddefine float @test2(float %a, double %b, %union.t %c) #0 {
36*c24f2171SOliver Stannardentry:
37*c24f2171SOliver Stannard; CHECK-LABEL: test2
38*c24f2171SOliver Stannard; CHECK: vmov.f32  s0, s4
39*c24f2171SOliver Stannard; CHECK-NOT: vmov.f32        s0, s1
40*c24f2171SOliver Stannard
41*c24f2171SOliver Stannard  %result = extractvalue %union.t %c, 0, 0
42*c24f2171SOliver Stannard  ret float %result
43*c24f2171SOliver Stannard}
44*c24f2171SOliver Stannard
45*c24f2171SOliver Stannard; Equivalent C code:
46*c24f2171SOliver Stannard; struct s { float a; float b; };
47*c24f2171SOliver Stannard; float foo(float a, double b, struct s c, float d) { return d; }
48*c24f2171SOliver Stannard; Argument allocation:
49*c24f2171SOliver Stannard; a -> s0
50*c24f2171SOliver Stannard; b -> d1
51*c24f2171SOliver Stannard; c -> s4, s5
52*c24f2171SOliver Stannard; d -> s1
53*c24f2171SOliver Stannard; return in s0
54*c24f2171SOliver Stannarddefine float @test3(float %a, double %b, %struct.s %c, float %d) {
55*c24f2171SOliver Stannardentry:
56*c24f2171SOliver Stannard; CHECK-LABEL: test3
57*c24f2171SOliver Stannard; CHECK: vmov.f32  s0, s1
58*c24f2171SOliver Stannard; CHECK-NOT: vmov.f32        s0, s5
59*c24f2171SOliver Stannard
60*c24f2171SOliver Stannard  ret float %d
61*c24f2171SOliver Stannard}
62*c24f2171SOliver Stannard
63*c24f2171SOliver Stannard; Equivalent C code:
64*c24f2171SOliver Stannard; struct s { float a; float b; };
65*c24f2171SOliver Stannard; float foo(struct s a, struct s b) { return b.b; }
66*c24f2171SOliver Stannard; Argument allocation:
67*c24f2171SOliver Stannard; a -> s0, s1
68*c24f2171SOliver Stannard; b -> s2, s3
69*c24f2171SOliver Stannard; return in s0
70*c24f2171SOliver Stannarddefine float @test4(%struct.s %a, %struct.s %b) {
71*c24f2171SOliver Stannardentry:
72*c24f2171SOliver Stannard; CHECK-LABEL: test4
73*c24f2171SOliver Stannard; CHECK: vmov.f32  s0, s3
74*c24f2171SOliver Stannard
75*c24f2171SOliver Stannard  %result = extractvalue %struct.s %b, 1
76*c24f2171SOliver Stannard  ret float %result
77*c24f2171SOliver Stannard}
78*c24f2171SOliver Stannard
79*c24f2171SOliver Stannard; Equivalent C code:
80*c24f2171SOliver Stannard; struct s { float a; float b; };
81*c24f2171SOliver Stannard; float foo(struct s a, float b, struct s c) { return c.a; }
82*c24f2171SOliver Stannard; Argument allocation:
83*c24f2171SOliver Stannard; a -> s0, s1
84*c24f2171SOliver Stannard; b -> s2
85*c24f2171SOliver Stannard; c -> s3, s4
86*c24f2171SOliver Stannard; return in s0
87*c24f2171SOliver Stannarddefine float @test5(%struct.s %a, float %b, %struct.s %c) {
88*c24f2171SOliver Stannardentry:
89*c24f2171SOliver Stannard; CHECK-LABEL: test5
90*c24f2171SOliver Stannard; CHECK: vmov.f32  s0, s3
91*c24f2171SOliver Stannard
92*c24f2171SOliver Stannard  %result = extractvalue %struct.s %c, 0
93*c24f2171SOliver Stannard  ret float %result
94*c24f2171SOliver Stannard}
95