xref: /llvm-project/llvm/test/CodeGen/ARM/arm-half-promote.ll (revision 25506f48643b65e48c6bd501855589fff8983933)
1; RUN: llc < %s -mtriple=thumbv7s-apple-ios7.0.0 | FileCheck %s
2
3define arm_aapcs_vfpcc { <8 x half>, <8 x half> } @f1() {
4; CHECK-LABEL: _f1
5; CHECK:      vpush   {d8, d9, d10, d11}
6; CHECK-NEXT: vmov.i32        q8, #0x0
7; CHECK-NEXT: vmov.u16        r0, d16[0]
8; CHECK-NEXT: vmov    d4, r0, r0
9; CHECK-NEXT: vmov.u16        r0, d16[1]
10; CHECK-NEXT: vmov    d8, r0, r0
11; CHECK-NEXT: vmov.u16        r0, d16[2]
12; CHECK-NEXT: vmov    d5, r0, r0
13; CHECK-NEXT: vmov.u16        r0, d16[3]
14; CHECK-NEXT: vmov    d9, r0, r0
15; CHECK-NEXT: vmov.u16        r0, d17[0]
16; CHECK-NEXT: vmov    d6, r0, r0
17; CHECK-NEXT: vmov.u16        r0, d17[1]
18; CHECK-NEXT: vmov    d10, r0, r0
19; CHECK-NEXT: vmov.u16        r0, d17[2]
20; CHECK-NEXT: vmov    d7, r0, r0
21; CHECK-NEXT: vmov.u16        r0, d17[3]
22; CHECK-NEXT: vmov    d11, r0, r0
23; CHECK:      vmov.f32        s0, s8
24; CHECK:      vmov.f32        s1, s16
25; CHECK:      vmov.f32        s2, s10
26; CHECK:      vmov.f32        s3, s18
27; CHECK:      vmov.f32        s4, s12
28; CHECK:      vmov.f32        s5, s20
29; CHECK:      vmov.f32        s6, s14
30; CHECK:      vmov.f32        s7, s22
31; CHECK:      vmov.f32        s9, s16
32; CHECK:      vmov.f32        s11, s18
33; CHECK:      vmov.f32        s13, s20
34; CHECK:      vmov.f32        s15, s22
35; CHECK:      vpop    {d8, d9, d10, d11}
36; CHECK-NEXT: bx      lr
37
38  ret { <8 x half>, <8 x half> } zeroinitializer
39}
40
41define swiftcc { <8 x half>, <8 x half> } @f2() {
42; CHECK-LABEL: _f2
43; CHECK:      vpush   {d8, d9, d10, d11}
44; CHECK-NEXT: vmov.i32        q8, #0x0
45; CHECK-NEXT: vmov.u16        r0, d16[0]
46; CHECK-NEXT: vmov    d4, r0, r0
47; CHECK-NEXT: vmov.u16        r0, d16[1]
48; CHECK-NEXT: vmov    d8, r0, r0
49; CHECK-NEXT: vmov.u16        r0, d16[2]
50; CHECK-NEXT: vmov    d5, r0, r0
51; CHECK-NEXT: vmov.u16        r0, d16[3]
52; CHECK-NEXT: vmov    d9, r0, r0
53; CHECK-NEXT: vmov.u16        r0, d17[0]
54; CHECK-NEXT: vmov    d6, r0, r0
55; CHECK-NEXT: vmov.u16        r0, d17[1]
56; CHECK-NEXT: vmov    d10, r0, r0
57; CHECK-NEXT: vmov.u16        r0, d17[2]
58; CHECK-NEXT: vmov    d7, r0, r0
59; CHECK-NEXT: vmov.u16        r0, d17[3]
60; CHECK-NEXT: vmov    d11, r0, r0
61; CHECK:      vmov.f32        s0, s8
62; CHECK:      vmov.f32        s1, s16
63; CHECK:      vmov.f32        s2, s10
64; CHECK:      vmov.f32        s3, s18
65; CHECK:      vmov.f32        s4, s12
66; CHECK:      vmov.f32        s5, s20
67; CHECK:      vmov.f32        s6, s14
68; CHECK:      vmov.f32        s7, s22
69; CHECK:      vmov.f32        s9, s16
70; CHECK:      vmov.f32        s11, s18
71; CHECK:      vmov.f32        s13, s20
72; CHECK:      vmov.f32        s15, s22
73; CHECK-NEXT: vpop    {d8, d9, d10, d11}
74; CHECK-NEXT: bx      lr
75
76  ret { <8 x half>, <8 x half> } zeroinitializer
77}
78
79define fastcc { <8 x half>, <8 x half> } @f3() {
80; CHECK-LABEL: _f3
81; CHECK:      vpush   {d8, d9, d10, d11}
82; CHECK-NEXT: vmov.i32        q8, #0x0
83; CHECK-NEXT: vmov.u16        r0, d16[0]
84; CHECK-NEXT: vmov    d4, r0, r0
85; CHECK-NEXT: vmov.u16        r0, d16[1]
86; CHECK-NEXT: vmov    d8, r0, r0
87; CHECK-NEXT: vmov.u16        r0, d16[2]
88; CHECK-NEXT: vmov    d5, r0, r0
89; CHECK-NEXT: vmov.u16        r0, d16[3]
90; CHECK-NEXT: vmov    d9, r0, r0
91; CHECK-NEXT: vmov.u16        r0, d17[0]
92; CHECK-NEXT: vmov    d6, r0, r0
93; CHECK-NEXT: vmov.u16        r0, d17[1]
94; CHECK-NEXT: vmov    d10, r0, r0
95; CHECK-NEXT: vmov.u16        r0, d17[2]
96; CHECK-NEXT: vmov    d7, r0, r0
97; CHECK-NEXT: vmov.u16        r0, d17[3]
98; CHECK-NEXT: vmov    d11, r0, r0
99; CHECK:      vmov.f32        s0, s8
100; CHECK:      vmov.f32        s1, s16
101; CHECK:      vmov.f32        s2, s10
102; CHECK:      vmov.f32        s3, s18
103; CHECK:      vmov.f32        s4, s12
104; CHECK:      vmov.f32        s5, s20
105; CHECK:      vmov.f32        s6, s14
106; CHECK:      vmov.f32        s7, s22
107; CHECK:      vmov.f32        s9, s16
108; CHECK:      vmov.f32        s11, s18
109; CHECK:      vmov.f32        s13, s20
110; CHECK:      vmov.f32        s15, s22
111; CHECK-NEXT: vpop    {d8, d9, d10, d11}
112; CHECK-NEXT: bx      lr
113
114  ret { <8 x half>, <8 x half> } zeroinitializer
115}
116
117define void @extract_insert(ptr %dst) optnone noinline {
118; CHECK-LABEL: extract_insert:
119; CHECK: vmov.i32 d0, #0x0
120; CHECK: vcvtb.f16.f32 s0, s0
121; CHECK: vmov r1, s0
122; CHECK: strh r1, [r0]
123  %splat.splatinsert = insertelement <1 x half> zeroinitializer, half 0xH0000, i32 0
124  br label %next
125
126next:
127  store <1 x half> %splat.splatinsert, ptr %dst
128  ret void
129}
130