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