737 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc -global-isel=0 -mtriple=aarch64-unknown-unknown < %s | FileCheck -check-prefixes=CHECK,CVT,SDAG,CVT-SDAG %s3; RUN: llc -global-isel=0 -mtriple=aarch64-unknown-unknown -mattr=+fullfp16 < %s | FileCheck -check-prefixes=CHECK,FP16,SDAG,FP16-SDAG %s4; RUN: llc -global-isel=1 -mtriple=aarch64-unknown-unknown < %s | FileCheck -check-prefixes=CHECK,CVT,GISEL,CVT-GISEL %s5; RUN: llc -global-isel=1 -mtriple=aarch64-unknown-unknown -mattr=+fullfp16 < %s | FileCheck -check-prefixes=CHECK,FP16,GISEL,FP16-GISEL %s6 7declare half @llvm.exp10.f16(half)8declare <1 x half> @llvm.exp10.v1f16(<1 x half>)9declare <2 x half> @llvm.exp10.v2f16(<2 x half>)10declare <3 x half> @llvm.exp10.v3f16(<3 x half>)11declare <4 x half> @llvm.exp10.v4f16(<4 x half>)12declare float @llvm.exp10.f32(float)13declare <1 x float> @llvm.exp10.v1f32(<1 x float>)14declare <2 x float> @llvm.exp10.v2f32(<2 x float>)15declare <3 x float> @llvm.exp10.v3f32(<3 x float>)16declare <4 x float> @llvm.exp10.v4f32(<4 x float>)17declare double @llvm.exp10.f64(double)18declare <1 x double> @llvm.exp10.v1f64(<1 x double>)19declare <2 x double> @llvm.exp10.v2f64(<2 x double>)20declare <3 x double> @llvm.exp10.v3f64(<3 x double>)21declare <4 x double> @llvm.exp10.v4f64(<4 x double>)22 23define half @exp10_f16(half %x) {24; CHECK-LABEL: exp10_f16:25; CHECK: // %bb.0:26; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill27; CHECK-NEXT: .cfi_def_cfa_offset 1628; CHECK-NEXT: .cfi_offset w30, -1629; CHECK-NEXT: fcvt s0, h030; CHECK-NEXT: bl exp10f31; CHECK-NEXT: fcvt h0, s032; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload33; CHECK-NEXT: ret34 %r = call half @llvm.exp10.f16(half %x)35 ret half %r36}37 38define <1 x half> @exp10_v1f16(<1 x half> %x) {39; CHECK-LABEL: exp10_v1f16:40; CHECK: // %bb.0:41; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill42; CHECK-NEXT: .cfi_def_cfa_offset 1643; CHECK-NEXT: .cfi_offset w30, -1644; CHECK-NEXT: fcvt s0, h045; CHECK-NEXT: bl exp10f46; CHECK-NEXT: fcvt h0, s047; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload48; CHECK-NEXT: ret49 %r = call <1 x half> @llvm.exp10.v1f16(<1 x half> %x)50 ret <1 x half> %r51}52 53define <2 x half> @exp10_v2f16(<2 x half> %x) {54; SDAG-LABEL: exp10_v2f16:55; SDAG: // %bb.0:56; SDAG-NEXT: sub sp, sp, #4857; SDAG-NEXT: str x30, [sp, #32] // 8-byte Spill58; SDAG-NEXT: .cfi_def_cfa_offset 4859; SDAG-NEXT: .cfi_offset w30, -1660; SDAG-NEXT: // kill: def $d0 killed $d0 def $q061; SDAG-NEXT: mov h1, v0.h[1]62; SDAG-NEXT: str q0, [sp, #16] // 16-byte Spill63; SDAG-NEXT: fcvt s0, h164; SDAG-NEXT: bl exp10f65; SDAG-NEXT: ldr q1, [sp, #16] // 16-byte Reload66; SDAG-NEXT: fcvt h0, s067; SDAG-NEXT: fcvt s1, h168; SDAG-NEXT: str q0, [sp] // 16-byte Spill69; SDAG-NEXT: fmov s0, s170; SDAG-NEXT: bl exp10f71; SDAG-NEXT: ldr q1, [sp, #16] // 16-byte Reload72; SDAG-NEXT: fcvt h2, s073; SDAG-NEXT: mov h1, v1.h[2]74; SDAG-NEXT: fcvt s0, h175; SDAG-NEXT: ldr q1, [sp] // 16-byte Reload76; SDAG-NEXT: mov v2.h[1], v1.h[0]77; SDAG-NEXT: str q2, [sp] // 16-byte Spill78; SDAG-NEXT: bl exp10f79; SDAG-NEXT: ldr q1, [sp, #16] // 16-byte Reload80; SDAG-NEXT: fcvt h2, s081; SDAG-NEXT: mov h1, v1.h[3]82; SDAG-NEXT: fcvt s0, h183; SDAG-NEXT: ldr q1, [sp] // 16-byte Reload84; SDAG-NEXT: mov v1.h[2], v2.h[0]85; SDAG-NEXT: str q1, [sp] // 16-byte Spill86; SDAG-NEXT: bl exp10f87; SDAG-NEXT: fcvt h1, s088; SDAG-NEXT: ldr q0, [sp] // 16-byte Reload89; SDAG-NEXT: ldr x30, [sp, #32] // 8-byte Reload90; SDAG-NEXT: mov v0.h[3], v1.h[0]91; SDAG-NEXT: // kill: def $d0 killed $d0 killed $q092; SDAG-NEXT: add sp, sp, #4893; SDAG-NEXT: ret94;95; GISEL-LABEL: exp10_v2f16:96; GISEL: // %bb.0:97; GISEL-NEXT: sub sp, sp, #3298; GISEL-NEXT: str d8, [sp, #16] // 8-byte Spill99; GISEL-NEXT: str x30, [sp, #24] // 8-byte Spill100; GISEL-NEXT: .cfi_def_cfa_offset 32101; GISEL-NEXT: .cfi_offset w30, -8102; GISEL-NEXT: .cfi_offset b8, -16103; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0104; GISEL-NEXT: mov h8, v0.h[1]105; GISEL-NEXT: fcvt s0, h0106; GISEL-NEXT: bl exp10f107; GISEL-NEXT: fcvt s1, h8108; GISEL-NEXT: fcvt h0, s0109; GISEL-NEXT: str q0, [sp] // 16-byte Spill110; GISEL-NEXT: fmov s0, s1111; GISEL-NEXT: bl exp10f112; GISEL-NEXT: fcvt h1, s0113; GISEL-NEXT: ldr q0, [sp] // 16-byte Reload114; GISEL-NEXT: ldr x30, [sp, #24] // 8-byte Reload115; GISEL-NEXT: ldr d8, [sp, #16] // 8-byte Reload116; GISEL-NEXT: mov v0.h[1], v1.h[0]117; GISEL-NEXT: // kill: def $d0 killed $d0 killed $q0118; GISEL-NEXT: add sp, sp, #32119; GISEL-NEXT: ret120 %r = call <2 x half> @llvm.exp10.v2f16(<2 x half> %x)121 ret <2 x half> %r122}123 124define <3 x half> @exp10_v3f16(<3 x half> %x) {125; SDAG-LABEL: exp10_v3f16:126; SDAG: // %bb.0:127; SDAG-NEXT: sub sp, sp, #48128; SDAG-NEXT: str x30, [sp, #32] // 8-byte Spill129; SDAG-NEXT: .cfi_def_cfa_offset 48130; SDAG-NEXT: .cfi_offset w30, -16131; SDAG-NEXT: // kill: def $d0 killed $d0 def $q0132; SDAG-NEXT: mov h1, v0.h[1]133; SDAG-NEXT: str q0, [sp, #16] // 16-byte Spill134; SDAG-NEXT: fcvt s0, h1135; SDAG-NEXT: bl exp10f136; SDAG-NEXT: ldr q1, [sp, #16] // 16-byte Reload137; SDAG-NEXT: fcvt h0, s0138; SDAG-NEXT: fcvt s1, h1139; SDAG-NEXT: str q0, [sp] // 16-byte Spill140; SDAG-NEXT: fmov s0, s1141; SDAG-NEXT: bl exp10f142; SDAG-NEXT: ldr q1, [sp, #16] // 16-byte Reload143; SDAG-NEXT: fcvt h2, s0144; SDAG-NEXT: mov h1, v1.h[2]145; SDAG-NEXT: fcvt s0, h1146; SDAG-NEXT: ldr q1, [sp] // 16-byte Reload147; SDAG-NEXT: mov v2.h[1], v1.h[0]148; SDAG-NEXT: str q2, [sp] // 16-byte Spill149; SDAG-NEXT: bl exp10f150; SDAG-NEXT: ldr q1, [sp, #16] // 16-byte Reload151; SDAG-NEXT: fcvt h2, s0152; SDAG-NEXT: mov h1, v1.h[3]153; SDAG-NEXT: fcvt s0, h1154; SDAG-NEXT: ldr q1, [sp] // 16-byte Reload155; SDAG-NEXT: mov v1.h[2], v2.h[0]156; SDAG-NEXT: str q1, [sp] // 16-byte Spill157; SDAG-NEXT: bl exp10f158; SDAG-NEXT: fcvt h1, s0159; SDAG-NEXT: ldr q0, [sp] // 16-byte Reload160; SDAG-NEXT: ldr x30, [sp, #32] // 8-byte Reload161; SDAG-NEXT: mov v0.h[3], v1.h[0]162; SDAG-NEXT: // kill: def $d0 killed $d0 killed $q0163; SDAG-NEXT: add sp, sp, #48164; SDAG-NEXT: ret165;166; GISEL-LABEL: exp10_v3f16:167; GISEL: // %bb.0:168; GISEL-NEXT: sub sp, sp, #64169; GISEL-NEXT: stp d9, d8, [sp, #32] // 16-byte Folded Spill170; GISEL-NEXT: str x30, [sp, #48] // 8-byte Spill171; GISEL-NEXT: .cfi_def_cfa_offset 64172; GISEL-NEXT: .cfi_offset w30, -16173; GISEL-NEXT: .cfi_offset b8, -24174; GISEL-NEXT: .cfi_offset b9, -32175; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0176; GISEL-NEXT: mov h8, v0.h[1]177; GISEL-NEXT: mov h9, v0.h[2]178; GISEL-NEXT: fcvt s0, h0179; GISEL-NEXT: bl exp10f180; GISEL-NEXT: fcvt s1, h8181; GISEL-NEXT: fcvt h0, s0182; GISEL-NEXT: str q0, [sp, #16] // 16-byte Spill183; GISEL-NEXT: fmov s0, s1184; GISEL-NEXT: bl exp10f185; GISEL-NEXT: fcvt s1, h9186; GISEL-NEXT: fcvt h0, s0187; GISEL-NEXT: str q0, [sp] // 16-byte Spill188; GISEL-NEXT: fmov s0, s1189; GISEL-NEXT: bl exp10f190; GISEL-NEXT: ldp q2, q1, [sp] // 32-byte Folded Reload191; GISEL-NEXT: fcvt h0, s0192; GISEL-NEXT: ldp d9, d8, [sp, #32] // 16-byte Folded Reload193; GISEL-NEXT: ldr x30, [sp, #48] // 8-byte Reload194; GISEL-NEXT: mov v1.h[1], v2.h[0]195; GISEL-NEXT: mov v1.h[2], v0.h[0]196; GISEL-NEXT: mov v0.16b, v1.16b197; GISEL-NEXT: // kill: def $d0 killed $d0 killed $q0198; GISEL-NEXT: add sp, sp, #64199; GISEL-NEXT: ret200 %r = call <3 x half> @llvm.exp10.v3f16(<3 x half> %x)201 ret <3 x half> %r202}203 204define <4 x half> @exp10_v4f16(<4 x half> %x) {205; SDAG-LABEL: exp10_v4f16:206; SDAG: // %bb.0:207; SDAG-NEXT: sub sp, sp, #48208; SDAG-NEXT: str x30, [sp, #32] // 8-byte Spill209; SDAG-NEXT: .cfi_def_cfa_offset 48210; SDAG-NEXT: .cfi_offset w30, -16211; SDAG-NEXT: // kill: def $d0 killed $d0 def $q0212; SDAG-NEXT: mov h1, v0.h[1]213; SDAG-NEXT: str q0, [sp, #16] // 16-byte Spill214; SDAG-NEXT: fcvt s0, h1215; SDAG-NEXT: bl exp10f216; SDAG-NEXT: ldr q1, [sp, #16] // 16-byte Reload217; SDAG-NEXT: fcvt h0, s0218; SDAG-NEXT: fcvt s1, h1219; SDAG-NEXT: str q0, [sp] // 16-byte Spill220; SDAG-NEXT: fmov s0, s1221; SDAG-NEXT: bl exp10f222; SDAG-NEXT: ldr q1, [sp, #16] // 16-byte Reload223; SDAG-NEXT: fcvt h2, s0224; SDAG-NEXT: mov h1, v1.h[2]225; SDAG-NEXT: fcvt s0, h1226; SDAG-NEXT: ldr q1, [sp] // 16-byte Reload227; SDAG-NEXT: mov v2.h[1], v1.h[0]228; SDAG-NEXT: str q2, [sp] // 16-byte Spill229; SDAG-NEXT: bl exp10f230; SDAG-NEXT: ldr q1, [sp, #16] // 16-byte Reload231; SDAG-NEXT: fcvt h2, s0232; SDAG-NEXT: mov h1, v1.h[3]233; SDAG-NEXT: fcvt s0, h1234; SDAG-NEXT: ldr q1, [sp] // 16-byte Reload235; SDAG-NEXT: mov v1.h[2], v2.h[0]236; SDAG-NEXT: str q1, [sp] // 16-byte Spill237; SDAG-NEXT: bl exp10f238; SDAG-NEXT: fcvt h1, s0239; SDAG-NEXT: ldr q0, [sp] // 16-byte Reload240; SDAG-NEXT: ldr x30, [sp, #32] // 8-byte Reload241; SDAG-NEXT: mov v0.h[3], v1.h[0]242; SDAG-NEXT: // kill: def $d0 killed $d0 killed $q0243; SDAG-NEXT: add sp, sp, #48244; SDAG-NEXT: ret245;246; GISEL-LABEL: exp10_v4f16:247; GISEL: // %bb.0:248; GISEL-NEXT: sub sp, sp, #80249; GISEL-NEXT: str d10, [sp, #48] // 8-byte Spill250; GISEL-NEXT: stp d9, d8, [sp, #56] // 16-byte Folded Spill251; GISEL-NEXT: str x30, [sp, #72] // 8-byte Spill252; GISEL-NEXT: .cfi_def_cfa_offset 80253; GISEL-NEXT: .cfi_offset w30, -8254; GISEL-NEXT: .cfi_offset b8, -16255; GISEL-NEXT: .cfi_offset b9, -24256; GISEL-NEXT: .cfi_offset b10, -32257; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0258; GISEL-NEXT: mov h8, v0.h[1]259; GISEL-NEXT: mov h9, v0.h[2]260; GISEL-NEXT: mov h10, v0.h[3]261; GISEL-NEXT: fcvt s0, h0262; GISEL-NEXT: bl exp10f263; GISEL-NEXT: fcvt s1, h8264; GISEL-NEXT: fcvt h0, s0265; GISEL-NEXT: str q0, [sp, #32] // 16-byte Spill266; GISEL-NEXT: fmov s0, s1267; GISEL-NEXT: bl exp10f268; GISEL-NEXT: fcvt s1, h9269; GISEL-NEXT: fcvt h0, s0270; GISEL-NEXT: str q0, [sp] // 16-byte Spill271; GISEL-NEXT: fmov s0, s1272; GISEL-NEXT: bl exp10f273; GISEL-NEXT: fcvt s1, h10274; GISEL-NEXT: fcvt h0, s0275; GISEL-NEXT: str q0, [sp, #16] // 16-byte Spill276; GISEL-NEXT: fmov s0, s1277; GISEL-NEXT: bl exp10f278; GISEL-NEXT: ldp q3, q2, [sp] // 32-byte Folded Reload279; GISEL-NEXT: fcvt h0, s0280; GISEL-NEXT: ldr q1, [sp, #32] // 16-byte Reload281; GISEL-NEXT: ldp d9, d8, [sp, #56] // 16-byte Folded Reload282; GISEL-NEXT: ldr x30, [sp, #72] // 8-byte Reload283; GISEL-NEXT: ldr d10, [sp, #48] // 8-byte Reload284; GISEL-NEXT: mov v1.h[1], v3.h[0]285; GISEL-NEXT: mov v1.h[2], v2.h[0]286; GISEL-NEXT: mov v1.h[3], v0.h[0]287; GISEL-NEXT: mov v0.16b, v1.16b288; GISEL-NEXT: // kill: def $d0 killed $d0 killed $q0289; GISEL-NEXT: add sp, sp, #80290; GISEL-NEXT: ret291 %r = call <4 x half> @llvm.exp10.v4f16(<4 x half> %x)292 ret <4 x half> %r293}294 295define float @exp10_f32(float %x) {296; CHECK-LABEL: exp10_f32:297; CHECK: // %bb.0:298; CHECK-NEXT: b exp10f299 %r = call float @llvm.exp10.f32(float %x)300 ret float %r301}302 303define <1 x float> @exp10_v1f32(<1 x float> %x) {304; SDAG-LABEL: exp10_v1f32:305; SDAG: // %bb.0:306; SDAG-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill307; SDAG-NEXT: .cfi_def_cfa_offset 16308; SDAG-NEXT: .cfi_offset w30, -16309; SDAG-NEXT: // kill: def $d0 killed $d0 def $q0310; SDAG-NEXT: // kill: def $s0 killed $s0 killed $q0311; SDAG-NEXT: bl exp10f312; SDAG-NEXT: // kill: def $s0 killed $s0 def $d0313; SDAG-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload314; SDAG-NEXT: ret315;316; GISEL-LABEL: exp10_v1f32:317; GISEL: // %bb.0:318; GISEL-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill319; GISEL-NEXT: .cfi_def_cfa_offset 16320; GISEL-NEXT: .cfi_offset w30, -16321; GISEL-NEXT: // kill: def $s0 killed $s0 killed $d0322; GISEL-NEXT: bl exp10f323; GISEL-NEXT: // kill: def $s0 killed $s0 def $d0324; GISEL-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload325; GISEL-NEXT: ret326 %r = call <1 x float> @llvm.exp10.v1f32(<1 x float> %x)327 ret <1 x float> %r328}329 330define <2 x float> @exp10_v2f32(<2 x float> %x) {331; SDAG-LABEL: exp10_v2f32:332; SDAG: // %bb.0:333; SDAG-NEXT: sub sp, sp, #48334; SDAG-NEXT: str x30, [sp, #32] // 8-byte Spill335; SDAG-NEXT: .cfi_def_cfa_offset 48336; SDAG-NEXT: .cfi_offset w30, -16337; SDAG-NEXT: // kill: def $d0 killed $d0 def $q0338; SDAG-NEXT: str q0, [sp] // 16-byte Spill339; SDAG-NEXT: mov s0, v0.s[1]340; SDAG-NEXT: bl exp10f341; SDAG-NEXT: // kill: def $s0 killed $s0 def $q0342; SDAG-NEXT: str q0, [sp, #16] // 16-byte Spill343; SDAG-NEXT: ldr q0, [sp] // 16-byte Reload344; SDAG-NEXT: // kill: def $s0 killed $s0 killed $q0345; SDAG-NEXT: bl exp10f346; SDAG-NEXT: ldr q1, [sp, #16] // 16-byte Reload347; SDAG-NEXT: // kill: def $s0 killed $s0 def $q0348; SDAG-NEXT: ldr x30, [sp, #32] // 8-byte Reload349; SDAG-NEXT: mov v0.s[1], v1.s[0]350; SDAG-NEXT: // kill: def $d0 killed $d0 killed $q0351; SDAG-NEXT: add sp, sp, #48352; SDAG-NEXT: ret353;354; GISEL-LABEL: exp10_v2f32:355; GISEL: // %bb.0:356; GISEL-NEXT: sub sp, sp, #32357; GISEL-NEXT: str d8, [sp, #16] // 8-byte Spill358; GISEL-NEXT: str x30, [sp, #24] // 8-byte Spill359; GISEL-NEXT: .cfi_def_cfa_offset 32360; GISEL-NEXT: .cfi_offset w30, -8361; GISEL-NEXT: .cfi_offset b8, -16362; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0363; GISEL-NEXT: mov s8, v0.s[1]364; GISEL-NEXT: // kill: def $s0 killed $s0 killed $q0365; GISEL-NEXT: bl exp10f366; GISEL-NEXT: // kill: def $s0 killed $s0 def $q0367; GISEL-NEXT: str q0, [sp] // 16-byte Spill368; GISEL-NEXT: fmov s0, s8369; GISEL-NEXT: bl exp10f370; GISEL-NEXT: ldr q1, [sp] // 16-byte Reload371; GISEL-NEXT: // kill: def $s0 killed $s0 def $q0372; GISEL-NEXT: ldr x30, [sp, #24] // 8-byte Reload373; GISEL-NEXT: ldr d8, [sp, #16] // 8-byte Reload374; GISEL-NEXT: mov v1.s[1], v0.s[0]375; GISEL-NEXT: fmov d0, d1376; GISEL-NEXT: add sp, sp, #32377; GISEL-NEXT: ret378 %r = call <2 x float> @llvm.exp10.v2f32(<2 x float> %x)379 ret <2 x float> %r380}381 382define <3 x float> @exp10_v3f32(<3 x float> %x) {383; SDAG-LABEL: exp10_v3f32:384; SDAG: // %bb.0:385; SDAG-NEXT: sub sp, sp, #48386; SDAG-NEXT: str x30, [sp, #32] // 8-byte Spill387; SDAG-NEXT: .cfi_def_cfa_offset 48388; SDAG-NEXT: .cfi_offset w30, -16389; SDAG-NEXT: str q0, [sp, #16] // 16-byte Spill390; SDAG-NEXT: mov s0, v0.s[1]391; SDAG-NEXT: bl exp10f392; SDAG-NEXT: // kill: def $s0 killed $s0 def $q0393; SDAG-NEXT: str q0, [sp] // 16-byte Spill394; SDAG-NEXT: ldr q0, [sp, #16] // 16-byte Reload395; SDAG-NEXT: // kill: def $s0 killed $s0 killed $q0396; SDAG-NEXT: bl exp10f397; SDAG-NEXT: ldr q1, [sp] // 16-byte Reload398; SDAG-NEXT: // kill: def $s0 killed $s0 def $q0399; SDAG-NEXT: mov v0.s[1], v1.s[0]400; SDAG-NEXT: str q0, [sp] // 16-byte Spill401; SDAG-NEXT: ldr q0, [sp, #16] // 16-byte Reload402; SDAG-NEXT: mov s0, v0.s[2]403; SDAG-NEXT: bl exp10f404; SDAG-NEXT: ldr q1, [sp] // 16-byte Reload405; SDAG-NEXT: // kill: def $s0 killed $s0 def $q0406; SDAG-NEXT: ldr x30, [sp, #32] // 8-byte Reload407; SDAG-NEXT: mov v1.s[2], v0.s[0]408; SDAG-NEXT: mov v0.16b, v1.16b409; SDAG-NEXT: add sp, sp, #48410; SDAG-NEXT: ret411;412; GISEL-LABEL: exp10_v3f32:413; GISEL: // %bb.0:414; GISEL-NEXT: sub sp, sp, #64415; GISEL-NEXT: stp d9, d8, [sp, #32] // 16-byte Folded Spill416; GISEL-NEXT: str x30, [sp, #48] // 8-byte Spill417; GISEL-NEXT: .cfi_def_cfa_offset 64418; GISEL-NEXT: .cfi_offset w30, -16419; GISEL-NEXT: .cfi_offset b8, -24420; GISEL-NEXT: .cfi_offset b9, -32421; GISEL-NEXT: mov s8, v0.s[1]422; GISEL-NEXT: mov s9, v0.s[2]423; GISEL-NEXT: // kill: def $s0 killed $s0 killed $q0424; GISEL-NEXT: bl exp10f425; GISEL-NEXT: // kill: def $s0 killed $s0 def $q0426; GISEL-NEXT: str q0, [sp, #16] // 16-byte Spill427; GISEL-NEXT: fmov s0, s8428; GISEL-NEXT: bl exp10f429; GISEL-NEXT: // kill: def $s0 killed $s0 def $q0430; GISEL-NEXT: str q0, [sp] // 16-byte Spill431; GISEL-NEXT: fmov s0, s9432; GISEL-NEXT: bl exp10f433; GISEL-NEXT: ldp q2, q1, [sp] // 32-byte Folded Reload434; GISEL-NEXT: // kill: def $s0 killed $s0 def $q0435; GISEL-NEXT: ldr x30, [sp, #48] // 8-byte Reload436; GISEL-NEXT: ldp d9, d8, [sp, #32] // 16-byte Folded Reload437; GISEL-NEXT: mov v1.s[1], v2.s[0]438; GISEL-NEXT: mov v1.s[2], v0.s[0]439; GISEL-NEXT: mov v0.16b, v1.16b440; GISEL-NEXT: add sp, sp, #64441; GISEL-NEXT: ret442 %r = call <3 x float> @llvm.exp10.v3f32(<3 x float> %x)443 ret <3 x float> %r444}445 446define <4 x float> @exp10_v4f32(<4 x float> %x) {447; SDAG-LABEL: exp10_v4f32:448; SDAG: // %bb.0:449; SDAG-NEXT: sub sp, sp, #48450; SDAG-NEXT: str x30, [sp, #32] // 8-byte Spill451; SDAG-NEXT: .cfi_def_cfa_offset 48452; SDAG-NEXT: .cfi_offset w30, -16453; SDAG-NEXT: str q0, [sp, #16] // 16-byte Spill454; SDAG-NEXT: mov s0, v0.s[1]455; SDAG-NEXT: bl exp10f456; SDAG-NEXT: // kill: def $s0 killed $s0 def $q0457; SDAG-NEXT: str q0, [sp] // 16-byte Spill458; SDAG-NEXT: ldr q0, [sp, #16] // 16-byte Reload459; SDAG-NEXT: // kill: def $s0 killed $s0 killed $q0460; SDAG-NEXT: bl exp10f461; SDAG-NEXT: ldr q1, [sp] // 16-byte Reload462; SDAG-NEXT: // kill: def $s0 killed $s0 def $q0463; SDAG-NEXT: mov v0.s[1], v1.s[0]464; SDAG-NEXT: str q0, [sp] // 16-byte Spill465; SDAG-NEXT: ldr q0, [sp, #16] // 16-byte Reload466; SDAG-NEXT: mov s0, v0.s[2]467; SDAG-NEXT: bl exp10f468; SDAG-NEXT: ldr q1, [sp] // 16-byte Reload469; SDAG-NEXT: // kill: def $s0 killed $s0 def $q0470; SDAG-NEXT: mov v1.s[2], v0.s[0]471; SDAG-NEXT: ldr q0, [sp, #16] // 16-byte Reload472; SDAG-NEXT: mov s0, v0.s[3]473; SDAG-NEXT: str q1, [sp] // 16-byte Spill474; SDAG-NEXT: bl exp10f475; SDAG-NEXT: ldr q1, [sp] // 16-byte Reload476; SDAG-NEXT: // kill: def $s0 killed $s0 def $q0477; SDAG-NEXT: ldr x30, [sp, #32] // 8-byte Reload478; SDAG-NEXT: mov v1.s[3], v0.s[0]479; SDAG-NEXT: mov v0.16b, v1.16b480; SDAG-NEXT: add sp, sp, #48481; SDAG-NEXT: ret482;483; GISEL-LABEL: exp10_v4f32:484; GISEL: // %bb.0:485; GISEL-NEXT: sub sp, sp, #80486; GISEL-NEXT: str d10, [sp, #48] // 8-byte Spill487; GISEL-NEXT: stp d9, d8, [sp, #56] // 16-byte Folded Spill488; GISEL-NEXT: str x30, [sp, #72] // 8-byte Spill489; GISEL-NEXT: .cfi_def_cfa_offset 80490; GISEL-NEXT: .cfi_offset w30, -8491; GISEL-NEXT: .cfi_offset b8, -16492; GISEL-NEXT: .cfi_offset b9, -24493; GISEL-NEXT: .cfi_offset b10, -32494; GISEL-NEXT: mov s8, v0.s[1]495; GISEL-NEXT: mov s9, v0.s[2]496; GISEL-NEXT: mov s10, v0.s[3]497; GISEL-NEXT: // kill: def $s0 killed $s0 killed $q0498; GISEL-NEXT: bl exp10f499; GISEL-NEXT: // kill: def $s0 killed $s0 def $q0500; GISEL-NEXT: str q0, [sp, #32] // 16-byte Spill501; GISEL-NEXT: fmov s0, s8502; GISEL-NEXT: bl exp10f503; GISEL-NEXT: // kill: def $s0 killed $s0 def $q0504; GISEL-NEXT: str q0, [sp, #16] // 16-byte Spill505; GISEL-NEXT: fmov s0, s9506; GISEL-NEXT: bl exp10f507; GISEL-NEXT: // kill: def $s0 killed $s0 def $q0508; GISEL-NEXT: str q0, [sp] // 16-byte Spill509; GISEL-NEXT: fmov s0, s10510; GISEL-NEXT: bl exp10f511; GISEL-NEXT: ldp q2, q1, [sp, #16] // 32-byte Folded Reload512; GISEL-NEXT: // kill: def $s0 killed $s0 def $q0513; GISEL-NEXT: ldr x30, [sp, #72] // 8-byte Reload514; GISEL-NEXT: ldp d9, d8, [sp, #56] // 16-byte Folded Reload515; GISEL-NEXT: ldr d10, [sp, #48] // 8-byte Reload516; GISEL-NEXT: mov v1.s[1], v2.s[0]517; GISEL-NEXT: ldr q2, [sp] // 16-byte Reload518; GISEL-NEXT: mov v1.s[2], v2.s[0]519; GISEL-NEXT: mov v1.s[3], v0.s[0]520; GISEL-NEXT: mov v0.16b, v1.16b521; GISEL-NEXT: add sp, sp, #80522; GISEL-NEXT: ret523 %r = call <4 x float> @llvm.exp10.v4f32(<4 x float> %x)524 ret <4 x float> %r525}526 527define double @exp10_f64(double %x) {528; CHECK-LABEL: exp10_f64:529; CHECK: // %bb.0:530; CHECK-NEXT: b exp10531 %r = call double @llvm.exp10.f64(double %x)532 ret double %r533}534 535define <1 x double> @exp10_v1f64(<1 x double> %x) {536; CHECK-LABEL: exp10_v1f64:537; CHECK: // %bb.0:538; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill539; CHECK-NEXT: .cfi_def_cfa_offset 16540; CHECK-NEXT: .cfi_offset w30, -16541; CHECK-NEXT: bl exp10542; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload543; CHECK-NEXT: ret544 %r = call <1 x double> @llvm.exp10.v1f64(<1 x double> %x)545 ret <1 x double> %r546}547 548define <2 x double> @exp10_v2f64(<2 x double> %x) {549; SDAG-LABEL: exp10_v2f64:550; SDAG: // %bb.0:551; SDAG-NEXT: sub sp, sp, #48552; SDAG-NEXT: str x30, [sp, #32] // 8-byte Spill553; SDAG-NEXT: .cfi_def_cfa_offset 48554; SDAG-NEXT: .cfi_offset w30, -16555; SDAG-NEXT: str q0, [sp] // 16-byte Spill556; SDAG-NEXT: mov d0, v0.d[1]557; SDAG-NEXT: bl exp10558; SDAG-NEXT: // kill: def $d0 killed $d0 def $q0559; SDAG-NEXT: str q0, [sp, #16] // 16-byte Spill560; SDAG-NEXT: ldr q0, [sp] // 16-byte Reload561; SDAG-NEXT: // kill: def $d0 killed $d0 killed $q0562; SDAG-NEXT: bl exp10563; SDAG-NEXT: ldr q1, [sp, #16] // 16-byte Reload564; SDAG-NEXT: // kill: def $d0 killed $d0 def $q0565; SDAG-NEXT: ldr x30, [sp, #32] // 8-byte Reload566; SDAG-NEXT: mov v0.d[1], v1.d[0]567; SDAG-NEXT: add sp, sp, #48568; SDAG-NEXT: ret569;570; GISEL-LABEL: exp10_v2f64:571; GISEL: // %bb.0:572; GISEL-NEXT: sub sp, sp, #32573; GISEL-NEXT: str d8, [sp, #16] // 8-byte Spill574; GISEL-NEXT: str x30, [sp, #24] // 8-byte Spill575; GISEL-NEXT: .cfi_def_cfa_offset 32576; GISEL-NEXT: .cfi_offset w30, -8577; GISEL-NEXT: .cfi_offset b8, -16578; GISEL-NEXT: mov d8, v0.d[1]579; GISEL-NEXT: // kill: def $d0 killed $d0 killed $q0580; GISEL-NEXT: bl exp10581; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0582; GISEL-NEXT: str q0, [sp] // 16-byte Spill583; GISEL-NEXT: fmov d0, d8584; GISEL-NEXT: bl exp10585; GISEL-NEXT: ldr q1, [sp] // 16-byte Reload586; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0587; GISEL-NEXT: ldr x30, [sp, #24] // 8-byte Reload588; GISEL-NEXT: ldr d8, [sp, #16] // 8-byte Reload589; GISEL-NEXT: mov v1.d[1], v0.d[0]590; GISEL-NEXT: mov v0.16b, v1.16b591; GISEL-NEXT: add sp, sp, #32592; GISEL-NEXT: ret593 %r = call <2 x double> @llvm.exp10.v2f64(<2 x double> %x)594 ret <2 x double> %r595}596 597define <3 x double> @exp10_v3f64(<3 x double> %x) {598; SDAG-LABEL: exp10_v3f64:599; SDAG: // %bb.0:600; SDAG-NEXT: str d10, [sp, #-32]! // 8-byte Folded Spill601; SDAG-NEXT: stp d9, d8, [sp, #8] // 16-byte Folded Spill602; SDAG-NEXT: str x30, [sp, #24] // 8-byte Spill603; SDAG-NEXT: .cfi_def_cfa_offset 32604; SDAG-NEXT: .cfi_offset w30, -8605; SDAG-NEXT: .cfi_offset b8, -16606; SDAG-NEXT: .cfi_offset b9, -24607; SDAG-NEXT: .cfi_offset b10, -32608; SDAG-NEXT: fmov d8, d2609; SDAG-NEXT: fmov d9, d1610; SDAG-NEXT: bl exp10611; SDAG-NEXT: fmov d10, d0612; SDAG-NEXT: fmov d0, d9613; SDAG-NEXT: bl exp10614; SDAG-NEXT: fmov d9, d0615; SDAG-NEXT: fmov d0, d8616; SDAG-NEXT: bl exp10617; SDAG-NEXT: fmov d1, d9618; SDAG-NEXT: ldp d9, d8, [sp, #8] // 16-byte Folded Reload619; SDAG-NEXT: ldr x30, [sp, #24] // 8-byte Reload620; SDAG-NEXT: fmov d2, d0621; SDAG-NEXT: fmov d0, d10622; SDAG-NEXT: ldr d10, [sp], #32 // 8-byte Folded Reload623; SDAG-NEXT: ret624;625; GISEL-LABEL: exp10_v3f64:626; GISEL: // %bb.0:627; GISEL-NEXT: str d10, [sp, #-32]! // 8-byte Folded Spill628; GISEL-NEXT: stp d9, d8, [sp, #8] // 16-byte Folded Spill629; GISEL-NEXT: str x30, [sp, #24] // 8-byte Spill630; GISEL-NEXT: .cfi_def_cfa_offset 32631; GISEL-NEXT: .cfi_offset w30, -8632; GISEL-NEXT: .cfi_offset b8, -16633; GISEL-NEXT: .cfi_offset b9, -24634; GISEL-NEXT: .cfi_offset b10, -32635; GISEL-NEXT: fmov d8, d1636; GISEL-NEXT: fmov d9, d2637; GISEL-NEXT: bl exp10638; GISEL-NEXT: fmov d10, d0639; GISEL-NEXT: fmov d0, d8640; GISEL-NEXT: bl exp10641; GISEL-NEXT: fmov d8, d0642; GISEL-NEXT: fmov d0, d9643; GISEL-NEXT: bl exp10644; GISEL-NEXT: fmov d1, d8645; GISEL-NEXT: ldp d9, d8, [sp, #8] // 16-byte Folded Reload646; GISEL-NEXT: ldr x30, [sp, #24] // 8-byte Reload647; GISEL-NEXT: fmov d2, d0648; GISEL-NEXT: fmov d0, d10649; GISEL-NEXT: ldr d10, [sp], #32 // 8-byte Folded Reload650; GISEL-NEXT: ret651 %r = call <3 x double> @llvm.exp10.v3f64(<3 x double> %x)652 ret <3 x double> %r653}654 655define <4 x double> @exp10_v4f64(<4 x double> %x) {656; SDAG-LABEL: exp10_v4f64:657; SDAG: // %bb.0:658; SDAG-NEXT: sub sp, sp, #64659; SDAG-NEXT: str x30, [sp, #48] // 8-byte Spill660; SDAG-NEXT: .cfi_def_cfa_offset 64661; SDAG-NEXT: .cfi_offset w30, -16662; SDAG-NEXT: str q0, [sp] // 16-byte Spill663; SDAG-NEXT: mov d0, v0.d[1]664; SDAG-NEXT: str q1, [sp, #32] // 16-byte Spill665; SDAG-NEXT: bl exp10666; SDAG-NEXT: // kill: def $d0 killed $d0 def $q0667; SDAG-NEXT: str q0, [sp, #16] // 16-byte Spill668; SDAG-NEXT: ldr q0, [sp] // 16-byte Reload669; SDAG-NEXT: // kill: def $d0 killed $d0 killed $q0670; SDAG-NEXT: bl exp10671; SDAG-NEXT: ldr q1, [sp, #16] // 16-byte Reload672; SDAG-NEXT: // kill: def $d0 killed $d0 def $q0673; SDAG-NEXT: mov v0.d[1], v1.d[0]674; SDAG-NEXT: str q0, [sp, #16] // 16-byte Spill675; SDAG-NEXT: ldr q0, [sp, #32] // 16-byte Reload676; SDAG-NEXT: mov d0, v0.d[1]677; SDAG-NEXT: bl exp10678; SDAG-NEXT: // kill: def $d0 killed $d0 def $q0679; SDAG-NEXT: str q0, [sp] // 16-byte Spill680; SDAG-NEXT: ldr q0, [sp, #32] // 16-byte Reload681; SDAG-NEXT: // kill: def $d0 killed $d0 killed $q0682; SDAG-NEXT: bl exp10683; SDAG-NEXT: fmov d1, d0684; SDAG-NEXT: ldp q2, q0, [sp] // 32-byte Folded Reload685; SDAG-NEXT: ldr x30, [sp, #48] // 8-byte Reload686; SDAG-NEXT: mov v1.d[1], v2.d[0]687; SDAG-NEXT: add sp, sp, #64688; SDAG-NEXT: ret689;690; GISEL-LABEL: exp10_v4f64:691; GISEL: // %bb.0:692; GISEL-NEXT: sub sp, sp, #80693; GISEL-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill694; GISEL-NEXT: str x30, [sp, #64] // 8-byte Spill695; GISEL-NEXT: .cfi_def_cfa_offset 80696; GISEL-NEXT: .cfi_offset w30, -16697; GISEL-NEXT: .cfi_offset b8, -24698; GISEL-NEXT: .cfi_offset b9, -32699; GISEL-NEXT: str q1, [sp] // 16-byte Spill700; GISEL-NEXT: mov d8, v0.d[1]701; GISEL-NEXT: mov d9, v1.d[1]702; GISEL-NEXT: // kill: def $d0 killed $d0 killed $q0703; GISEL-NEXT: bl exp10704; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0705; GISEL-NEXT: str q0, [sp, #32] // 16-byte Spill706; GISEL-NEXT: fmov d0, d8707; GISEL-NEXT: bl exp10708; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0709; GISEL-NEXT: str q0, [sp, #16] // 16-byte Spill710; GISEL-NEXT: ldr q0, [sp] // 16-byte Reload711; GISEL-NEXT: // kill: def $d0 killed $d0 killed $q0712; GISEL-NEXT: bl exp10713; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0714; GISEL-NEXT: str q0, [sp] // 16-byte Spill715; GISEL-NEXT: fmov d0, d9716; GISEL-NEXT: bl exp10717; GISEL-NEXT: ldp q1, q2, [sp, #16] // 32-byte Folded Reload718; GISEL-NEXT: // kill: def $d0 killed $d0 def $q0719; GISEL-NEXT: ldr x30, [sp, #64] // 8-byte Reload720; GISEL-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload721; GISEL-NEXT: mov v2.d[1], v1.d[0]722; GISEL-NEXT: ldr q1, [sp] // 16-byte Reload723; GISEL-NEXT: mov v1.d[1], v0.d[0]724; GISEL-NEXT: mov v0.16b, v2.16b725; GISEL-NEXT: add sp, sp, #80726; GISEL-NEXT: ret727 %r = call <4 x double> @llvm.exp10.v4f64(<4 x double> %x)728 ret <4 x double> %r729}730;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:731; CVT: {{.*}}732; CVT-GISEL: {{.*}}733; CVT-SDAG: {{.*}}734; FP16: {{.*}}735; FP16-GISEL: {{.*}}736; FP16-SDAG: {{.*}}737