1b14e83d1SMatt Arsenault; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 2b14e83d1SMatt Arsenault; RUN: llc -mtriple=thumbv7-unknown-linux < %s | FileCheck -check-prefixes=CHECK %s 3b14e83d1SMatt Arsenault 4b14e83d1SMatt Arsenaultdeclare half @llvm.exp10.f16(half) 5b14e83d1SMatt Arsenaultdeclare <1 x half> @llvm.exp10.v1f16(<1 x half>) 6b14e83d1SMatt Arsenaultdeclare <2 x half> @llvm.exp10.v2f16(<2 x half>) 7b14e83d1SMatt Arsenaultdeclare <3 x half> @llvm.exp10.v3f16(<3 x half>) 8b14e83d1SMatt Arsenaultdeclare <4 x half> @llvm.exp10.v4f16(<4 x half>) 9b14e83d1SMatt Arsenaultdeclare float @llvm.exp10.f32(float) 10b14e83d1SMatt Arsenaultdeclare <1 x float> @llvm.exp10.v1f32(<1 x float>) 11b14e83d1SMatt Arsenaultdeclare <2 x float> @llvm.exp10.v2f32(<2 x float>) 12b14e83d1SMatt Arsenaultdeclare <3 x float> @llvm.exp10.v3f32(<3 x float>) 13b14e83d1SMatt Arsenaultdeclare <4 x float> @llvm.exp10.v4f32(<4 x float>) 14b14e83d1SMatt Arsenaultdeclare double @llvm.exp10.f64(double) 15b14e83d1SMatt Arsenaultdeclare <1 x double> @llvm.exp10.v1f64(<1 x double>) 16b14e83d1SMatt Arsenaultdeclare <2 x double> @llvm.exp10.v2f64(<2 x double>) 17b14e83d1SMatt Arsenaultdeclare <3 x double> @llvm.exp10.v3f64(<3 x double>) 18b14e83d1SMatt Arsenaultdeclare <4 x double> @llvm.exp10.v4f64(<4 x double>) 19b14e83d1SMatt Arsenault 20b14e83d1SMatt Arsenaultdefine half @exp10_f16(half %x) { 21b14e83d1SMatt Arsenault; CHECK-LABEL: exp10_f16: 22b14e83d1SMatt Arsenault; CHECK: @ %bb.0: 23b14e83d1SMatt Arsenault; CHECK-NEXT: push {r7, lr} 24b14e83d1SMatt Arsenault; CHECK-NEXT: bl __gnu_h2f_ieee 25b14e83d1SMatt Arsenault; CHECK-NEXT: bl exp10f 26b14e83d1SMatt Arsenault; CHECK-NEXT: bl __gnu_f2h_ieee 27b14e83d1SMatt Arsenault; CHECK-NEXT: pop {r7, pc} 28b14e83d1SMatt Arsenault %r = call half @llvm.exp10.f16(half %x) 29b14e83d1SMatt Arsenault ret half %r 30b14e83d1SMatt Arsenault} 31b14e83d1SMatt Arsenault 32b14e83d1SMatt Arsenaultdefine <1 x half> @exp10_v1f16(<1 x half> %x) { 33b14e83d1SMatt Arsenault; CHECK-LABEL: exp10_v1f16: 34b14e83d1SMatt Arsenault; CHECK: @ %bb.0: 35b14e83d1SMatt Arsenault; CHECK-NEXT: push {r7, lr} 36b14e83d1SMatt Arsenault; CHECK-NEXT: bl __gnu_f2h_ieee 37b14e83d1SMatt Arsenault; CHECK-NEXT: bl __gnu_h2f_ieee 38b14e83d1SMatt Arsenault; CHECK-NEXT: bl exp10f 39*52864d9cSHarald van Dijk; CHECK-NEXT: bl __gnu_f2h_ieee 40*52864d9cSHarald van Dijk; CHECK-NEXT: bl __gnu_h2f_ieee 41b14e83d1SMatt Arsenault; CHECK-NEXT: pop {r7, pc} 42b14e83d1SMatt Arsenault %r = call <1 x half> @llvm.exp10.v1f16(<1 x half> %x) 43b14e83d1SMatt Arsenault ret <1 x half> %r 44b14e83d1SMatt Arsenault} 45b14e83d1SMatt Arsenault 46b14e83d1SMatt Arsenaultdefine <2 x half> @exp10_v2f16(<2 x half> %x) { 47b14e83d1SMatt Arsenault; CHECK-LABEL: exp10_v2f16: 48b14e83d1SMatt Arsenault; CHECK: @ %bb.0: 49*52864d9cSHarald van Dijk; CHECK-NEXT: push {r4, lr} 50*52864d9cSHarald van Dijk; CHECK-NEXT: sub sp, #8 51*52864d9cSHarald van Dijk; CHECK-NEXT: mov r4, r0 52*52864d9cSHarald van Dijk; CHECK-NEXT: mov r0, r1 53b14e83d1SMatt Arsenault; CHECK-NEXT: bl __gnu_h2f_ieee 54b14e83d1SMatt Arsenault; CHECK-NEXT: bl exp10f 55b14e83d1SMatt Arsenault; CHECK-NEXT: bl __gnu_f2h_ieee 56*52864d9cSHarald van Dijk; CHECK-NEXT: strh.w r0, [sp, #6] 57b14e83d1SMatt Arsenault; CHECK-NEXT: mov r0, r4 58b14e83d1SMatt Arsenault; CHECK-NEXT: bl __gnu_h2f_ieee 59b14e83d1SMatt Arsenault; CHECK-NEXT: bl exp10f 60b14e83d1SMatt Arsenault; CHECK-NEXT: bl __gnu_f2h_ieee 61*52864d9cSHarald van Dijk; CHECK-NEXT: strh.w r0, [sp, #4] 62*52864d9cSHarald van Dijk; CHECK-NEXT: add r0, sp, #4 63*52864d9cSHarald van Dijk; CHECK-NEXT: vld1.32 {d16[0]}, [r0:32] 64*52864d9cSHarald van Dijk; CHECK-NEXT: vmovl.u16 q8, d16 65*52864d9cSHarald van Dijk; CHECK-NEXT: vmov.32 r0, d16[0] 66*52864d9cSHarald van Dijk; CHECK-NEXT: vmov.32 r1, d16[1] 67*52864d9cSHarald van Dijk; CHECK-NEXT: add sp, #8 68*52864d9cSHarald van Dijk; CHECK-NEXT: pop {r4, pc} 69b14e83d1SMatt Arsenault %r = call <2 x half> @llvm.exp10.v2f16(<2 x half> %x) 70b14e83d1SMatt Arsenault ret <2 x half> %r 71b14e83d1SMatt Arsenault} 72b14e83d1SMatt Arsenault 73b14e83d1SMatt Arsenaultdefine <3 x half> @exp10_v3f16(<3 x half> %x) { 74b14e83d1SMatt Arsenault; CHECK-LABEL: exp10_v3f16: 75b14e83d1SMatt Arsenault; CHECK: @ %bb.0: 76b14e83d1SMatt Arsenault; CHECK-NEXT: push {r4, r5, r6, lr} 77b14e83d1SMatt Arsenault; CHECK-NEXT: mov r5, r0 78*52864d9cSHarald van Dijk; CHECK-NEXT: mov r0, r1 79*52864d9cSHarald van Dijk; CHECK-NEXT: mov r4, r2 80b14e83d1SMatt Arsenault; CHECK-NEXT: bl __gnu_h2f_ieee 81b14e83d1SMatt Arsenault; CHECK-NEXT: bl exp10f 82b14e83d1SMatt Arsenault; CHECK-NEXT: bl __gnu_f2h_ieee 83b14e83d1SMatt Arsenault; CHECK-NEXT: mov r6, r0 84*52864d9cSHarald van Dijk; CHECK-NEXT: mov r0, r5 85*52864d9cSHarald van Dijk; CHECK-NEXT: bl __gnu_h2f_ieee 86*52864d9cSHarald van Dijk; CHECK-NEXT: bl exp10f 87*52864d9cSHarald van Dijk; CHECK-NEXT: bl __gnu_f2h_ieee 88*52864d9cSHarald van Dijk; CHECK-NEXT: pkhbt r5, r0, r6, lsl #16 89b14e83d1SMatt Arsenault; CHECK-NEXT: mov r0, r4 90b14e83d1SMatt Arsenault; CHECK-NEXT: bl __gnu_h2f_ieee 91b14e83d1SMatt Arsenault; CHECK-NEXT: bl exp10f 92b14e83d1SMatt Arsenault; CHECK-NEXT: bl __gnu_f2h_ieee 93*52864d9cSHarald van Dijk; CHECK-NEXT: uxth r0, r0 94*52864d9cSHarald van Dijk; CHECK-NEXT: vmov d16, r5, r0 95*52864d9cSHarald van Dijk; CHECK-NEXT: vmov.u16 r0, d16[0] 96*52864d9cSHarald van Dijk; CHECK-NEXT: vmov.u16 r1, d16[1] 97*52864d9cSHarald van Dijk; CHECK-NEXT: vmov.u16 r2, d16[2] 98b14e83d1SMatt Arsenault; CHECK-NEXT: pop {r4, r5, r6, pc} 99b14e83d1SMatt Arsenault %r = call <3 x half> @llvm.exp10.v3f16(<3 x half> %x) 100b14e83d1SMatt Arsenault ret <3 x half> %r 101b14e83d1SMatt Arsenault} 102b14e83d1SMatt Arsenault 103b14e83d1SMatt Arsenaultdefine <4 x half> @exp10_v4f16(<4 x half> %x) { 104b14e83d1SMatt Arsenault; CHECK-LABEL: exp10_v4f16: 105b14e83d1SMatt Arsenault; CHECK: @ %bb.0: 106b14e83d1SMatt Arsenault; CHECK-NEXT: push {r4, r5, r6, r7, lr} 107b14e83d1SMatt Arsenault; CHECK-NEXT: sub sp, #4 108*52864d9cSHarald van Dijk; CHECK-NEXT: mov r4, r0 109*52864d9cSHarald van Dijk; CHECK-NEXT: mov r0, r3 110b14e83d1SMatt Arsenault; CHECK-NEXT: mov r6, r2 111*52864d9cSHarald van Dijk; CHECK-NEXT: mov r5, r1 112b14e83d1SMatt Arsenault; CHECK-NEXT: bl __gnu_h2f_ieee 113b14e83d1SMatt Arsenault; CHECK-NEXT: bl exp10f 114b14e83d1SMatt Arsenault; CHECK-NEXT: bl __gnu_f2h_ieee 115b14e83d1SMatt Arsenault; CHECK-NEXT: mov r7, r0 116b14e83d1SMatt Arsenault; CHECK-NEXT: mov r0, r6 117b14e83d1SMatt Arsenault; CHECK-NEXT: bl __gnu_h2f_ieee 118b14e83d1SMatt Arsenault; CHECK-NEXT: bl exp10f 119b14e83d1SMatt Arsenault; CHECK-NEXT: bl __gnu_f2h_ieee 120*52864d9cSHarald van Dijk; CHECK-NEXT: pkhbt r6, r0, r7, lsl #16 121*52864d9cSHarald van Dijk; CHECK-NEXT: mov r0, r5 122*52864d9cSHarald van Dijk; CHECK-NEXT: bl __gnu_h2f_ieee 123*52864d9cSHarald van Dijk; CHECK-NEXT: bl exp10f 124*52864d9cSHarald van Dijk; CHECK-NEXT: bl __gnu_f2h_ieee 125*52864d9cSHarald van Dijk; CHECK-NEXT: mov r5, r0 126b14e83d1SMatt Arsenault; CHECK-NEXT: mov r0, r4 127b14e83d1SMatt Arsenault; CHECK-NEXT: bl __gnu_h2f_ieee 128b14e83d1SMatt Arsenault; CHECK-NEXT: bl exp10f 129b14e83d1SMatt Arsenault; CHECK-NEXT: bl __gnu_f2h_ieee 130*52864d9cSHarald van Dijk; CHECK-NEXT: pkhbt r0, r0, r5, lsl #16 131*52864d9cSHarald van Dijk; CHECK-NEXT: vmov d16, r0, r6 132*52864d9cSHarald van Dijk; CHECK-NEXT: vmov.u16 r0, d16[0] 133*52864d9cSHarald van Dijk; CHECK-NEXT: vmov.u16 r1, d16[1] 134*52864d9cSHarald van Dijk; CHECK-NEXT: vmov.u16 r2, d16[2] 135*52864d9cSHarald van Dijk; CHECK-NEXT: vmov.u16 r3, d16[3] 136b14e83d1SMatt Arsenault; CHECK-NEXT: add sp, #4 137b14e83d1SMatt Arsenault; CHECK-NEXT: pop {r4, r5, r6, r7, pc} 138b14e83d1SMatt Arsenault %r = call <4 x half> @llvm.exp10.v4f16(<4 x half> %x) 139b14e83d1SMatt Arsenault ret <4 x half> %r 140b14e83d1SMatt Arsenault} 141b14e83d1SMatt Arsenault 142b14e83d1SMatt Arsenaultdefine float @exp10_f32(float %x) { 143b14e83d1SMatt Arsenault; CHECK-LABEL: exp10_f32: 144b14e83d1SMatt Arsenault; CHECK: @ %bb.0: 145b14e83d1SMatt Arsenault; CHECK-NEXT: b exp10f 146b14e83d1SMatt Arsenault %r = call float @llvm.exp10.f32(float %x) 147b14e83d1SMatt Arsenault ret float %r 148b14e83d1SMatt Arsenault} 149b14e83d1SMatt Arsenault 150b14e83d1SMatt Arsenaultdefine <1 x float> @exp10_v1f32(<1 x float> %x) { 151b14e83d1SMatt Arsenault; CHECK-LABEL: exp10_v1f32: 152b14e83d1SMatt Arsenault; CHECK: @ %bb.0: 153b14e83d1SMatt Arsenault; CHECK-NEXT: push {r7, lr} 154b14e83d1SMatt Arsenault; CHECK-NEXT: bl exp10f 155b14e83d1SMatt Arsenault; CHECK-NEXT: pop {r7, pc} 156b14e83d1SMatt Arsenault %r = call <1 x float> @llvm.exp10.v1f32(<1 x float> %x) 157b14e83d1SMatt Arsenault ret <1 x float> %r 158b14e83d1SMatt Arsenault} 159b14e83d1SMatt Arsenault 160b14e83d1SMatt Arsenaultdefine <2 x float> @exp10_v2f32(<2 x float> %x) { 161b14e83d1SMatt Arsenault; CHECK-LABEL: exp10_v2f32: 162b14e83d1SMatt Arsenault; CHECK: @ %bb.0: 163b14e83d1SMatt Arsenault; CHECK-NEXT: push {r4, lr} 164b14e83d1SMatt Arsenault; CHECK-NEXT: vpush {d8} 165b14e83d1SMatt Arsenault; CHECK-NEXT: vmov d8, r0, r1 166b14e83d1SMatt Arsenault; CHECK-NEXT: vmov r0, s17 167b14e83d1SMatt Arsenault; CHECK-NEXT: bl exp10f 168b14e83d1SMatt Arsenault; CHECK-NEXT: mov r4, r0 169b14e83d1SMatt Arsenault; CHECK-NEXT: vmov r0, s16 170b14e83d1SMatt Arsenault; CHECK-NEXT: bl exp10f 171b14e83d1SMatt Arsenault; CHECK-NEXT: mov r1, r4 172b14e83d1SMatt Arsenault; CHECK-NEXT: vpop {d8} 173b14e83d1SMatt Arsenault; CHECK-NEXT: pop {r4, pc} 174b14e83d1SMatt Arsenault %r = call <2 x float> @llvm.exp10.v2f32(<2 x float> %x) 175b14e83d1SMatt Arsenault ret <2 x float> %r 176b14e83d1SMatt Arsenault} 177b14e83d1SMatt Arsenault 178b14e83d1SMatt Arsenaultdefine <3 x float> @exp10_v3f32(<3 x float> %x) { 179b14e83d1SMatt Arsenault; CHECK-LABEL: exp10_v3f32: 180b14e83d1SMatt Arsenault; CHECK: @ %bb.0: 181b14e83d1SMatt Arsenault; CHECK-NEXT: push {r4, r5, r6, lr} 182b14e83d1SMatt Arsenault; CHECK-NEXT: vpush {d8, d9} 183b14e83d1SMatt Arsenault; CHECK-NEXT: vmov d1, r2, r3 184b14e83d1SMatt Arsenault; CHECK-NEXT: mov r5, r0 185b14e83d1SMatt Arsenault; CHECK-NEXT: vmov d0, r0, r1 186b14e83d1SMatt Arsenault; CHECK-NEXT: mov r4, r1 187b14e83d1SMatt Arsenault; CHECK-NEXT: vmov r0, s2 188b14e83d1SMatt Arsenault; CHECK-NEXT: bl exp10f 189b14e83d1SMatt Arsenault; CHECK-NEXT: mov r6, r0 190b14e83d1SMatt Arsenault; CHECK-NEXT: mov r0, r4 191b14e83d1SMatt Arsenault; CHECK-NEXT: bl exp10f 192b14e83d1SMatt Arsenault; CHECK-NEXT: vmov s17, r0 193b14e83d1SMatt Arsenault; CHECK-NEXT: mov r0, r5 194b14e83d1SMatt Arsenault; CHECK-NEXT: bl exp10f 195b14e83d1SMatt Arsenault; CHECK-NEXT: vmov s16, r0 196b14e83d1SMatt Arsenault; CHECK-NEXT: vmov s18, r6 197b14e83d1SMatt Arsenault; CHECK-NEXT: vmov r0, r1, d8 198b14e83d1SMatt Arsenault; CHECK-NEXT: vmov r2, r3, d9 199b14e83d1SMatt Arsenault; CHECK-NEXT: vpop {d8, d9} 200b14e83d1SMatt Arsenault; CHECK-NEXT: pop {r4, r5, r6, pc} 201b14e83d1SMatt Arsenault %r = call <3 x float> @llvm.exp10.v3f32(<3 x float> %x) 202b14e83d1SMatt Arsenault ret <3 x float> %r 203b14e83d1SMatt Arsenault} 204b14e83d1SMatt Arsenault 205b14e83d1SMatt Arsenaultdefine <4 x float> @exp10_v4f32(<4 x float> %x) { 206b14e83d1SMatt Arsenault; CHECK-LABEL: exp10_v4f32: 207b14e83d1SMatt Arsenault; CHECK: @ %bb.0: 208b14e83d1SMatt Arsenault; CHECK-NEXT: push {r4, r5, r6, r7, lr} 209b14e83d1SMatt Arsenault; CHECK-NEXT: sub sp, #4 210b14e83d1SMatt Arsenault; CHECK-NEXT: vpush {d8, d9} 211b14e83d1SMatt Arsenault; CHECK-NEXT: mov r6, r0 212b14e83d1SMatt Arsenault; CHECK-NEXT: mov r0, r1 213b14e83d1SMatt Arsenault; CHECK-NEXT: mov r4, r3 214b14e83d1SMatt Arsenault; CHECK-NEXT: mov r5, r2 215b14e83d1SMatt Arsenault; CHECK-NEXT: bl exp10f 216b14e83d1SMatt Arsenault; CHECK-NEXT: mov r7, r0 217b14e83d1SMatt Arsenault; CHECK-NEXT: mov r0, r4 218b14e83d1SMatt Arsenault; CHECK-NEXT: bl exp10f 219b14e83d1SMatt Arsenault; CHECK-NEXT: vmov s19, r0 220b14e83d1SMatt Arsenault; CHECK-NEXT: mov r0, r5 221b14e83d1SMatt Arsenault; CHECK-NEXT: bl exp10f 222b14e83d1SMatt Arsenault; CHECK-NEXT: vmov s18, r0 223b14e83d1SMatt Arsenault; CHECK-NEXT: mov r0, r6 224b14e83d1SMatt Arsenault; CHECK-NEXT: vmov s17, r7 225b14e83d1SMatt Arsenault; CHECK-NEXT: bl exp10f 226b14e83d1SMatt Arsenault; CHECK-NEXT: vmov s16, r0 227b14e83d1SMatt Arsenault; CHECK-NEXT: vmov r2, r3, d9 228b14e83d1SMatt Arsenault; CHECK-NEXT: vmov r0, r1, d8 229b14e83d1SMatt Arsenault; CHECK-NEXT: vpop {d8, d9} 230b14e83d1SMatt Arsenault; CHECK-NEXT: add sp, #4 231b14e83d1SMatt Arsenault; CHECK-NEXT: pop {r4, r5, r6, r7, pc} 232b14e83d1SMatt Arsenault %r = call <4 x float> @llvm.exp10.v4f32(<4 x float> %x) 233b14e83d1SMatt Arsenault ret <4 x float> %r 234b14e83d1SMatt Arsenault} 235b14e83d1SMatt Arsenault 236b14e83d1SMatt Arsenaultdefine double @exp10_f64(double %x) { 237b14e83d1SMatt Arsenault; CHECK-LABEL: exp10_f64: 238b14e83d1SMatt Arsenault; CHECK: @ %bb.0: 239b14e83d1SMatt Arsenault; CHECK-NEXT: b exp10 240b14e83d1SMatt Arsenault %r = call double @llvm.exp10.f64(double %x) 241b14e83d1SMatt Arsenault ret double %r 242b14e83d1SMatt Arsenault} 243b14e83d1SMatt Arsenault 244b14e83d1SMatt Arsenault; FIXME: Broken 245b14e83d1SMatt Arsenault; define <1 x double> @exp10_v1f64(<1 x double> %x) { 246b14e83d1SMatt Arsenault; %r = call <1 x double> @llvm.exp10.v1f64(<1 x double> %x) 247b14e83d1SMatt Arsenault; ret <1 x double> %r 248b14e83d1SMatt Arsenault; } 249b14e83d1SMatt Arsenault 250b14e83d1SMatt Arsenaultdefine <2 x double> @exp10_v2f64(<2 x double> %x) { 251b14e83d1SMatt Arsenault; CHECK-LABEL: exp10_v2f64: 252b14e83d1SMatt Arsenault; CHECK: @ %bb.0: 253b14e83d1SMatt Arsenault; CHECK-NEXT: push {r4, r5, r6, r7, lr} 254b14e83d1SMatt Arsenault; CHECK-NEXT: sub sp, #4 255b14e83d1SMatt Arsenault; CHECK-NEXT: mov r4, r3 256b14e83d1SMatt Arsenault; CHECK-NEXT: mov r5, r2 257b14e83d1SMatt Arsenault; CHECK-NEXT: bl exp10 258b14e83d1SMatt Arsenault; CHECK-NEXT: mov r6, r0 259b14e83d1SMatt Arsenault; CHECK-NEXT: mov r7, r1 260b14e83d1SMatt Arsenault; CHECK-NEXT: mov r0, r5 261b14e83d1SMatt Arsenault; CHECK-NEXT: mov r1, r4 262b14e83d1SMatt Arsenault; CHECK-NEXT: bl exp10 263b14e83d1SMatt Arsenault; CHECK-NEXT: mov r2, r0 264b14e83d1SMatt Arsenault; CHECK-NEXT: mov r3, r1 265b14e83d1SMatt Arsenault; CHECK-NEXT: mov r0, r6 266b14e83d1SMatt Arsenault; CHECK-NEXT: mov r1, r7 267b14e83d1SMatt Arsenault; CHECK-NEXT: add sp, #4 268b14e83d1SMatt Arsenault; CHECK-NEXT: pop {r4, r5, r6, r7, pc} 269b14e83d1SMatt Arsenault %r = call <2 x double> @llvm.exp10.v2f64(<2 x double> %x) 270b14e83d1SMatt Arsenault ret <2 x double> %r 271b14e83d1SMatt Arsenault} 272b14e83d1SMatt Arsenault 273b14e83d1SMatt Arsenaultdefine <3 x double> @exp10_v3f64(<3 x double> %x) { 274b14e83d1SMatt Arsenault; CHECK-LABEL: exp10_v3f64: 275b14e83d1SMatt Arsenault; CHECK: @ %bb.0: 276b14e83d1SMatt Arsenault; CHECK-NEXT: push {r4, lr} 277b14e83d1SMatt Arsenault; CHECK-NEXT: vpush {d8, d9} 278b14e83d1SMatt Arsenault; CHECK-NEXT: mov r4, r0 279b14e83d1SMatt Arsenault; CHECK-NEXT: mov r1, r3 280b14e83d1SMatt Arsenault; CHECK-NEXT: mov r0, r2 281b14e83d1SMatt Arsenault; CHECK-NEXT: bl exp10 282b14e83d1SMatt Arsenault; CHECK-NEXT: ldrd r2, r3, [sp, #24] 283b14e83d1SMatt Arsenault; CHECK-NEXT: vmov d8, r0, r1 284b14e83d1SMatt Arsenault; CHECK-NEXT: mov r1, r3 285b14e83d1SMatt Arsenault; CHECK-NEXT: mov r0, r2 286b14e83d1SMatt Arsenault; CHECK-NEXT: bl exp10 287b14e83d1SMatt Arsenault; CHECK-NEXT: ldrd r2, r3, [sp, #32] 288b14e83d1SMatt Arsenault; CHECK-NEXT: vmov d9, r0, r1 289b14e83d1SMatt Arsenault; CHECK-NEXT: mov r1, r3 290b14e83d1SMatt Arsenault; CHECK-NEXT: vst1.64 {d8, d9}, [r4:128]! 291b14e83d1SMatt Arsenault; CHECK-NEXT: mov r0, r2 292b14e83d1SMatt Arsenault; CHECK-NEXT: bl exp10 293b14e83d1SMatt Arsenault; CHECK-NEXT: strd r0, r1, [r4] 294b14e83d1SMatt Arsenault; CHECK-NEXT: vpop {d8, d9} 295b14e83d1SMatt Arsenault; CHECK-NEXT: pop {r4, pc} 296b14e83d1SMatt Arsenault %r = call <3 x double> @llvm.exp10.v3f64(<3 x double> %x) 297b14e83d1SMatt Arsenault ret <3 x double> %r 298b14e83d1SMatt Arsenault} 299b14e83d1SMatt Arsenault 300b14e83d1SMatt Arsenaultdefine <4 x double> @exp10_v4f64(<4 x double> %x) { 301b14e83d1SMatt Arsenault; CHECK-LABEL: exp10_v4f64: 302b14e83d1SMatt Arsenault; CHECK: @ %bb.0: 303b14e83d1SMatt Arsenault; CHECK-NEXT: push.w {r4, r5, r6, r7, r8, lr} 304b14e83d1SMatt Arsenault; CHECK-NEXT: vpush {d8, d9, d10, d11} 305b14e83d1SMatt Arsenault; CHECK-NEXT: mov r4, r0 306b14e83d1SMatt Arsenault; CHECK-NEXT: mov r1, r3 307b14e83d1SMatt Arsenault; CHECK-NEXT: mov r0, r2 308b14e83d1SMatt Arsenault; CHECK-NEXT: bl exp10 309b14e83d1SMatt Arsenault; CHECK-NEXT: add r2, sp, #64 310b14e83d1SMatt Arsenault; CHECK-NEXT: vmov d8, r0, r1 311b14e83d1SMatt Arsenault; CHECK-NEXT: vld1.64 {d16, d17}, [r2] 312b14e83d1SMatt Arsenault; CHECK-NEXT: vmov r2, r3, d17 313b14e83d1SMatt Arsenault; CHECK-NEXT: vmov r5, r8, d16 314b14e83d1SMatt Arsenault; CHECK-NEXT: mov r0, r2 315b14e83d1SMatt Arsenault; CHECK-NEXT: mov r1, r3 316b14e83d1SMatt Arsenault; CHECK-NEXT: bl exp10 317b14e83d1SMatt Arsenault; CHECK-NEXT: mov r7, r0 318b14e83d1SMatt Arsenault; CHECK-NEXT: mov r6, r1 319b14e83d1SMatt Arsenault; CHECK-NEXT: ldrd r0, r1, [sp, #56] 320b14e83d1SMatt Arsenault; CHECK-NEXT: bl exp10 321b14e83d1SMatt Arsenault; CHECK-NEXT: vmov d9, r0, r1 322b14e83d1SMatt Arsenault; CHECK-NEXT: mov r0, r5 323b14e83d1SMatt Arsenault; CHECK-NEXT: mov r1, r8 324b14e83d1SMatt Arsenault; CHECK-NEXT: vmov d11, r7, r6 325b14e83d1SMatt Arsenault; CHECK-NEXT: bl exp10 326b14e83d1SMatt Arsenault; CHECK-NEXT: vmov d10, r0, r1 327b14e83d1SMatt Arsenault; CHECK-NEXT: vst1.64 {d8, d9}, [r4:128]! 328b14e83d1SMatt Arsenault; CHECK-NEXT: vst1.64 {d10, d11}, [r4:128] 329b14e83d1SMatt Arsenault; CHECK-NEXT: vpop {d8, d9, d10, d11} 330b14e83d1SMatt Arsenault; CHECK-NEXT: pop.w {r4, r5, r6, r7, r8, pc} 331b14e83d1SMatt Arsenault %r = call <4 x double> @llvm.exp10.v4f64(<4 x double> %x) 332b14e83d1SMatt Arsenault ret <4 x double> %r 333b14e83d1SMatt Arsenault} 334