332 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc -mtriple=thumbv7-unknown-linux < %s | FileCheck -check-prefixes=CHECK %s3 4declare half @llvm.exp10.f16(half)5declare <1 x half> @llvm.exp10.v1f16(<1 x half>)6declare <2 x half> @llvm.exp10.v2f16(<2 x half>)7declare <3 x half> @llvm.exp10.v3f16(<3 x half>)8declare <4 x half> @llvm.exp10.v4f16(<4 x half>)9declare float @llvm.exp10.f32(float)10declare <1 x float> @llvm.exp10.v1f32(<1 x float>)11declare <2 x float> @llvm.exp10.v2f32(<2 x float>)12declare <3 x float> @llvm.exp10.v3f32(<3 x float>)13declare <4 x float> @llvm.exp10.v4f32(<4 x float>)14declare double @llvm.exp10.f64(double)15declare <1 x double> @llvm.exp10.v1f64(<1 x double>)16declare <2 x double> @llvm.exp10.v2f64(<2 x double>)17declare <3 x double> @llvm.exp10.v3f64(<3 x double>)18declare <4 x double> @llvm.exp10.v4f64(<4 x double>)19 20define half @exp10_f16(half %x) {21; CHECK-LABEL: exp10_f16:22; CHECK: @ %bb.0:23; CHECK-NEXT: push {r7, lr}24; CHECK-NEXT: bl __gnu_h2f_ieee25; CHECK-NEXT: bl exp10f26; CHECK-NEXT: bl __gnu_f2h_ieee27; CHECK-NEXT: pop {r7, pc}28 %r = call half @llvm.exp10.f16(half %x)29 ret half %r30}31 32define <1 x half> @exp10_v1f16(<1 x half> %x) {33; CHECK-LABEL: exp10_v1f16:34; CHECK: @ %bb.0:35; CHECK-NEXT: push {r7, lr}36; CHECK-NEXT: bl __gnu_f2h_ieee37; CHECK-NEXT: bl __gnu_h2f_ieee38; CHECK-NEXT: bl exp10f39; CHECK-NEXT: bl __gnu_f2h_ieee40; CHECK-NEXT: bl __gnu_h2f_ieee41; CHECK-NEXT: pop {r7, pc}42 %r = call <1 x half> @llvm.exp10.v1f16(<1 x half> %x)43 ret <1 x half> %r44}45 46define <2 x half> @exp10_v2f16(<2 x half> %x) {47; CHECK-LABEL: exp10_v2f16:48; CHECK: @ %bb.0:49; CHECK-NEXT: push {r4, lr}50; CHECK-NEXT: sub sp, #851; CHECK-NEXT: mov r4, r052; CHECK-NEXT: mov r0, r153; CHECK-NEXT: bl __gnu_h2f_ieee54; CHECK-NEXT: bl exp10f55; CHECK-NEXT: bl __gnu_f2h_ieee56; CHECK-NEXT: strh.w r0, [sp, #6]57; CHECK-NEXT: mov r0, r458; CHECK-NEXT: bl __gnu_h2f_ieee59; CHECK-NEXT: bl exp10f60; CHECK-NEXT: bl __gnu_f2h_ieee61; CHECK-NEXT: strh.w r0, [sp, #4]62; CHECK-NEXT: add r0, sp, #463; CHECK-NEXT: vld1.32 {d16[0]}, [r0:32]64; CHECK-NEXT: vmovl.u16 q8, d1665; CHECK-NEXT: vmov.32 r0, d16[0]66; CHECK-NEXT: vmov.32 r1, d16[1]67; CHECK-NEXT: add sp, #868; CHECK-NEXT: pop {r4, pc}69 %r = call <2 x half> @llvm.exp10.v2f16(<2 x half> %x)70 ret <2 x half> %r71}72 73define <3 x half> @exp10_v3f16(<3 x half> %x) {74; CHECK-LABEL: exp10_v3f16:75; CHECK: @ %bb.0:76; CHECK-NEXT: push {r4, r5, r6, lr}77; CHECK-NEXT: mov r5, r078; CHECK-NEXT: mov r0, r179; CHECK-NEXT: mov r4, r280; CHECK-NEXT: bl __gnu_h2f_ieee81; CHECK-NEXT: bl exp10f82; CHECK-NEXT: bl __gnu_f2h_ieee83; CHECK-NEXT: mov r6, r084; CHECK-NEXT: mov r0, r585; CHECK-NEXT: bl __gnu_h2f_ieee86; CHECK-NEXT: bl exp10f87; CHECK-NEXT: bl __gnu_f2h_ieee88; CHECK-NEXT: pkhbt r5, r0, r6, lsl #1689; CHECK-NEXT: mov r0, r490; CHECK-NEXT: bl __gnu_h2f_ieee91; CHECK-NEXT: bl exp10f92; CHECK-NEXT: bl __gnu_f2h_ieee93; CHECK-NEXT: uxth r0, r094; CHECK-NEXT: vmov d16, r5, r095; CHECK-NEXT: vmov.u16 r0, d16[0]96; CHECK-NEXT: vmov.u16 r1, d16[1]97; CHECK-NEXT: vmov.u16 r2, d16[2]98; CHECK-NEXT: pop {r4, r5, r6, pc}99 %r = call <3 x half> @llvm.exp10.v3f16(<3 x half> %x)100 ret <3 x half> %r101}102 103define <4 x half> @exp10_v4f16(<4 x half> %x) {104; CHECK-LABEL: exp10_v4f16:105; CHECK: @ %bb.0:106; CHECK-NEXT: push {r4, r5, r6, r7, lr}107; CHECK-NEXT: sub sp, #4108; CHECK-NEXT: mov r4, r0109; CHECK-NEXT: mov r0, r3110; CHECK-NEXT: mov r6, r2111; CHECK-NEXT: mov r5, r1112; CHECK-NEXT: bl __gnu_h2f_ieee113; CHECK-NEXT: bl exp10f114; CHECK-NEXT: bl __gnu_f2h_ieee115; CHECK-NEXT: mov r7, r0116; CHECK-NEXT: mov r0, r6117; CHECK-NEXT: bl __gnu_h2f_ieee118; CHECK-NEXT: bl exp10f119; CHECK-NEXT: bl __gnu_f2h_ieee120; CHECK-NEXT: pkhbt r6, r0, r7, lsl #16121; CHECK-NEXT: mov r0, r5122; CHECK-NEXT: bl __gnu_h2f_ieee123; CHECK-NEXT: bl exp10f124; CHECK-NEXT: bl __gnu_f2h_ieee125; CHECK-NEXT: mov r5, r0126; CHECK-NEXT: mov r0, r4127; CHECK-NEXT: bl __gnu_h2f_ieee128; CHECK-NEXT: bl exp10f129; CHECK-NEXT: bl __gnu_f2h_ieee130; CHECK-NEXT: pkhbt r0, r0, r5, lsl #16131; CHECK-NEXT: vmov d16, r0, r6132; CHECK-NEXT: vmov.u16 r0, d16[0]133; CHECK-NEXT: vmov.u16 r1, d16[1]134; CHECK-NEXT: vmov.u16 r2, d16[2]135; CHECK-NEXT: vmov.u16 r3, d16[3]136; CHECK-NEXT: add sp, #4137; CHECK-NEXT: pop {r4, r5, r6, r7, pc}138 %r = call <4 x half> @llvm.exp10.v4f16(<4 x half> %x)139 ret <4 x half> %r140}141 142define float @exp10_f32(float %x) {143; CHECK-LABEL: exp10_f32:144; CHECK: @ %bb.0:145; CHECK-NEXT: b exp10f146 %r = call float @llvm.exp10.f32(float %x)147 ret float %r148}149 150define <1 x float> @exp10_v1f32(<1 x float> %x) {151; CHECK-LABEL: exp10_v1f32:152; CHECK: @ %bb.0:153; CHECK-NEXT: push {r7, lr}154; CHECK-NEXT: bl exp10f155; CHECK-NEXT: pop {r7, pc}156 %r = call <1 x float> @llvm.exp10.v1f32(<1 x float> %x)157 ret <1 x float> %r158}159 160define <2 x float> @exp10_v2f32(<2 x float> %x) {161; CHECK-LABEL: exp10_v2f32:162; CHECK: @ %bb.0:163; CHECK-NEXT: push {r4, lr}164; CHECK-NEXT: vpush {d8}165; CHECK-NEXT: vmov d8, r0, r1166; CHECK-NEXT: vmov r0, s17167; CHECK-NEXT: bl exp10f168; CHECK-NEXT: mov r4, r0169; CHECK-NEXT: vmov r0, s16170; CHECK-NEXT: bl exp10f171; CHECK-NEXT: mov r1, r4172; CHECK-NEXT: vpop {d8}173; CHECK-NEXT: pop {r4, pc}174 %r = call <2 x float> @llvm.exp10.v2f32(<2 x float> %x)175 ret <2 x float> %r176}177 178define <3 x float> @exp10_v3f32(<3 x float> %x) {179; CHECK-LABEL: exp10_v3f32:180; CHECK: @ %bb.0:181; CHECK-NEXT: push {r4, r5, r6, lr}182; CHECK-NEXT: vpush {d8, d9}183; CHECK-NEXT: vmov d1, r2, r3184; CHECK-NEXT: mov r5, r0185; CHECK-NEXT: vmov d0, r0, r1186; CHECK-NEXT: mov r4, r1187; CHECK-NEXT: vmov r0, s2188; CHECK-NEXT: bl exp10f189; CHECK-NEXT: mov r6, r0190; CHECK-NEXT: mov r0, r4191; CHECK-NEXT: bl exp10f192; CHECK-NEXT: mov r4, r0193; CHECK-NEXT: vmov s17, r0194; CHECK-NEXT: mov r0, r5195; CHECK-NEXT: bl exp10f196; CHECK-NEXT: vmov s16, r0197; CHECK-NEXT: mov r1, r4198; CHECK-NEXT: vmov s18, r6199; CHECK-NEXT: vmov r2, r3, d9200; CHECK-NEXT: vpop {d8, d9}201; CHECK-NEXT: pop {r4, r5, r6, pc}202 %r = call <3 x float> @llvm.exp10.v3f32(<3 x float> %x)203 ret <3 x float> %r204}205 206define <4 x float> @exp10_v4f32(<4 x float> %x) {207; CHECK-LABEL: exp10_v4f32:208; CHECK: @ %bb.0:209; CHECK-NEXT: push {r4, r5, r6, r7, lr}210; CHECK-NEXT: sub sp, #4211; CHECK-NEXT: mov r6, r0212; CHECK-NEXT: mov r0, r1213; CHECK-NEXT: mov r4, r3214; CHECK-NEXT: mov r5, r2215; CHECK-NEXT: bl exp10f216; CHECK-NEXT: mov r7, r0217; CHECK-NEXT: mov r0, r4218; CHECK-NEXT: bl exp10f219; CHECK-NEXT: mov r4, r0220; CHECK-NEXT: mov r0, r5221; CHECK-NEXT: bl exp10f222; CHECK-NEXT: mov r5, r0223; CHECK-NEXT: mov r0, r6224; CHECK-NEXT: bl exp10f225; CHECK-NEXT: mov r1, r7226; CHECK-NEXT: mov r2, r5227; CHECK-NEXT: mov r3, r4228; CHECK-NEXT: add sp, #4229; CHECK-NEXT: pop {r4, r5, r6, r7, pc}230 %r = call <4 x float> @llvm.exp10.v4f32(<4 x float> %x)231 ret <4 x float> %r232}233 234define double @exp10_f64(double %x) {235; CHECK-LABEL: exp10_f64:236; CHECK: @ %bb.0:237; CHECK-NEXT: b exp10238 %r = call double @llvm.exp10.f64(double %x)239 ret double %r240}241 242; FIXME: Broken243; define <1 x double> @exp10_v1f64(<1 x double> %x) {244; %r = call <1 x double> @llvm.exp10.v1f64(<1 x double> %x)245; ret <1 x double> %r246; }247 248define <2 x double> @exp10_v2f64(<2 x double> %x) {249; CHECK-LABEL: exp10_v2f64:250; CHECK: @ %bb.0:251; CHECK-NEXT: push {r4, r5, r6, r7, lr}252; CHECK-NEXT: sub sp, #4253; CHECK-NEXT: mov r4, r3254; CHECK-NEXT: mov r5, r2255; CHECK-NEXT: bl exp10256; CHECK-NEXT: mov r6, r0257; CHECK-NEXT: mov r7, r1258; CHECK-NEXT: mov r0, r5259; CHECK-NEXT: mov r1, r4260; CHECK-NEXT: bl exp10261; CHECK-NEXT: mov r2, r0262; CHECK-NEXT: mov r3, r1263; CHECK-NEXT: mov r0, r6264; CHECK-NEXT: mov r1, r7265; CHECK-NEXT: add sp, #4266; CHECK-NEXT: pop {r4, r5, r6, r7, pc}267 %r = call <2 x double> @llvm.exp10.v2f64(<2 x double> %x)268 ret <2 x double> %r269}270 271define <3 x double> @exp10_v3f64(<3 x double> %x) {272; CHECK-LABEL: exp10_v3f64:273; CHECK: @ %bb.0:274; CHECK-NEXT: push {r4, lr}275; CHECK-NEXT: vpush {d8, d9}276; CHECK-NEXT: mov r4, r0277; CHECK-NEXT: mov r1, r3278; CHECK-NEXT: mov r0, r2279; CHECK-NEXT: bl exp10280; CHECK-NEXT: ldrd r2, r3, [sp, #24]281; CHECK-NEXT: vmov d8, r0, r1282; CHECK-NEXT: mov r1, r3283; CHECK-NEXT: mov r0, r2284; CHECK-NEXT: bl exp10285; CHECK-NEXT: ldrd r2, r3, [sp, #32]286; CHECK-NEXT: vmov d9, r0, r1287; CHECK-NEXT: mov r1, r3288; CHECK-NEXT: vst1.64 {d8, d9}, [r4:128]!289; CHECK-NEXT: mov r0, r2290; CHECK-NEXT: bl exp10291; CHECK-NEXT: strd r0, r1, [r4]292; CHECK-NEXT: vpop {d8, d9}293; CHECK-NEXT: pop {r4, pc}294 %r = call <3 x double> @llvm.exp10.v3f64(<3 x double> %x)295 ret <3 x double> %r296}297 298define <4 x double> @exp10_v4f64(<4 x double> %x) {299; CHECK-LABEL: exp10_v4f64:300; CHECK: @ %bb.0:301; CHECK-NEXT: push.w {r4, r5, r6, r7, r8, lr}302; CHECK-NEXT: vpush {d8, d9, d10, d11}303; CHECK-NEXT: mov r4, r0304; CHECK-NEXT: mov r1, r3305; CHECK-NEXT: mov r0, r2306; CHECK-NEXT: bl exp10307; CHECK-NEXT: add r2, sp, #64308; CHECK-NEXT: vmov d8, r0, r1309; CHECK-NEXT: vld1.64 {d16, d17}, [r2]310; CHECK-NEXT: vmov r2, r3, d17311; CHECK-NEXT: vmov r5, r8, d16312; CHECK-NEXT: mov r0, r2313; CHECK-NEXT: mov r1, r3314; CHECK-NEXT: bl exp10315; CHECK-NEXT: mov r7, r0316; CHECK-NEXT: mov r6, r1317; CHECK-NEXT: ldrd r0, r1, [sp, #56]318; CHECK-NEXT: bl exp10319; CHECK-NEXT: vmov d9, r0, r1320; CHECK-NEXT: mov r0, r5321; CHECK-NEXT: mov r1, r8322; CHECK-NEXT: vmov d11, r7, r6323; CHECK-NEXT: bl exp10324; CHECK-NEXT: vmov d10, r0, r1325; CHECK-NEXT: vst1.64 {d8, d9}, [r4:128]!326; CHECK-NEXT: vst1.64 {d10, d11}, [r4:128]327; CHECK-NEXT: vpop {d8, d9, d10, d11}328; CHECK-NEXT: pop.w {r4, r5, r6, r7, r8, pc}329 %r = call <4 x double> @llvm.exp10.v4f64(<4 x double> %x)330 ret <4 x double> %r331}332