xref: /llvm-project/llvm/test/CodeGen/ARM/llvm.frexp.ll (revision 52864d9c7bd49ca41191bd34fcee47f61cfea743)
1160d7227SMatt Arsenault; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2160d7227SMatt Arsenault; RUN: llc -mtriple=thumbv7-unknown-linux < %s | FileCheck -check-prefixes=CHECK %s
3160d7227SMatt Arsenault
4160d7227SMatt Arsenaultdefine { half, i32 } @test_frexp_f16_i32(half %a) {
5160d7227SMatt Arsenault; CHECK-LABEL: test_frexp_f16_i32:
6160d7227SMatt Arsenault; CHECK:       @ %bb.0:
7160d7227SMatt Arsenault; CHECK-NEXT:    push {r7, lr}
8160d7227SMatt Arsenault; CHECK-NEXT:    sub sp, #8
9160d7227SMatt Arsenault; CHECK-NEXT:    bl __gnu_h2f_ieee
10160d7227SMatt Arsenault; CHECK-NEXT:    add r1, sp, #4
11160d7227SMatt Arsenault; CHECK-NEXT:    bl frexpf
12160d7227SMatt Arsenault; CHECK-NEXT:    bl __gnu_f2h_ieee
13160d7227SMatt Arsenault; CHECK-NEXT:    ldr r1, [sp, #4]
14160d7227SMatt Arsenault; CHECK-NEXT:    add sp, #8
15160d7227SMatt Arsenault; CHECK-NEXT:    pop {r7, pc}
16160d7227SMatt Arsenault  %result = call { half, i32 } @llvm.frexp.f16.i32(half %a)
17160d7227SMatt Arsenault  ret { half, i32 } %result
18160d7227SMatt Arsenault}
19160d7227SMatt Arsenault
20160d7227SMatt Arsenaultdefine half @test_frexp_f16_i32_only_use_fract(half %a) {
21160d7227SMatt Arsenault; CHECK-LABEL: test_frexp_f16_i32_only_use_fract:
22160d7227SMatt Arsenault; CHECK:       @ %bb.0:
23160d7227SMatt Arsenault; CHECK-NEXT:    push {r7, lr}
24160d7227SMatt Arsenault; CHECK-NEXT:    sub sp, #8
25160d7227SMatt Arsenault; CHECK-NEXT:    bl __gnu_h2f_ieee
26160d7227SMatt Arsenault; CHECK-NEXT:    add r1, sp, #4
27160d7227SMatt Arsenault; CHECK-NEXT:    bl frexpf
28160d7227SMatt Arsenault; CHECK-NEXT:    bl __gnu_f2h_ieee
29160d7227SMatt Arsenault; CHECK-NEXT:    add sp, #8
30160d7227SMatt Arsenault; CHECK-NEXT:    pop {r7, pc}
31160d7227SMatt Arsenault  %result = call { half, i32 } @llvm.frexp.f16.i32(half %a)
32160d7227SMatt Arsenault  %result.0 = extractvalue { half, i32 } %result, 0
33160d7227SMatt Arsenault  ret half %result.0
34160d7227SMatt Arsenault}
35160d7227SMatt Arsenault
36160d7227SMatt Arsenaultdefine i32 @test_frexp_f16_i32_only_use_exp(half %a) {
37160d7227SMatt Arsenault; CHECK-LABEL: test_frexp_f16_i32_only_use_exp:
38160d7227SMatt Arsenault; CHECK:       @ %bb.0:
39160d7227SMatt Arsenault; CHECK-NEXT:    push {r7, lr}
40160d7227SMatt Arsenault; CHECK-NEXT:    sub sp, #8
41160d7227SMatt Arsenault; CHECK-NEXT:    bl __gnu_h2f_ieee
42160d7227SMatt Arsenault; CHECK-NEXT:    add r1, sp, #4
43160d7227SMatt Arsenault; CHECK-NEXT:    bl frexpf
44160d7227SMatt Arsenault; CHECK-NEXT:    ldr r0, [sp, #4]
45160d7227SMatt Arsenault; CHECK-NEXT:    add sp, #8
46160d7227SMatt Arsenault; CHECK-NEXT:    pop {r7, pc}
47160d7227SMatt Arsenault  %result = call { half, i32 } @llvm.frexp.f16.i32(half %a)
48160d7227SMatt Arsenault  %result.0 = extractvalue { half, i32 } %result, 1
49160d7227SMatt Arsenault  ret i32 %result.0
50160d7227SMatt Arsenault}
51160d7227SMatt Arsenault
52160d7227SMatt Arsenaultdefine { <2 x half>, <2 x i32> } @test_frexp_v2f16_v2i32(<2 x half> %a) {
53160d7227SMatt Arsenault; CHECK-LABEL: test_frexp_v2f16_v2i32:
54160d7227SMatt Arsenault; CHECK:       @ %bb.0:
55*52864d9cSHarald van Dijk; CHECK-NEXT:    push {r4, r5, r6, lr}
56160d7227SMatt Arsenault; CHECK-NEXT:    vpush {d8}
57*52864d9cSHarald van Dijk; CHECK-NEXT:    sub sp, #16
58160d7227SMatt Arsenault; CHECK-NEXT:    mov r4, r1
59160d7227SMatt Arsenault; CHECK-NEXT:    bl __gnu_h2f_ieee
60*52864d9cSHarald van Dijk; CHECK-NEXT:    add r5, sp, #4
61*52864d9cSHarald van Dijk; CHECK-NEXT:    mov r1, r5
62*52864d9cSHarald van Dijk; CHECK-NEXT:    bl frexpf
63*52864d9cSHarald van Dijk; CHECK-NEXT:    vld1.32 {d8[0]}, [r5:32]
64*52864d9cSHarald van Dijk; CHECK-NEXT:    mov r6, r0
65160d7227SMatt Arsenault; CHECK-NEXT:    mov r0, r4
66160d7227SMatt Arsenault; CHECK-NEXT:    bl __gnu_h2f_ieee
67*52864d9cSHarald van Dijk; CHECK-NEXT:    add r4, sp, #8
68160d7227SMatt Arsenault; CHECK-NEXT:    mov r1, r4
69160d7227SMatt Arsenault; CHECK-NEXT:    bl frexpf
70160d7227SMatt Arsenault; CHECK-NEXT:    bl __gnu_f2h_ieee
71*52864d9cSHarald van Dijk; CHECK-NEXT:    strh.w r0, [sp, #14]
72160d7227SMatt Arsenault; CHECK-NEXT:    mov r0, r6
73160d7227SMatt Arsenault; CHECK-NEXT:    bl __gnu_f2h_ieee
74*52864d9cSHarald van Dijk; CHECK-NEXT:    strh.w r0, [sp, #12]
75*52864d9cSHarald van Dijk; CHECK-NEXT:    add r0, sp, #12
76*52864d9cSHarald van Dijk; CHECK-NEXT:    vld1.32 {d8[1]}, [r4:32]
77*52864d9cSHarald van Dijk; CHECK-NEXT:    vld1.32 {d16[0]}, [r0:32]
78160d7227SMatt Arsenault; CHECK-NEXT:    vmov r2, r3, d8
79*52864d9cSHarald van Dijk; CHECK-NEXT:    vmovl.u16 q8, d16
80*52864d9cSHarald van Dijk; CHECK-NEXT:    vmov.32 r0, d16[0]
81*52864d9cSHarald van Dijk; CHECK-NEXT:    vmov.32 r1, d16[1]
82*52864d9cSHarald van Dijk; CHECK-NEXT:    add sp, #16
83160d7227SMatt Arsenault; CHECK-NEXT:    vpop {d8}
84*52864d9cSHarald van Dijk; CHECK-NEXT:    pop {r4, r5, r6, pc}
85160d7227SMatt Arsenault  %result = call { <2 x half>, <2 x i32> } @llvm.frexp.v2f16.v2i32(<2 x half> %a)
86160d7227SMatt Arsenault  ret { <2 x half>, <2 x i32> } %result
87160d7227SMatt Arsenault}
88160d7227SMatt Arsenault
89160d7227SMatt Arsenaultdefine <2 x half> @test_frexp_v2f16_v2i32_only_use_fract(<2 x half> %a) {
90160d7227SMatt Arsenault; CHECK-LABEL: test_frexp_v2f16_v2i32_only_use_fract:
91160d7227SMatt Arsenault; CHECK:       @ %bb.0:
92*52864d9cSHarald van Dijk; CHECK-NEXT:    push {r4, lr}
93*52864d9cSHarald van Dijk; CHECK-NEXT:    sub sp, #16
94*52864d9cSHarald van Dijk; CHECK-NEXT:    mov r4, r0
95*52864d9cSHarald van Dijk; CHECK-NEXT:    mov r0, r1
96160d7227SMatt Arsenault; CHECK-NEXT:    bl __gnu_h2f_ieee
97*52864d9cSHarald van Dijk; CHECK-NEXT:    add r1, sp, #8
98160d7227SMatt Arsenault; CHECK-NEXT:    bl frexpf
99160d7227SMatt Arsenault; CHECK-NEXT:    bl __gnu_f2h_ieee
100*52864d9cSHarald van Dijk; CHECK-NEXT:    strh.w r0, [sp, #14]
101160d7227SMatt Arsenault; CHECK-NEXT:    mov r0, r4
102160d7227SMatt Arsenault; CHECK-NEXT:    bl __gnu_h2f_ieee
103160d7227SMatt Arsenault; CHECK-NEXT:    add r1, sp, #4
104160d7227SMatt Arsenault; CHECK-NEXT:    bl frexpf
105160d7227SMatt Arsenault; CHECK-NEXT:    bl __gnu_f2h_ieee
106*52864d9cSHarald van Dijk; CHECK-NEXT:    strh.w r0, [sp, #12]
107*52864d9cSHarald van Dijk; CHECK-NEXT:    add r0, sp, #12
108*52864d9cSHarald van Dijk; CHECK-NEXT:    vld1.32 {d16[0]}, [r0:32]
109*52864d9cSHarald van Dijk; CHECK-NEXT:    vmovl.u16 q8, d16
110*52864d9cSHarald van Dijk; CHECK-NEXT:    vmov.32 r0, d16[0]
111*52864d9cSHarald van Dijk; CHECK-NEXT:    vmov.32 r1, d16[1]
112*52864d9cSHarald van Dijk; CHECK-NEXT:    add sp, #16
113*52864d9cSHarald van Dijk; CHECK-NEXT:    pop {r4, pc}
114160d7227SMatt Arsenault  %result = call { <2 x half>, <2 x i32> } @llvm.frexp.v2f16.v2i32(<2 x half> %a)
115160d7227SMatt Arsenault  %result.0 = extractvalue { <2 x half>, <2 x i32> } %result, 0
116160d7227SMatt Arsenault  ret <2 x half> %result.0
117160d7227SMatt Arsenault}
118160d7227SMatt Arsenault
119160d7227SMatt Arsenaultdefine <2 x i32> @test_frexp_v2f16_v2i32_only_use_exp(<2 x half> %a) {
120160d7227SMatt Arsenault; CHECK-LABEL: test_frexp_v2f16_v2i32_only_use_exp:
121160d7227SMatt Arsenault; CHECK:       @ %bb.0:
122160d7227SMatt Arsenault; CHECK-NEXT:    push {r4, r5, r7, lr}
123160d7227SMatt Arsenault; CHECK-NEXT:    sub sp, #8
124160d7227SMatt Arsenault; CHECK-NEXT:    mov r4, r1
125160d7227SMatt Arsenault; CHECK-NEXT:    bl __gnu_h2f_ieee
126160d7227SMatt Arsenault; CHECK-NEXT:    mov r5, sp
127160d7227SMatt Arsenault; CHECK-NEXT:    mov r1, r5
128160d7227SMatt Arsenault; CHECK-NEXT:    bl frexpf
129160d7227SMatt Arsenault; CHECK-NEXT:    mov r0, r4
130160d7227SMatt Arsenault; CHECK-NEXT:    bl __gnu_h2f_ieee
131160d7227SMatt Arsenault; CHECK-NEXT:    add r4, sp, #4
132160d7227SMatt Arsenault; CHECK-NEXT:    mov r1, r4
133160d7227SMatt Arsenault; CHECK-NEXT:    bl frexpf
134160d7227SMatt Arsenault; CHECK-NEXT:    vld1.32 {d16[0]}, [r5:32]
135160d7227SMatt Arsenault; CHECK-NEXT:    vld1.32 {d16[1]}, [r4:32]
136160d7227SMatt Arsenault; CHECK-NEXT:    vmov r0, r1, d16
137160d7227SMatt Arsenault; CHECK-NEXT:    add sp, #8
138160d7227SMatt Arsenault; CHECK-NEXT:    pop {r4, r5, r7, pc}
139160d7227SMatt Arsenault  %result = call { <2 x half>, <2 x i32> } @llvm.frexp.v2f16.v2i32(<2 x half> %a)
140160d7227SMatt Arsenault  %result.1 = extractvalue { <2 x half>, <2 x i32> } %result, 1
141160d7227SMatt Arsenault  ret <2 x i32> %result.1
142160d7227SMatt Arsenault}
143160d7227SMatt Arsenault
144160d7227SMatt Arsenaultdefine { float, i32 } @test_frexp_f32_i32(float %a) {
145160d7227SMatt Arsenault; CHECK-LABEL: test_frexp_f32_i32:
146160d7227SMatt Arsenault; CHECK:       @ %bb.0:
147160d7227SMatt Arsenault; CHECK-NEXT:    push {r7, lr}
148160d7227SMatt Arsenault; CHECK-NEXT:    sub sp, #8
149160d7227SMatt Arsenault; CHECK-NEXT:    add r1, sp, #4
150160d7227SMatt Arsenault; CHECK-NEXT:    bl frexpf
151160d7227SMatt Arsenault; CHECK-NEXT:    ldr r1, [sp, #4]
152160d7227SMatt Arsenault; CHECK-NEXT:    add sp, #8
153160d7227SMatt Arsenault; CHECK-NEXT:    pop {r7, pc}
154160d7227SMatt Arsenault  %result = call { float, i32 } @llvm.frexp.f32.i32(float %a)
155160d7227SMatt Arsenault  ret { float, i32 } %result
156160d7227SMatt Arsenault}
157160d7227SMatt Arsenault
158160d7227SMatt Arsenaultdefine { float, i32 } @test_frexp_f32_i32_tailcall(float %a) {
159160d7227SMatt Arsenault; CHECK-LABEL: test_frexp_f32_i32_tailcall:
160160d7227SMatt Arsenault; CHECK:       @ %bb.0:
161160d7227SMatt Arsenault; CHECK-NEXT:    push {r7, lr}
162160d7227SMatt Arsenault; CHECK-NEXT:    sub sp, #8
163160d7227SMatt Arsenault; CHECK-NEXT:    add r1, sp, #4
164160d7227SMatt Arsenault; CHECK-NEXT:    bl frexpf
165160d7227SMatt Arsenault; CHECK-NEXT:    ldr r1, [sp, #4]
166160d7227SMatt Arsenault; CHECK-NEXT:    add sp, #8
167160d7227SMatt Arsenault; CHECK-NEXT:    pop {r7, pc}
168160d7227SMatt Arsenault  %result = tail call { float, i32 } @llvm.frexp.f32.i32(float %a)
169160d7227SMatt Arsenault  ret { float, i32 } %result
170160d7227SMatt Arsenault}
171160d7227SMatt Arsenault
172160d7227SMatt Arsenaultdefine float @test_frexp_f32_i32_only_use_fract(float %a) {
173160d7227SMatt Arsenault; CHECK-LABEL: test_frexp_f32_i32_only_use_fract:
174160d7227SMatt Arsenault; CHECK:       @ %bb.0:
175160d7227SMatt Arsenault; CHECK-NEXT:    push {r7, lr}
176160d7227SMatt Arsenault; CHECK-NEXT:    sub sp, #8
177160d7227SMatt Arsenault; CHECK-NEXT:    add r1, sp, #4
178160d7227SMatt Arsenault; CHECK-NEXT:    bl frexpf
179160d7227SMatt Arsenault; CHECK-NEXT:    add sp, #8
180160d7227SMatt Arsenault; CHECK-NEXT:    pop {r7, pc}
181160d7227SMatt Arsenault  %result = call { float, i32 } @llvm.frexp.f32.i32(float %a)
182160d7227SMatt Arsenault  %result.0 = extractvalue { float, i32 } %result, 0
183160d7227SMatt Arsenault  ret float %result.0
184160d7227SMatt Arsenault}
185160d7227SMatt Arsenault
186160d7227SMatt Arsenaultdefine i32 @test_frexp_f32_i32_only_use_exp(float %a) {
187160d7227SMatt Arsenault; CHECK-LABEL: test_frexp_f32_i32_only_use_exp:
188160d7227SMatt Arsenault; CHECK:       @ %bb.0:
189160d7227SMatt Arsenault; CHECK-NEXT:    push {r7, lr}
190160d7227SMatt Arsenault; CHECK-NEXT:    sub sp, #8
191160d7227SMatt Arsenault; CHECK-NEXT:    add r1, sp, #4
192160d7227SMatt Arsenault; CHECK-NEXT:    bl frexpf
193160d7227SMatt Arsenault; CHECK-NEXT:    ldr r0, [sp, #4]
194160d7227SMatt Arsenault; CHECK-NEXT:    add sp, #8
195160d7227SMatt Arsenault; CHECK-NEXT:    pop {r7, pc}
196160d7227SMatt Arsenault  %result = call { float, i32 } @llvm.frexp.f32.i32(float %a)
197160d7227SMatt Arsenault  %result.0 = extractvalue { float, i32 } %result, 1
198160d7227SMatt Arsenault  ret i32 %result.0
199160d7227SMatt Arsenault}
200160d7227SMatt Arsenault
201160d7227SMatt Arsenaultdefine { <2 x float>, <2 x i32> } @test_frexp_v2f32_v2i32(<2 x float> %a) {
202160d7227SMatt Arsenault; CHECK-LABEL: test_frexp_v2f32_v2i32:
203160d7227SMatt Arsenault; CHECK:       @ %bb.0:
204160d7227SMatt Arsenault; CHECK-NEXT:    push {r4, r5, r7, lr}
205160d7227SMatt Arsenault; CHECK-NEXT:    vpush {d8}
206160d7227SMatt Arsenault; CHECK-NEXT:    sub sp, #8
207160d7227SMatt Arsenault; CHECK-NEXT:    vmov d8, r0, r1
208160d7227SMatt Arsenault; CHECK-NEXT:    add r4, sp, #4
209160d7227SMatt Arsenault; CHECK-NEXT:    vmov r0, s16
210160d7227SMatt Arsenault; CHECK-NEXT:    mov r1, r4
211160d7227SMatt Arsenault; CHECK-NEXT:    bl frexpf
212160d7227SMatt Arsenault; CHECK-NEXT:    mov r5, r0
213160d7227SMatt Arsenault; CHECK-NEXT:    vmov r0, s17
214160d7227SMatt Arsenault; CHECK-NEXT:    vld1.32 {d8[0]}, [r4:32]
215160d7227SMatt Arsenault; CHECK-NEXT:    mov r4, sp
216160d7227SMatt Arsenault; CHECK-NEXT:    mov r1, r4
217160d7227SMatt Arsenault; CHECK-NEXT:    bl frexpf
218160d7227SMatt Arsenault; CHECK-NEXT:    vld1.32 {d8[1]}, [r4:32]
219160d7227SMatt Arsenault; CHECK-NEXT:    mov r1, r0
220160d7227SMatt Arsenault; CHECK-NEXT:    mov r0, r5
221160d7227SMatt Arsenault; CHECK-NEXT:    vmov r2, r3, d8
222160d7227SMatt Arsenault; CHECK-NEXT:    add sp, #8
223160d7227SMatt Arsenault; CHECK-NEXT:    vpop {d8}
224160d7227SMatt Arsenault; CHECK-NEXT:    pop {r4, r5, r7, pc}
225160d7227SMatt Arsenault  %result = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> %a)
226160d7227SMatt Arsenault  ret { <2 x float>, <2 x i32> } %result
227160d7227SMatt Arsenault}
228160d7227SMatt Arsenault
229160d7227SMatt Arsenaultdefine <2 x float> @test_frexp_v2f32_v2i32_only_use_fract(<2 x float> %a) {
230160d7227SMatt Arsenault; CHECK-LABEL: test_frexp_v2f32_v2i32_only_use_fract:
231160d7227SMatt Arsenault; CHECK:       @ %bb.0:
232160d7227SMatt Arsenault; CHECK-NEXT:    push {r4, lr}
233160d7227SMatt Arsenault; CHECK-NEXT:    vpush {d8}
234160d7227SMatt Arsenault; CHECK-NEXT:    sub sp, #8
235160d7227SMatt Arsenault; CHECK-NEXT:    vmov d8, r0, r1
236160d7227SMatt Arsenault; CHECK-NEXT:    mov r1, sp
237160d7227SMatt Arsenault; CHECK-NEXT:    vmov r0, s17
238160d7227SMatt Arsenault; CHECK-NEXT:    bl frexpf
239160d7227SMatt Arsenault; CHECK-NEXT:    mov r4, r0
240160d7227SMatt Arsenault; CHECK-NEXT:    vmov r0, s16
241160d7227SMatt Arsenault; CHECK-NEXT:    add r1, sp, #4
242160d7227SMatt Arsenault; CHECK-NEXT:    bl frexpf
243160d7227SMatt Arsenault; CHECK-NEXT:    mov r1, r4
244160d7227SMatt Arsenault; CHECK-NEXT:    add sp, #8
245160d7227SMatt Arsenault; CHECK-NEXT:    vpop {d8}
246160d7227SMatt Arsenault; CHECK-NEXT:    pop {r4, pc}
247160d7227SMatt Arsenault  %result = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> %a)
248160d7227SMatt Arsenault  %result.0 = extractvalue { <2 x float>, <2 x i32> } %result, 0
249160d7227SMatt Arsenault  ret <2 x float> %result.0
250160d7227SMatt Arsenault}
251160d7227SMatt Arsenault
252160d7227SMatt Arsenaultdefine <2 x i32> @test_frexp_v2f32_v2i32_only_use_exp(<2 x float> %a) {
253160d7227SMatt Arsenault; CHECK-LABEL: test_frexp_v2f32_v2i32_only_use_exp:
254160d7227SMatt Arsenault; CHECK:       @ %bb.0:
255160d7227SMatt Arsenault; CHECK-NEXT:    push {r4, r5, r7, lr}
256160d7227SMatt Arsenault; CHECK-NEXT:    vpush {d8}
257160d7227SMatt Arsenault; CHECK-NEXT:    sub sp, #8
258160d7227SMatt Arsenault; CHECK-NEXT:    vmov d8, r0, r1
259160d7227SMatt Arsenault; CHECK-NEXT:    add r4, sp, #4
260160d7227SMatt Arsenault; CHECK-NEXT:    vmov r0, s16
261160d7227SMatt Arsenault; CHECK-NEXT:    mov r1, r4
262160d7227SMatt Arsenault; CHECK-NEXT:    bl frexpf
263160d7227SMatt Arsenault; CHECK-NEXT:    vmov r0, s17
264160d7227SMatt Arsenault; CHECK-NEXT:    mov r5, sp
265160d7227SMatt Arsenault; CHECK-NEXT:    mov r1, r5
266160d7227SMatt Arsenault; CHECK-NEXT:    bl frexpf
267160d7227SMatt Arsenault; CHECK-NEXT:    vld1.32 {d16[0]}, [r4:32]
268160d7227SMatt Arsenault; CHECK-NEXT:    vld1.32 {d16[1]}, [r5:32]
269160d7227SMatt Arsenault; CHECK-NEXT:    vmov r0, r1, d16
270160d7227SMatt Arsenault; CHECK-NEXT:    add sp, #8
271160d7227SMatt Arsenault; CHECK-NEXT:    vpop {d8}
272160d7227SMatt Arsenault; CHECK-NEXT:    pop {r4, r5, r7, pc}
273160d7227SMatt Arsenault  %result = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> %a)
274160d7227SMatt Arsenault  %result.1 = extractvalue { <2 x float>, <2 x i32> } %result, 1
275160d7227SMatt Arsenault  ret <2 x i32> %result.1
276160d7227SMatt Arsenault}
277160d7227SMatt Arsenault
278160d7227SMatt Arsenaultdefine { <4 x float>, <4 x i32> } @test_frexp_v4f32_v4i32(<4 x float> %a) {
279160d7227SMatt Arsenault; CHECK-LABEL: test_frexp_v4f32_v4i32:
280160d7227SMatt Arsenault; CHECK:       @ %bb.0:
281160d7227SMatt Arsenault; CHECK-NEXT:    push.w {r4, r5, r6, r7, r8, r9, lr}
282160d7227SMatt Arsenault; CHECK-NEXT:    sub sp, #4
283160d7227SMatt Arsenault; CHECK-NEXT:    vpush {d8, d9, d10, d11}
284160d7227SMatt Arsenault; CHECK-NEXT:    sub sp, #16
285160d7227SMatt Arsenault; CHECK-NEXT:    add.w r8, sp, #12
286160d7227SMatt Arsenault; CHECK-NEXT:    mov r4, r0
287160d7227SMatt Arsenault; CHECK-NEXT:    mov r0, r2
288160d7227SMatt Arsenault; CHECK-NEXT:    mov r5, r3
289160d7227SMatt Arsenault; CHECK-NEXT:    mov r1, r8
290160d7227SMatt Arsenault; CHECK-NEXT:    bl frexpf
291160d7227SMatt Arsenault; CHECK-NEXT:    add r6, sp, #8
292160d7227SMatt Arsenault; CHECK-NEXT:    mov r9, r0
293160d7227SMatt Arsenault; CHECK-NEXT:    mov r0, r5
294160d7227SMatt Arsenault; CHECK-NEXT:    mov r1, r6
295160d7227SMatt Arsenault; CHECK-NEXT:    bl frexpf
296160d7227SMatt Arsenault; CHECK-NEXT:    vldr d16, [sp, #80]
297160d7227SMatt Arsenault; CHECK-NEXT:    mov r5, r0
298160d7227SMatt Arsenault; CHECK-NEXT:    vld1.32 {d8[0]}, [r8:32]
299160d7227SMatt Arsenault; CHECK-NEXT:    add.w r8, sp, #4
300160d7227SMatt Arsenault; CHECK-NEXT:    vmov r0, r7, d16
301160d7227SMatt Arsenault; CHECK-NEXT:    mov r1, r8
302160d7227SMatt Arsenault; CHECK-NEXT:    vld1.32 {d8[1]}, [r6:32]
303160d7227SMatt Arsenault; CHECK-NEXT:    bl frexpf
304160d7227SMatt Arsenault; CHECK-NEXT:    vld1.32 {d9[0]}, [r8:32]
305160d7227SMatt Arsenault; CHECK-NEXT:    vmov s21, r5
306160d7227SMatt Arsenault; CHECK-NEXT:    mov r5, sp
307160d7227SMatt Arsenault; CHECK-NEXT:    mov r6, r0
308160d7227SMatt Arsenault; CHECK-NEXT:    mov r0, r7
309160d7227SMatt Arsenault; CHECK-NEXT:    mov r1, r5
310160d7227SMatt Arsenault; CHECK-NEXT:    vmov s20, r9
311160d7227SMatt Arsenault; CHECK-NEXT:    bl frexpf
312160d7227SMatt Arsenault; CHECK-NEXT:    vmov s23, r0
313160d7227SMatt Arsenault; CHECK-NEXT:    vld1.32 {d9[1]}, [r5:32]
314160d7227SMatt Arsenault; CHECK-NEXT:    vmov s22, r6
315160d7227SMatt Arsenault; CHECK-NEXT:    vst1.32 {d10, d11}, [r4]!
316160d7227SMatt Arsenault; CHECK-NEXT:    vst1.64 {d8, d9}, [r4]
317160d7227SMatt Arsenault; CHECK-NEXT:    add sp, #16
318160d7227SMatt Arsenault; CHECK-NEXT:    vpop {d8, d9, d10, d11}
319160d7227SMatt Arsenault; CHECK-NEXT:    add sp, #4
320160d7227SMatt Arsenault; CHECK-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, pc}
321160d7227SMatt Arsenault  %result = call { <4 x float>, <4 x i32> } @llvm.frexp.v4f32.v4i32(<4 x float> %a)
322160d7227SMatt Arsenault  ret { <4 x float>, <4 x i32> } %result
323160d7227SMatt Arsenault}
324160d7227SMatt Arsenault
325160d7227SMatt Arsenaultdefine <4 x float> @test_frexp_v4f32_v4i32_only_use_fract(<4 x float> %a) {
326160d7227SMatt Arsenault; CHECK-LABEL: test_frexp_v4f32_v4i32_only_use_fract:
327160d7227SMatt Arsenault; CHECK:       @ %bb.0:
328160d7227SMatt Arsenault; CHECK-NEXT:    push {r4, r5, r6, lr}
329160d7227SMatt Arsenault; CHECK-NEXT:    vpush {d8, d9}
330160d7227SMatt Arsenault; CHECK-NEXT:    sub sp, #16
331160d7227SMatt Arsenault; CHECK-NEXT:    mov r5, r1
332160d7227SMatt Arsenault; CHECK-NEXT:    mov r6, r0
333160d7227SMatt Arsenault; CHECK-NEXT:    mov r1, sp
334160d7227SMatt Arsenault; CHECK-NEXT:    mov r0, r3
335160d7227SMatt Arsenault; CHECK-NEXT:    mov r4, r2
336160d7227SMatt Arsenault; CHECK-NEXT:    bl frexpf
337160d7227SMatt Arsenault; CHECK-NEXT:    add r1, sp, #4
338160d7227SMatt Arsenault; CHECK-NEXT:    vmov s19, r0
339160d7227SMatt Arsenault; CHECK-NEXT:    mov r0, r4
340160d7227SMatt Arsenault; CHECK-NEXT:    bl frexpf
341160d7227SMatt Arsenault; CHECK-NEXT:    add r1, sp, #8
342160d7227SMatt Arsenault; CHECK-NEXT:    vmov s18, r0
343160d7227SMatt Arsenault; CHECK-NEXT:    mov r0, r5
344160d7227SMatt Arsenault; CHECK-NEXT:    bl frexpf
345160d7227SMatt Arsenault; CHECK-NEXT:    add r1, sp, #12
346160d7227SMatt Arsenault; CHECK-NEXT:    vmov s17, r0
347160d7227SMatt Arsenault; CHECK-NEXT:    mov r0, r6
348160d7227SMatt Arsenault; CHECK-NEXT:    bl frexpf
349160d7227SMatt Arsenault; CHECK-NEXT:    vmov s16, r0
350160d7227SMatt Arsenault; CHECK-NEXT:    vmov r2, r3, d9
351160d7227SMatt Arsenault; CHECK-NEXT:    vmov r0, r1, d8
352160d7227SMatt Arsenault; CHECK-NEXT:    add sp, #16
353160d7227SMatt Arsenault; CHECK-NEXT:    vpop {d8, d9}
354160d7227SMatt Arsenault; CHECK-NEXT:    pop {r4, r5, r6, pc}
355160d7227SMatt Arsenault  %result = call { <4 x float>, <4 x i32> } @llvm.frexp.v4f32.v4i32(<4 x float> %a)
356160d7227SMatt Arsenault  %result.0 = extractvalue { <4 x float>, <4 x i32> } %result, 0
357160d7227SMatt Arsenault  ret <4 x float> %result.0
358160d7227SMatt Arsenault}
359160d7227SMatt Arsenault
360160d7227SMatt Arsenaultdefine <4 x i32> @test_frexp_v4f32_v4i32_only_use_exp(<4 x float> %a) {
361160d7227SMatt Arsenault; CHECK-LABEL: test_frexp_v4f32_v4i32_only_use_exp:
362160d7227SMatt Arsenault; CHECK:       @ %bb.0:
363160d7227SMatt Arsenault; CHECK-NEXT:    push {r4, r5, r6, lr}
364160d7227SMatt Arsenault; CHECK-NEXT:    sub sp, #16
365160d7227SMatt Arsenault; CHECK-NEXT:    mov r6, r1
366160d7227SMatt Arsenault; CHECK-NEXT:    add r1, sp, #12
367160d7227SMatt Arsenault; CHECK-NEXT:    mov r4, r3
368160d7227SMatt Arsenault; CHECK-NEXT:    mov r5, r2
369160d7227SMatt Arsenault; CHECK-NEXT:    bl frexpf
370160d7227SMatt Arsenault; CHECK-NEXT:    add r1, sp, #8
371160d7227SMatt Arsenault; CHECK-NEXT:    mov r0, r6
372160d7227SMatt Arsenault; CHECK-NEXT:    bl frexpf
373160d7227SMatt Arsenault; CHECK-NEXT:    add r1, sp, #4
374160d7227SMatt Arsenault; CHECK-NEXT:    mov r0, r5
375160d7227SMatt Arsenault; CHECK-NEXT:    bl frexpf
376160d7227SMatt Arsenault; CHECK-NEXT:    mov r1, sp
377160d7227SMatt Arsenault; CHECK-NEXT:    mov r0, r4
378160d7227SMatt Arsenault; CHECK-NEXT:    bl frexpf
379160d7227SMatt Arsenault; CHECK-NEXT:    ldrd r1, r0, [sp, #8]
380160d7227SMatt Arsenault; CHECK-NEXT:    ldrd r3, r2, [sp], #16
381160d7227SMatt Arsenault; CHECK-NEXT:    pop {r4, r5, r6, pc}
382160d7227SMatt Arsenault  %result = call { <4 x float>, <4 x i32> } @llvm.frexp.v4f32.v4i32(<4 x float> %a)
383160d7227SMatt Arsenault  %result.1 = extractvalue { <4 x float>, <4 x i32> } %result, 1
384160d7227SMatt Arsenault  ret <4 x i32> %result.1
385160d7227SMatt Arsenault}
386160d7227SMatt Arsenault
387160d7227SMatt Arsenaultdefine { double, i32 } @test_frexp_f64_i32(double %a) {
388160d7227SMatt Arsenault; CHECK-LABEL: test_frexp_f64_i32:
389160d7227SMatt Arsenault; CHECK:       @ %bb.0:
390160d7227SMatt Arsenault; CHECK-NEXT:    push {r7, lr}
391160d7227SMatt Arsenault; CHECK-NEXT:    sub sp, #8
392160d7227SMatt Arsenault; CHECK-NEXT:    add r2, sp, #4
393160d7227SMatt Arsenault; CHECK-NEXT:    bl frexp
394160d7227SMatt Arsenault; CHECK-NEXT:    ldr r2, [sp, #4]
395160d7227SMatt Arsenault; CHECK-NEXT:    add sp, #8
396160d7227SMatt Arsenault; CHECK-NEXT:    pop {r7, pc}
397160d7227SMatt Arsenault  %result = call { double, i32 } @llvm.frexp.f64.i32(double %a)
398160d7227SMatt Arsenault  ret { double, i32 } %result
399160d7227SMatt Arsenault}
400160d7227SMatt Arsenault
401160d7227SMatt Arsenaultdefine double @test_frexp_f64_i32_only_use_fract(double %a) {
402160d7227SMatt Arsenault; CHECK-LABEL: test_frexp_f64_i32_only_use_fract:
403160d7227SMatt Arsenault; CHECK:       @ %bb.0:
404160d7227SMatt Arsenault; CHECK-NEXT:    push {r7, lr}
405160d7227SMatt Arsenault; CHECK-NEXT:    sub sp, #8
406160d7227SMatt Arsenault; CHECK-NEXT:    add r2, sp, #4
407160d7227SMatt Arsenault; CHECK-NEXT:    bl frexp
408160d7227SMatt Arsenault; CHECK-NEXT:    add sp, #8
409160d7227SMatt Arsenault; CHECK-NEXT:    pop {r7, pc}
410160d7227SMatt Arsenault  %result = call { double, i32 } @llvm.frexp.f64.i32(double %a)
411160d7227SMatt Arsenault  %result.0 = extractvalue { double, i32 } %result, 0
412160d7227SMatt Arsenault  ret double %result.0
413160d7227SMatt Arsenault}
414160d7227SMatt Arsenault
415160d7227SMatt Arsenaultdefine i32 @test_frexp_f64_i32_only_use_exp(double %a) {
416160d7227SMatt Arsenault; CHECK-LABEL: test_frexp_f64_i32_only_use_exp:
417160d7227SMatt Arsenault; CHECK:       @ %bb.0:
418160d7227SMatt Arsenault; CHECK-NEXT:    push {r7, lr}
419160d7227SMatt Arsenault; CHECK-NEXT:    sub sp, #8
420160d7227SMatt Arsenault; CHECK-NEXT:    add r2, sp, #4
421160d7227SMatt Arsenault; CHECK-NEXT:    bl frexp
422160d7227SMatt Arsenault; CHECK-NEXT:    ldr r0, [sp, #4]
423160d7227SMatt Arsenault; CHECK-NEXT:    add sp, #8
424160d7227SMatt Arsenault; CHECK-NEXT:    pop {r7, pc}
425160d7227SMatt Arsenault  %result = call { double, i32 } @llvm.frexp.f64.i32(double %a)
426160d7227SMatt Arsenault  %result.0 = extractvalue { double, i32 } %result, 1
427160d7227SMatt Arsenault  ret i32 %result.0
428160d7227SMatt Arsenault}
429160d7227SMatt Arsenault
430160d7227SMatt Arsenaultdefine { <2 x double>, <2 x i32> } @test_frexp_v2f64_v2i32(<2 x double> %a) {
431160d7227SMatt Arsenault; CHECK-LABEL: test_frexp_v2f64_v2i32:
432160d7227SMatt Arsenault; CHECK:       @ %bb.0:
433160d7227SMatt Arsenault; CHECK-NEXT:    push.w {r4, r5, r6, r7, r8, lr}
434160d7227SMatt Arsenault; CHECK-NEXT:    sub sp, #8
435160d7227SMatt Arsenault; CHECK-NEXT:    add.w r8, sp, #4
436160d7227SMatt Arsenault; CHECK-NEXT:    mov r4, r0
437160d7227SMatt Arsenault; CHECK-NEXT:    mov r0, r2
438160d7227SMatt Arsenault; CHECK-NEXT:    mov r1, r3
439160d7227SMatt Arsenault; CHECK-NEXT:    mov r2, r8
440160d7227SMatt Arsenault; CHECK-NEXT:    bl frexp
441160d7227SMatt Arsenault; CHECK-NEXT:    mov r6, r0
442160d7227SMatt Arsenault; CHECK-NEXT:    mov r7, r1
443160d7227SMatt Arsenault; CHECK-NEXT:    ldrd r0, r1, [sp, #32]
444160d7227SMatt Arsenault; CHECK-NEXT:    mov r5, sp
445160d7227SMatt Arsenault; CHECK-NEXT:    mov r2, r5
446160d7227SMatt Arsenault; CHECK-NEXT:    bl frexp
447160d7227SMatt Arsenault; CHECK-NEXT:    vld1.32 {d16[0]}, [r8:32]
448160d7227SMatt Arsenault; CHECK-NEXT:    vmov d18, r6, r7
449160d7227SMatt Arsenault; CHECK-NEXT:    vmov d19, r0, r1
450160d7227SMatt Arsenault; CHECK-NEXT:    vld1.32 {d16[1]}, [r5:32]
451160d7227SMatt Arsenault; CHECK-NEXT:    vst1.64 {d18, d19}, [r4]!
452160d7227SMatt Arsenault; CHECK-NEXT:    vstr d16, [r4]
453160d7227SMatt Arsenault; CHECK-NEXT:    add sp, #8
454160d7227SMatt Arsenault; CHECK-NEXT:    pop.w {r4, r5, r6, r7, r8, pc}
455160d7227SMatt Arsenault  %result = call { <2 x double>, <2 x i32> } @llvm.frexp.v2f64.v2i32(<2 x double> %a)
456160d7227SMatt Arsenault  ret { <2 x double>, <2 x i32> } %result
457160d7227SMatt Arsenault}
458160d7227SMatt Arsenault
459160d7227SMatt Arsenaultdefine <2 x double> @test_frexp_v2f64_v2i32_only_use_fract(<2 x double> %a) {
460160d7227SMatt Arsenault; CHECK-LABEL: test_frexp_v2f64_v2i32_only_use_fract:
461160d7227SMatt Arsenault; CHECK:       @ %bb.0:
462160d7227SMatt Arsenault; CHECK-NEXT:    push {r4, r5, r6, r7, lr}
463160d7227SMatt Arsenault; CHECK-NEXT:    sub sp, #12
464160d7227SMatt Arsenault; CHECK-NEXT:    mov r5, r2
465160d7227SMatt Arsenault; CHECK-NEXT:    add r2, sp, #4
466160d7227SMatt Arsenault; CHECK-NEXT:    mov r4, r3
467160d7227SMatt Arsenault; CHECK-NEXT:    bl frexp
468160d7227SMatt Arsenault; CHECK-NEXT:    add r2, sp, #8
469160d7227SMatt Arsenault; CHECK-NEXT:    mov r6, r0
470160d7227SMatt Arsenault; CHECK-NEXT:    mov r7, r1
471160d7227SMatt Arsenault; CHECK-NEXT:    mov r0, r5
472160d7227SMatt Arsenault; CHECK-NEXT:    mov r1, r4
473160d7227SMatt Arsenault; CHECK-NEXT:    bl frexp
474160d7227SMatt Arsenault; CHECK-NEXT:    mov r2, r0
475160d7227SMatt Arsenault; CHECK-NEXT:    mov r3, r1
476160d7227SMatt Arsenault; CHECK-NEXT:    mov r0, r6
477160d7227SMatt Arsenault; CHECK-NEXT:    mov r1, r7
478160d7227SMatt Arsenault; CHECK-NEXT:    add sp, #12
479160d7227SMatt Arsenault; CHECK-NEXT:    pop {r4, r5, r6, r7, pc}
480160d7227SMatt Arsenault  %result = call { <2 x double>, <2 x i32> } @llvm.frexp.v2f64.v2i32(<2 x double> %a)
481160d7227SMatt Arsenault  %result.0 = extractvalue { <2 x double>, <2 x i32> } %result, 0
482160d7227SMatt Arsenault  ret <2 x double> %result.0
483160d7227SMatt Arsenault}
484160d7227SMatt Arsenault
485160d7227SMatt Arsenaultdefine <2 x i32> @test_frexp_v2f64_v2i32_only_use_exp(<2 x double> %a) {
486160d7227SMatt Arsenault; CHECK-LABEL: test_frexp_v2f64_v2i32_only_use_exp:
487160d7227SMatt Arsenault; CHECK:       @ %bb.0:
488160d7227SMatt Arsenault; CHECK-NEXT:    push {r4, r5, r6, r7, lr}
489160d7227SMatt Arsenault; CHECK-NEXT:    sub sp, #12
490160d7227SMatt Arsenault; CHECK-NEXT:    add r6, sp, #4
491160d7227SMatt Arsenault; CHECK-NEXT:    mov r5, r2
492160d7227SMatt Arsenault; CHECK-NEXT:    mov r4, r3
493160d7227SMatt Arsenault; CHECK-NEXT:    mov r2, r6
494160d7227SMatt Arsenault; CHECK-NEXT:    bl frexp
495160d7227SMatt Arsenault; CHECK-NEXT:    add r7, sp, #8
496160d7227SMatt Arsenault; CHECK-NEXT:    mov r0, r5
497160d7227SMatt Arsenault; CHECK-NEXT:    mov r1, r4
498160d7227SMatt Arsenault; CHECK-NEXT:    mov r2, r7
499160d7227SMatt Arsenault; CHECK-NEXT:    bl frexp
500160d7227SMatt Arsenault; CHECK-NEXT:    vld1.32 {d16[0]}, [r6:32]
501160d7227SMatt Arsenault; CHECK-NEXT:    vld1.32 {d16[1]}, [r7:32]
502160d7227SMatt Arsenault; CHECK-NEXT:    vmov r0, r1, d16
503160d7227SMatt Arsenault; CHECK-NEXT:    add sp, #12
504160d7227SMatt Arsenault; CHECK-NEXT:    pop {r4, r5, r6, r7, pc}
505160d7227SMatt Arsenault  %result = call { <2 x double>, <2 x i32> } @llvm.frexp.v2f64.v2i32(<2 x double> %a)
506160d7227SMatt Arsenault  %result.1 = extractvalue { <2 x double>, <2 x i32> } %result, 1
507160d7227SMatt Arsenault  ret <2 x i32> %result.1
508160d7227SMatt Arsenault}
509160d7227SMatt Arsenault
510160d7227SMatt Arsenaultdeclare { float, i32 } @llvm.frexp.f32.i32(float) #0
511160d7227SMatt Arsenaultdeclare { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float>) #0
512160d7227SMatt Arsenaultdeclare { <4 x float>, <4 x i32> } @llvm.frexp.v4f32.v4i32(<4 x float>) #0
513160d7227SMatt Arsenault
514160d7227SMatt Arsenaultdeclare { half, i32 } @llvm.frexp.f16.i32(half) #0
515160d7227SMatt Arsenaultdeclare { <2 x half>, <2 x i32> } @llvm.frexp.v2f16.v2i32(<2 x half>) #0
516160d7227SMatt Arsenault
517160d7227SMatt Arsenaultdeclare { double, i32 } @llvm.frexp.f64.i32(double) #0
518160d7227SMatt Arsenaultdeclare { <2 x double>, <2 x i32> } @llvm.frexp.v2f64.v2i32(<2 x double>) #0
519160d7227SMatt Arsenault
520160d7227SMatt Arsenaultdeclare { half, i16 } @llvm.frexp.f16.i16(half) #0
521160d7227SMatt Arsenaultdeclare { <2 x half>, <2 x i16> } @llvm.frexp.v2f16.v2i16(<2 x half>) #0
522160d7227SMatt Arsenault
523160d7227SMatt Arsenaultattributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
524