6605 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 32; RUN: llc -mtriple=aarch64 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD3; RUN: llc -mtriple=aarch64 -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI4 5define double @exp_f64(double %a) {6; CHECK-LABEL: exp_f64:7; CHECK: // %bb.0: // %entry8; CHECK-NEXT: b exp9entry:10 %c = call double @llvm.exp.f64(double %a)11 ret double %c12}13 14define float @exp_f32(float %a) {15; CHECK-LABEL: exp_f32:16; CHECK: // %bb.0: // %entry17; CHECK-NEXT: b expf18entry:19 %c = call float @llvm.exp.f32(float %a)20 ret float %c21}22 23define half @exp_f16(half %a) {24; CHECK-LABEL: exp_f16:25; CHECK: // %bb.0: // %entry26; 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 expf31; CHECK-NEXT: fcvt h0, s032; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload33; CHECK-NEXT: ret34entry:35 %c = call half @llvm.exp.f16(half %a)36 ret half %c37}38 39define fp128 @exp_fp128(fp128 %a) {40; CHECK-LABEL: exp_fp128:41; CHECK: // %bb.0: // %entry42; CHECK-NEXT: b expl43entry:44 %c = call fp128 @llvm.exp.fp128(fp128 %a)45 ret fp128 %c46}47 48define <1 x double> @exp_v1f64(<1 x double> %a) {49; CHECK-LABEL: exp_v1f64:50; CHECK: // %bb.0: // %entry51; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill52; CHECK-NEXT: .cfi_def_cfa_offset 1653; CHECK-NEXT: .cfi_offset w30, -1654; CHECK-NEXT: bl exp55; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload56; CHECK-NEXT: ret57entry:58 %c = call <1 x double> @llvm.exp.v1f64(<1 x double> %a)59 ret <1 x double> %c60}61 62define <2 x double> @exp_v2f64(<2 x double> %a) {63; CHECK-SD-LABEL: exp_v2f64:64; CHECK-SD: // %bb.0: // %entry65; CHECK-SD-NEXT: sub sp, sp, #4866; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Spill67; CHECK-SD-NEXT: .cfi_def_cfa_offset 4868; CHECK-SD-NEXT: .cfi_offset w30, -1669; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill70; CHECK-SD-NEXT: mov d0, v0.d[1]71; CHECK-SD-NEXT: bl exp72; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q073; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill74; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload75; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q076; CHECK-SD-NEXT: bl exp77; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload78; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q079; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload80; CHECK-SD-NEXT: mov v0.d[1], v1.d[0]81; CHECK-SD-NEXT: add sp, sp, #4882; CHECK-SD-NEXT: ret83;84; CHECK-GI-LABEL: exp_v2f64:85; CHECK-GI: // %bb.0: // %entry86; CHECK-GI-NEXT: sub sp, sp, #3287; CHECK-GI-NEXT: str d8, [sp, #16] // 8-byte Spill88; CHECK-GI-NEXT: str x30, [sp, #24] // 8-byte Spill89; CHECK-GI-NEXT: .cfi_def_cfa_offset 3290; CHECK-GI-NEXT: .cfi_offset w30, -891; CHECK-GI-NEXT: .cfi_offset b8, -1692; CHECK-GI-NEXT: mov d8, v0.d[1]93; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q094; CHECK-GI-NEXT: bl exp95; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q096; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill97; CHECK-GI-NEXT: fmov d0, d898; CHECK-GI-NEXT: bl exp99; CHECK-GI-NEXT: ldr q1, [sp] // 16-byte Reload100; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0101; CHECK-GI-NEXT: ldr x30, [sp, #24] // 8-byte Reload102; CHECK-GI-NEXT: ldr d8, [sp, #16] // 8-byte Reload103; CHECK-GI-NEXT: mov v1.d[1], v0.d[0]104; CHECK-GI-NEXT: mov v0.16b, v1.16b105; CHECK-GI-NEXT: add sp, sp, #32106; CHECK-GI-NEXT: ret107entry:108 %c = call <2 x double> @llvm.exp.v2f64(<2 x double> %a)109 ret <2 x double> %c110}111 112define <3 x double> @exp_v3f64(<3 x double> %a) {113; CHECK-SD-LABEL: exp_v3f64:114; CHECK-SD: // %bb.0: // %entry115; CHECK-SD-NEXT: str d10, [sp, #-32]! // 8-byte Folded Spill116; CHECK-SD-NEXT: stp d9, d8, [sp, #8] // 16-byte Folded Spill117; CHECK-SD-NEXT: str x30, [sp, #24] // 8-byte Spill118; CHECK-SD-NEXT: .cfi_def_cfa_offset 32119; CHECK-SD-NEXT: .cfi_offset w30, -8120; CHECK-SD-NEXT: .cfi_offset b8, -16121; CHECK-SD-NEXT: .cfi_offset b9, -24122; CHECK-SD-NEXT: .cfi_offset b10, -32123; CHECK-SD-NEXT: fmov d8, d2124; CHECK-SD-NEXT: fmov d9, d1125; CHECK-SD-NEXT: bl exp126; CHECK-SD-NEXT: fmov d10, d0127; CHECK-SD-NEXT: fmov d0, d9128; CHECK-SD-NEXT: bl exp129; CHECK-SD-NEXT: fmov d9, d0130; CHECK-SD-NEXT: fmov d0, d8131; CHECK-SD-NEXT: bl exp132; CHECK-SD-NEXT: fmov d1, d9133; CHECK-SD-NEXT: ldp d9, d8, [sp, #8] // 16-byte Folded Reload134; CHECK-SD-NEXT: ldr x30, [sp, #24] // 8-byte Reload135; CHECK-SD-NEXT: fmov d2, d0136; CHECK-SD-NEXT: fmov d0, d10137; CHECK-SD-NEXT: ldr d10, [sp], #32 // 8-byte Folded Reload138; CHECK-SD-NEXT: ret139;140; CHECK-GI-LABEL: exp_v3f64:141; CHECK-GI: // %bb.0: // %entry142; CHECK-GI-NEXT: str d10, [sp, #-32]! // 8-byte Folded Spill143; CHECK-GI-NEXT: stp d9, d8, [sp, #8] // 16-byte Folded Spill144; CHECK-GI-NEXT: str x30, [sp, #24] // 8-byte Spill145; CHECK-GI-NEXT: .cfi_def_cfa_offset 32146; CHECK-GI-NEXT: .cfi_offset w30, -8147; CHECK-GI-NEXT: .cfi_offset b8, -16148; CHECK-GI-NEXT: .cfi_offset b9, -24149; CHECK-GI-NEXT: .cfi_offset b10, -32150; CHECK-GI-NEXT: fmov d8, d1151; CHECK-GI-NEXT: fmov d9, d2152; CHECK-GI-NEXT: bl exp153; CHECK-GI-NEXT: fmov d10, d0154; CHECK-GI-NEXT: fmov d0, d8155; CHECK-GI-NEXT: bl exp156; CHECK-GI-NEXT: fmov d8, d0157; CHECK-GI-NEXT: fmov d0, d9158; CHECK-GI-NEXT: bl exp159; CHECK-GI-NEXT: fmov d1, d8160; CHECK-GI-NEXT: ldp d9, d8, [sp, #8] // 16-byte Folded Reload161; CHECK-GI-NEXT: ldr x30, [sp, #24] // 8-byte Reload162; CHECK-GI-NEXT: fmov d2, d0163; CHECK-GI-NEXT: fmov d0, d10164; CHECK-GI-NEXT: ldr d10, [sp], #32 // 8-byte Folded Reload165; CHECK-GI-NEXT: ret166entry:167 %c = call <3 x double> @llvm.exp.v3f64(<3 x double> %a)168 ret <3 x double> %c169}170 171define <4 x double> @exp_v4f64(<4 x double> %a) {172; CHECK-SD-LABEL: exp_v4f64:173; CHECK-SD: // %bb.0: // %entry174; CHECK-SD-NEXT: sub sp, sp, #64175; CHECK-SD-NEXT: str x30, [sp, #48] // 8-byte Spill176; CHECK-SD-NEXT: .cfi_def_cfa_offset 64177; CHECK-SD-NEXT: .cfi_offset w30, -16178; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill179; CHECK-SD-NEXT: mov d0, v0.d[1]180; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill181; CHECK-SD-NEXT: bl exp182; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0183; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill184; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload185; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0186; CHECK-SD-NEXT: bl exp187; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload188; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0189; CHECK-SD-NEXT: mov v0.d[1], v1.d[0]190; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill191; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Reload192; CHECK-SD-NEXT: mov d0, v0.d[1]193; CHECK-SD-NEXT: bl exp194; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0195; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill196; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Reload197; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0198; CHECK-SD-NEXT: bl exp199; CHECK-SD-NEXT: fmov d1, d0200; CHECK-SD-NEXT: ldp q2, q0, [sp] // 32-byte Folded Reload201; CHECK-SD-NEXT: ldr x30, [sp, #48] // 8-byte Reload202; CHECK-SD-NEXT: mov v1.d[1], v2.d[0]203; CHECK-SD-NEXT: add sp, sp, #64204; CHECK-SD-NEXT: ret205;206; CHECK-GI-LABEL: exp_v4f64:207; CHECK-GI: // %bb.0: // %entry208; CHECK-GI-NEXT: sub sp, sp, #80209; CHECK-GI-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill210; CHECK-GI-NEXT: str x30, [sp, #64] // 8-byte Spill211; CHECK-GI-NEXT: .cfi_def_cfa_offset 80212; CHECK-GI-NEXT: .cfi_offset w30, -16213; CHECK-GI-NEXT: .cfi_offset b8, -24214; CHECK-GI-NEXT: .cfi_offset b9, -32215; CHECK-GI-NEXT: str q1, [sp] // 16-byte Spill216; CHECK-GI-NEXT: mov d8, v0.d[1]217; CHECK-GI-NEXT: mov d9, v1.d[1]218; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0219; CHECK-GI-NEXT: bl exp220; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0221; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill222; CHECK-GI-NEXT: fmov d0, d8223; CHECK-GI-NEXT: bl exp224; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0225; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill226; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Reload227; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0228; CHECK-GI-NEXT: bl exp229; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0230; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill231; CHECK-GI-NEXT: fmov d0, d9232; CHECK-GI-NEXT: bl exp233; CHECK-GI-NEXT: ldp q1, q2, [sp, #16] // 32-byte Folded Reload234; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0235; CHECK-GI-NEXT: ldr x30, [sp, #64] // 8-byte Reload236; CHECK-GI-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload237; CHECK-GI-NEXT: mov v2.d[1], v1.d[0]238; CHECK-GI-NEXT: ldr q1, [sp] // 16-byte Reload239; CHECK-GI-NEXT: mov v1.d[1], v0.d[0]240; CHECK-GI-NEXT: mov v0.16b, v2.16b241; CHECK-GI-NEXT: add sp, sp, #80242; CHECK-GI-NEXT: ret243entry:244 %c = call <4 x double> @llvm.exp.v4f64(<4 x double> %a)245 ret <4 x double> %c246}247 248define <2 x float> @exp_v2f32(<2 x float> %a) {249; CHECK-SD-LABEL: exp_v2f32:250; CHECK-SD: // %bb.0: // %entry251; CHECK-SD-NEXT: sub sp, sp, #48252; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Spill253; CHECK-SD-NEXT: .cfi_def_cfa_offset 48254; CHECK-SD-NEXT: .cfi_offset w30, -16255; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0256; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill257; CHECK-SD-NEXT: mov s0, v0.s[1]258; CHECK-SD-NEXT: bl expf259; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0260; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill261; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload262; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q0263; CHECK-SD-NEXT: bl expf264; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload265; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0266; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload267; CHECK-SD-NEXT: mov v0.s[1], v1.s[0]268; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0269; CHECK-SD-NEXT: add sp, sp, #48270; CHECK-SD-NEXT: ret271;272; CHECK-GI-LABEL: exp_v2f32:273; CHECK-GI: // %bb.0: // %entry274; CHECK-GI-NEXT: sub sp, sp, #32275; CHECK-GI-NEXT: str d8, [sp, #16] // 8-byte Spill276; CHECK-GI-NEXT: str x30, [sp, #24] // 8-byte Spill277; CHECK-GI-NEXT: .cfi_def_cfa_offset 32278; CHECK-GI-NEXT: .cfi_offset w30, -8279; CHECK-GI-NEXT: .cfi_offset b8, -16280; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0281; CHECK-GI-NEXT: mov s8, v0.s[1]282; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q0283; CHECK-GI-NEXT: bl expf284; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0285; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill286; CHECK-GI-NEXT: fmov s0, s8287; CHECK-GI-NEXT: bl expf288; CHECK-GI-NEXT: ldr q1, [sp] // 16-byte Reload289; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0290; CHECK-GI-NEXT: ldr x30, [sp, #24] // 8-byte Reload291; CHECK-GI-NEXT: ldr d8, [sp, #16] // 8-byte Reload292; CHECK-GI-NEXT: mov v1.s[1], v0.s[0]293; CHECK-GI-NEXT: fmov d0, d1294; CHECK-GI-NEXT: add sp, sp, #32295; CHECK-GI-NEXT: ret296entry:297 %c = call <2 x float> @llvm.exp.v2f32(<2 x float> %a)298 ret <2 x float> %c299}300 301define <3 x float> @exp_v3f32(<3 x float> %a) {302; CHECK-SD-LABEL: exp_v3f32:303; CHECK-SD: // %bb.0: // %entry304; CHECK-SD-NEXT: sub sp, sp, #48305; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Spill306; CHECK-SD-NEXT: .cfi_def_cfa_offset 48307; CHECK-SD-NEXT: .cfi_offset w30, -16308; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill309; CHECK-SD-NEXT: mov s0, v0.s[1]310; CHECK-SD-NEXT: bl expf311; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0312; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill313; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload314; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q0315; CHECK-SD-NEXT: bl expf316; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload317; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0318; CHECK-SD-NEXT: mov v0.s[1], v1.s[0]319; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill320; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload321; CHECK-SD-NEXT: mov s0, v0.s[2]322; CHECK-SD-NEXT: bl expf323; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload324; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0325; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload326; CHECK-SD-NEXT: mov v1.s[2], v0.s[0]327; CHECK-SD-NEXT: mov v0.16b, v1.16b328; CHECK-SD-NEXT: add sp, sp, #48329; CHECK-SD-NEXT: ret330;331; CHECK-GI-LABEL: exp_v3f32:332; CHECK-GI: // %bb.0: // %entry333; CHECK-GI-NEXT: sub sp, sp, #64334; CHECK-GI-NEXT: stp d9, d8, [sp, #32] // 16-byte Folded Spill335; CHECK-GI-NEXT: str x30, [sp, #48] // 8-byte Spill336; CHECK-GI-NEXT: .cfi_def_cfa_offset 64337; CHECK-GI-NEXT: .cfi_offset w30, -16338; CHECK-GI-NEXT: .cfi_offset b8, -24339; CHECK-GI-NEXT: .cfi_offset b9, -32340; CHECK-GI-NEXT: mov s8, v0.s[1]341; CHECK-GI-NEXT: mov s9, v0.s[2]342; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q0343; CHECK-GI-NEXT: bl expf344; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0345; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill346; CHECK-GI-NEXT: fmov s0, s8347; CHECK-GI-NEXT: bl expf348; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0349; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill350; CHECK-GI-NEXT: fmov s0, s9351; CHECK-GI-NEXT: bl expf352; CHECK-GI-NEXT: ldp q2, q1, [sp] // 32-byte Folded Reload353; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0354; CHECK-GI-NEXT: ldr x30, [sp, #48] // 8-byte Reload355; CHECK-GI-NEXT: ldp d9, d8, [sp, #32] // 16-byte Folded Reload356; CHECK-GI-NEXT: mov v1.s[1], v2.s[0]357; CHECK-GI-NEXT: mov v1.s[2], v0.s[0]358; CHECK-GI-NEXT: mov v0.16b, v1.16b359; CHECK-GI-NEXT: add sp, sp, #64360; CHECK-GI-NEXT: ret361entry:362 %c = call <3 x float> @llvm.exp.v3f32(<3 x float> %a)363 ret <3 x float> %c364}365 366define <4 x float> @exp_v4f32(<4 x float> %a) {367; CHECK-SD-LABEL: exp_v4f32:368; CHECK-SD: // %bb.0: // %entry369; CHECK-SD-NEXT: sub sp, sp, #48370; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Spill371; CHECK-SD-NEXT: .cfi_def_cfa_offset 48372; CHECK-SD-NEXT: .cfi_offset w30, -16373; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill374; CHECK-SD-NEXT: mov s0, v0.s[1]375; CHECK-SD-NEXT: bl expf376; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0377; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill378; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload379; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q0380; CHECK-SD-NEXT: bl expf381; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload382; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0383; CHECK-SD-NEXT: mov v0.s[1], v1.s[0]384; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill385; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload386; CHECK-SD-NEXT: mov s0, v0.s[2]387; CHECK-SD-NEXT: bl expf388; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload389; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0390; CHECK-SD-NEXT: mov v1.s[2], v0.s[0]391; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload392; CHECK-SD-NEXT: mov s0, v0.s[3]393; CHECK-SD-NEXT: str q1, [sp] // 16-byte Spill394; CHECK-SD-NEXT: bl expf395; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload396; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0397; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload398; CHECK-SD-NEXT: mov v1.s[3], v0.s[0]399; CHECK-SD-NEXT: mov v0.16b, v1.16b400; CHECK-SD-NEXT: add sp, sp, #48401; CHECK-SD-NEXT: ret402;403; CHECK-GI-LABEL: exp_v4f32:404; CHECK-GI: // %bb.0: // %entry405; CHECK-GI-NEXT: sub sp, sp, #80406; CHECK-GI-NEXT: str d10, [sp, #48] // 8-byte Spill407; CHECK-GI-NEXT: stp d9, d8, [sp, #56] // 16-byte Folded Spill408; CHECK-GI-NEXT: str x30, [sp, #72] // 8-byte Spill409; CHECK-GI-NEXT: .cfi_def_cfa_offset 80410; CHECK-GI-NEXT: .cfi_offset w30, -8411; CHECK-GI-NEXT: .cfi_offset b8, -16412; CHECK-GI-NEXT: .cfi_offset b9, -24413; CHECK-GI-NEXT: .cfi_offset b10, -32414; CHECK-GI-NEXT: mov s8, v0.s[1]415; CHECK-GI-NEXT: mov s9, v0.s[2]416; CHECK-GI-NEXT: mov s10, v0.s[3]417; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q0418; CHECK-GI-NEXT: bl expf419; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0420; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill421; CHECK-GI-NEXT: fmov s0, s8422; CHECK-GI-NEXT: bl expf423; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0424; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill425; CHECK-GI-NEXT: fmov s0, s9426; CHECK-GI-NEXT: bl expf427; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0428; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill429; CHECK-GI-NEXT: fmov s0, s10430; CHECK-GI-NEXT: bl expf431; CHECK-GI-NEXT: ldp q2, q1, [sp, #16] // 32-byte Folded Reload432; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0433; CHECK-GI-NEXT: ldr x30, [sp, #72] // 8-byte Reload434; CHECK-GI-NEXT: ldp d9, d8, [sp, #56] // 16-byte Folded Reload435; CHECK-GI-NEXT: ldr d10, [sp, #48] // 8-byte Reload436; CHECK-GI-NEXT: mov v1.s[1], v2.s[0]437; CHECK-GI-NEXT: ldr q2, [sp] // 16-byte Reload438; CHECK-GI-NEXT: mov v1.s[2], v2.s[0]439; CHECK-GI-NEXT: mov v1.s[3], v0.s[0]440; CHECK-GI-NEXT: mov v0.16b, v1.16b441; CHECK-GI-NEXT: add sp, sp, #80442; CHECK-GI-NEXT: ret443entry:444 %c = call <4 x float> @llvm.exp.v4f32(<4 x float> %a)445 ret <4 x float> %c446}447 448define <8 x float> @exp_v8f32(<8 x float> %a) {449; CHECK-SD-LABEL: exp_v8f32:450; CHECK-SD: // %bb.0: // %entry451; CHECK-SD-NEXT: sub sp, sp, #64452; CHECK-SD-NEXT: str x30, [sp, #48] // 8-byte Spill453; CHECK-SD-NEXT: .cfi_def_cfa_offset 64454; CHECK-SD-NEXT: .cfi_offset w30, -16455; CHECK-SD-NEXT: stp q0, q1, [sp] // 32-byte Folded Spill456; CHECK-SD-NEXT: mov s0, v0.s[1]457; CHECK-SD-NEXT: bl expf458; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0459; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Spill460; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload461; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q0462; CHECK-SD-NEXT: bl expf463; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload464; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0465; CHECK-SD-NEXT: mov v0.s[1], v1.s[0]466; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Spill467; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload468; CHECK-SD-NEXT: mov s0, v0.s[2]469; CHECK-SD-NEXT: bl expf470; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload471; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0472; CHECK-SD-NEXT: mov v1.s[2], v0.s[0]473; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload474; CHECK-SD-NEXT: mov s0, v0.s[3]475; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill476; CHECK-SD-NEXT: bl expf477; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload478; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0479; CHECK-SD-NEXT: mov v1.s[3], v0.s[0]480; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload481; CHECK-SD-NEXT: mov s0, v0.s[1]482; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill483; CHECK-SD-NEXT: bl expf484; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0485; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill486; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload487; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q0488; CHECK-SD-NEXT: bl expf489; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload490; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0491; CHECK-SD-NEXT: mov v0.s[1], v1.s[0]492; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill493; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload494; CHECK-SD-NEXT: mov s0, v0.s[2]495; CHECK-SD-NEXT: bl expf496; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload497; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0498; CHECK-SD-NEXT: mov v1.s[2], v0.s[0]499; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload500; CHECK-SD-NEXT: mov s0, v0.s[3]501; CHECK-SD-NEXT: str q1, [sp] // 16-byte Spill502; CHECK-SD-NEXT: bl expf503; CHECK-SD-NEXT: fmov s2, s0504; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload505; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Reload506; CHECK-SD-NEXT: ldr x30, [sp, #48] // 8-byte Reload507; CHECK-SD-NEXT: mov v1.s[3], v2.s[0]508; CHECK-SD-NEXT: add sp, sp, #64509; CHECK-SD-NEXT: ret510;511; CHECK-GI-LABEL: exp_v8f32:512; CHECK-GI: // %bb.0: // %entry513; CHECK-GI-NEXT: sub sp, sp, #176514; CHECK-GI-NEXT: stp d13, d12, [sp, #112] // 16-byte Folded Spill515; CHECK-GI-NEXT: stp d11, d10, [sp, #128] // 16-byte Folded Spill516; CHECK-GI-NEXT: stp d9, d8, [sp, #144] // 16-byte Folded Spill517; CHECK-GI-NEXT: str x30, [sp, #160] // 8-byte Spill518; CHECK-GI-NEXT: .cfi_def_cfa_offset 176519; CHECK-GI-NEXT: .cfi_offset w30, -16520; CHECK-GI-NEXT: .cfi_offset b8, -24521; CHECK-GI-NEXT: .cfi_offset b9, -32522; CHECK-GI-NEXT: .cfi_offset b10, -40523; CHECK-GI-NEXT: .cfi_offset b11, -48524; CHECK-GI-NEXT: .cfi_offset b12, -56525; CHECK-GI-NEXT: .cfi_offset b13, -64526; CHECK-GI-NEXT: str q1, [sp, #32] // 16-byte Spill527; CHECK-GI-NEXT: mov s8, v0.s[1]528; CHECK-GI-NEXT: mov s9, v0.s[2]529; CHECK-GI-NEXT: mov s10, v0.s[3]530; CHECK-GI-NEXT: mov s11, v1.s[1]531; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q0532; CHECK-GI-NEXT: mov s12, v1.s[2]533; CHECK-GI-NEXT: mov s13, v1.s[3]534; CHECK-GI-NEXT: bl expf535; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0536; CHECK-GI-NEXT: str q0, [sp, #64] // 16-byte Spill537; CHECK-GI-NEXT: fmov s0, s8538; CHECK-GI-NEXT: bl expf539; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0540; CHECK-GI-NEXT: str q0, [sp, #48] // 16-byte Spill541; CHECK-GI-NEXT: fmov s0, s9542; CHECK-GI-NEXT: bl expf543; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0544; CHECK-GI-NEXT: str q0, [sp, #96] // 16-byte Spill545; CHECK-GI-NEXT: fmov s0, s10546; CHECK-GI-NEXT: bl expf547; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0548; CHECK-GI-NEXT: str q0, [sp, #80] // 16-byte Spill549; CHECK-GI-NEXT: ldr q0, [sp, #32] // 16-byte Reload550; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q0551; CHECK-GI-NEXT: bl expf552; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0553; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill554; CHECK-GI-NEXT: fmov s0, s11555; CHECK-GI-NEXT: bl expf556; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0557; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill558; CHECK-GI-NEXT: fmov s0, s12559; CHECK-GI-NEXT: bl expf560; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0561; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill562; CHECK-GI-NEXT: fmov s0, s13563; CHECK-GI-NEXT: bl expf564; CHECK-GI-NEXT: ldp q2, q1, [sp, #48] // 32-byte Folded Reload565; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0566; CHECK-GI-NEXT: ldr x30, [sp, #160] // 8-byte Reload567; CHECK-GI-NEXT: ldp d9, d8, [sp, #144] // 16-byte Folded Reload568; CHECK-GI-NEXT: ldp d11, d10, [sp, #128] // 16-byte Folded Reload569; CHECK-GI-NEXT: mov v1.s[1], v2.s[0]570; CHECK-GI-NEXT: ldp q2, q3, [sp, #16] // 32-byte Folded Reload571; CHECK-GI-NEXT: ldp d13, d12, [sp, #112] // 16-byte Folded Reload572; CHECK-GI-NEXT: mov v3.s[1], v2.s[0]573; CHECK-GI-NEXT: ldr q2, [sp, #96] // 16-byte Reload574; CHECK-GI-NEXT: mov v1.s[2], v2.s[0]575; CHECK-GI-NEXT: ldr q2, [sp] // 16-byte Reload576; CHECK-GI-NEXT: mov v3.s[2], v2.s[0]577; CHECK-GI-NEXT: ldr q2, [sp, #80] // 16-byte Reload578; CHECK-GI-NEXT: mov v1.s[3], v2.s[0]579; CHECK-GI-NEXT: mov v3.s[3], v0.s[0]580; CHECK-GI-NEXT: mov v2.16b, v1.16b581; CHECK-GI-NEXT: mov v1.16b, v3.16b582; CHECK-GI-NEXT: mov v0.16b, v2.16b583; CHECK-GI-NEXT: add sp, sp, #176584; CHECK-GI-NEXT: ret585entry:586 %c = call <8 x float> @llvm.exp.v8f32(<8 x float> %a)587 ret <8 x float> %c588}589 590define <7 x half> @exp_v7f16(<7 x half> %a) {591; CHECK-SD-LABEL: exp_v7f16:592; CHECK-SD: // %bb.0: // %entry593; CHECK-SD-NEXT: sub sp, sp, #48594; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Spill595; CHECK-SD-NEXT: .cfi_def_cfa_offset 48596; CHECK-SD-NEXT: .cfi_offset w30, -16597; CHECK-SD-NEXT: mov h1, v0.h[1]598; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill599; CHECK-SD-NEXT: fcvt s0, h1600; CHECK-SD-NEXT: bl expf601; CHECK-SD-NEXT: fcvt h0, s0602; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill603; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload604; CHECK-SD-NEXT: fcvt s0, h0605; CHECK-SD-NEXT: bl expf606; CHECK-SD-NEXT: fcvt h0, s0607; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload608; CHECK-SD-NEXT: mov v0.h[1], v1.h[0]609; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill610; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload611; CHECK-SD-NEXT: mov h0, v0.h[2]612; CHECK-SD-NEXT: fcvt s0, h0613; CHECK-SD-NEXT: bl expf614; CHECK-SD-NEXT: fcvt h0, s0615; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload616; CHECK-SD-NEXT: mov v1.h[2], v0.h[0]617; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload618; CHECK-SD-NEXT: mov h0, v0.h[3]619; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill620; CHECK-SD-NEXT: fcvt s0, h0621; CHECK-SD-NEXT: bl expf622; CHECK-SD-NEXT: fcvt h0, s0623; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload624; CHECK-SD-NEXT: mov v1.h[3], v0.h[0]625; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload626; CHECK-SD-NEXT: mov h0, v0.h[4]627; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill628; CHECK-SD-NEXT: fcvt s0, h0629; CHECK-SD-NEXT: bl expf630; CHECK-SD-NEXT: fcvt h0, s0631; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload632; CHECK-SD-NEXT: mov v1.h[4], v0.h[0]633; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload634; CHECK-SD-NEXT: mov h0, v0.h[5]635; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill636; CHECK-SD-NEXT: fcvt s0, h0637; CHECK-SD-NEXT: bl expf638; CHECK-SD-NEXT: fcvt h0, s0639; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload640; CHECK-SD-NEXT: mov v1.h[5], v0.h[0]641; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload642; CHECK-SD-NEXT: mov h0, v0.h[6]643; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill644; CHECK-SD-NEXT: fcvt s0, h0645; CHECK-SD-NEXT: bl expf646; CHECK-SD-NEXT: fcvt h0, s0647; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload648; CHECK-SD-NEXT: mov v1.h[6], v0.h[0]649; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload650; CHECK-SD-NEXT: mov h0, v0.h[7]651; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill652; CHECK-SD-NEXT: fcvt s0, h0653; CHECK-SD-NEXT: bl expf654; CHECK-SD-NEXT: fcvt h1, s0655; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload656; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload657; CHECK-SD-NEXT: mov v0.h[7], v1.h[0]658; CHECK-SD-NEXT: add sp, sp, #48659; CHECK-SD-NEXT: ret660;661; CHECK-GI-LABEL: exp_v7f16:662; CHECK-GI: // %bb.0: // %entry663; CHECK-GI-NEXT: sub sp, sp, #160664; CHECK-GI-NEXT: stp d13, d12, [sp, #96] // 16-byte Folded Spill665; CHECK-GI-NEXT: stp d11, d10, [sp, #112] // 16-byte Folded Spill666; CHECK-GI-NEXT: stp d9, d8, [sp, #128] // 16-byte Folded Spill667; CHECK-GI-NEXT: str x30, [sp, #144] // 8-byte Spill668; CHECK-GI-NEXT: .cfi_def_cfa_offset 160669; CHECK-GI-NEXT: .cfi_offset w30, -16670; CHECK-GI-NEXT: .cfi_offset b8, -24671; CHECK-GI-NEXT: .cfi_offset b9, -32672; CHECK-GI-NEXT: .cfi_offset b10, -40673; CHECK-GI-NEXT: .cfi_offset b11, -48674; CHECK-GI-NEXT: .cfi_offset b12, -56675; CHECK-GI-NEXT: .cfi_offset b13, -64676; CHECK-GI-NEXT: mov h8, v0.h[1]677; CHECK-GI-NEXT: mov h9, v0.h[2]678; CHECK-GI-NEXT: mov h10, v0.h[3]679; CHECK-GI-NEXT: mov h11, v0.h[4]680; CHECK-GI-NEXT: mov h12, v0.h[5]681; CHECK-GI-NEXT: mov h13, v0.h[6]682; CHECK-GI-NEXT: fcvt s0, h0683; CHECK-GI-NEXT: bl expf684; CHECK-GI-NEXT: fcvt s1, h8685; CHECK-GI-NEXT: fcvt h0, s0686; CHECK-GI-NEXT: str q0, [sp, #80] // 16-byte Spill687; CHECK-GI-NEXT: fmov s0, s1688; CHECK-GI-NEXT: bl expf689; CHECK-GI-NEXT: fcvt s1, h9690; CHECK-GI-NEXT: fcvt h0, s0691; CHECK-GI-NEXT: str q0, [sp, #48] // 16-byte Spill692; CHECK-GI-NEXT: fmov s0, s1693; CHECK-GI-NEXT: bl expf694; CHECK-GI-NEXT: fcvt s1, h10695; CHECK-GI-NEXT: fcvt h0, s0696; CHECK-GI-NEXT: str q0, [sp, #64] // 16-byte Spill697; CHECK-GI-NEXT: fmov s0, s1698; CHECK-GI-NEXT: bl expf699; CHECK-GI-NEXT: fcvt s1, h11700; CHECK-GI-NEXT: fcvt h0, s0701; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill702; CHECK-GI-NEXT: fmov s0, s1703; CHECK-GI-NEXT: bl expf704; CHECK-GI-NEXT: fcvt s1, h12705; CHECK-GI-NEXT: fcvt h0, s0706; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill707; CHECK-GI-NEXT: fmov s0, s1708; CHECK-GI-NEXT: bl expf709; CHECK-GI-NEXT: fcvt s1, h13710; CHECK-GI-NEXT: fcvt h0, s0711; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill712; CHECK-GI-NEXT: fmov s0, s1713; CHECK-GI-NEXT: bl expf714; CHECK-GI-NEXT: ldp q3, q2, [sp, #48] // 32-byte Folded Reload715; CHECK-GI-NEXT: fcvt h0, s0716; CHECK-GI-NEXT: ldr q1, [sp, #80] // 16-byte Reload717; CHECK-GI-NEXT: ldp d9, d8, [sp, #128] // 16-byte Folded Reload718; CHECK-GI-NEXT: ldp d11, d10, [sp, #112] // 16-byte Folded Reload719; CHECK-GI-NEXT: ldr x30, [sp, #144] // 8-byte Reload720; CHECK-GI-NEXT: mov v1.h[1], v3.h[0]721; CHECK-GI-NEXT: ldp d13, d12, [sp, #96] // 16-byte Folded Reload722; CHECK-GI-NEXT: mov v1.h[2], v2.h[0]723; CHECK-GI-NEXT: ldp q2, q3, [sp, #16] // 32-byte Folded Reload724; CHECK-GI-NEXT: mov v1.h[3], v3.h[0]725; CHECK-GI-NEXT: mov v1.h[4], v2.h[0]726; CHECK-GI-NEXT: ldr q2, [sp] // 16-byte Reload727; CHECK-GI-NEXT: mov v1.h[5], v2.h[0]728; CHECK-GI-NEXT: mov v1.h[6], v0.h[0]729; CHECK-GI-NEXT: mov v0.16b, v1.16b730; CHECK-GI-NEXT: add sp, sp, #160731; CHECK-GI-NEXT: ret732entry:733 %c = call <7 x half> @llvm.exp.v7f16(<7 x half> %a)734 ret <7 x half> %c735}736 737define <4 x half> @exp_v4f16(<4 x half> %a) {738; CHECK-SD-LABEL: exp_v4f16:739; CHECK-SD: // %bb.0: // %entry740; CHECK-SD-NEXT: sub sp, sp, #48741; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Spill742; CHECK-SD-NEXT: .cfi_def_cfa_offset 48743; CHECK-SD-NEXT: .cfi_offset w30, -16744; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0745; CHECK-SD-NEXT: mov h1, v0.h[1]746; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill747; CHECK-SD-NEXT: fcvt s0, h1748; CHECK-SD-NEXT: bl expf749; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload750; CHECK-SD-NEXT: fcvt h0, s0751; CHECK-SD-NEXT: fcvt s1, h1752; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill753; CHECK-SD-NEXT: fmov s0, s1754; CHECK-SD-NEXT: bl expf755; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload756; CHECK-SD-NEXT: fcvt h2, s0757; CHECK-SD-NEXT: mov h1, v1.h[2]758; CHECK-SD-NEXT: fcvt s0, h1759; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload760; CHECK-SD-NEXT: mov v2.h[1], v1.h[0]761; CHECK-SD-NEXT: str q2, [sp] // 16-byte Spill762; CHECK-SD-NEXT: bl expf763; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload764; CHECK-SD-NEXT: fcvt h2, s0765; CHECK-SD-NEXT: mov h1, v1.h[3]766; CHECK-SD-NEXT: fcvt s0, h1767; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload768; CHECK-SD-NEXT: mov v1.h[2], v2.h[0]769; CHECK-SD-NEXT: str q1, [sp] // 16-byte Spill770; CHECK-SD-NEXT: bl expf771; CHECK-SD-NEXT: fcvt h1, s0772; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload773; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload774; CHECK-SD-NEXT: mov v0.h[3], v1.h[0]775; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0776; CHECK-SD-NEXT: add sp, sp, #48777; CHECK-SD-NEXT: ret778;779; CHECK-GI-LABEL: exp_v4f16:780; CHECK-GI: // %bb.0: // %entry781; CHECK-GI-NEXT: sub sp, sp, #80782; CHECK-GI-NEXT: str d10, [sp, #48] // 8-byte Spill783; CHECK-GI-NEXT: stp d9, d8, [sp, #56] // 16-byte Folded Spill784; CHECK-GI-NEXT: str x30, [sp, #72] // 8-byte Spill785; CHECK-GI-NEXT: .cfi_def_cfa_offset 80786; CHECK-GI-NEXT: .cfi_offset w30, -8787; CHECK-GI-NEXT: .cfi_offset b8, -16788; CHECK-GI-NEXT: .cfi_offset b9, -24789; CHECK-GI-NEXT: .cfi_offset b10, -32790; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0791; CHECK-GI-NEXT: mov h8, v0.h[1]792; CHECK-GI-NEXT: mov h9, v0.h[2]793; CHECK-GI-NEXT: mov h10, v0.h[3]794; CHECK-GI-NEXT: fcvt s0, h0795; CHECK-GI-NEXT: bl expf796; CHECK-GI-NEXT: fcvt s1, h8797; CHECK-GI-NEXT: fcvt h0, s0798; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill799; CHECK-GI-NEXT: fmov s0, s1800; CHECK-GI-NEXT: bl expf801; CHECK-GI-NEXT: fcvt s1, h9802; CHECK-GI-NEXT: fcvt h0, s0803; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill804; CHECK-GI-NEXT: fmov s0, s1805; CHECK-GI-NEXT: bl expf806; CHECK-GI-NEXT: fcvt s1, h10807; CHECK-GI-NEXT: fcvt h0, s0808; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill809; CHECK-GI-NEXT: fmov s0, s1810; CHECK-GI-NEXT: bl expf811; CHECK-GI-NEXT: ldp q3, q2, [sp] // 32-byte Folded Reload812; CHECK-GI-NEXT: fcvt h0, s0813; CHECK-GI-NEXT: ldr q1, [sp, #32] // 16-byte Reload814; CHECK-GI-NEXT: ldp d9, d8, [sp, #56] // 16-byte Folded Reload815; CHECK-GI-NEXT: ldr x30, [sp, #72] // 8-byte Reload816; CHECK-GI-NEXT: ldr d10, [sp, #48] // 8-byte Reload817; CHECK-GI-NEXT: mov v1.h[1], v3.h[0]818; CHECK-GI-NEXT: mov v1.h[2], v2.h[0]819; CHECK-GI-NEXT: mov v1.h[3], v0.h[0]820; CHECK-GI-NEXT: mov v0.16b, v1.16b821; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0822; CHECK-GI-NEXT: add sp, sp, #80823; CHECK-GI-NEXT: ret824entry:825 %c = call <4 x half> @llvm.exp.v4f16(<4 x half> %a)826 ret <4 x half> %c827}828 829define <8 x half> @exp_v8f16(<8 x half> %a) {830; CHECK-SD-LABEL: exp_v8f16:831; CHECK-SD: // %bb.0: // %entry832; CHECK-SD-NEXT: sub sp, sp, #48833; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Spill834; CHECK-SD-NEXT: .cfi_def_cfa_offset 48835; CHECK-SD-NEXT: .cfi_offset w30, -16836; CHECK-SD-NEXT: mov h1, v0.h[1]837; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill838; CHECK-SD-NEXT: fcvt s0, h1839; CHECK-SD-NEXT: bl expf840; CHECK-SD-NEXT: fcvt h0, s0841; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill842; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload843; CHECK-SD-NEXT: fcvt s0, h0844; CHECK-SD-NEXT: bl expf845; CHECK-SD-NEXT: fcvt h0, s0846; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload847; CHECK-SD-NEXT: mov v0.h[1], v1.h[0]848; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill849; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload850; CHECK-SD-NEXT: mov h0, v0.h[2]851; CHECK-SD-NEXT: fcvt s0, h0852; CHECK-SD-NEXT: bl expf853; CHECK-SD-NEXT: fcvt h0, s0854; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload855; CHECK-SD-NEXT: mov v1.h[2], v0.h[0]856; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload857; CHECK-SD-NEXT: mov h0, v0.h[3]858; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill859; CHECK-SD-NEXT: fcvt s0, h0860; CHECK-SD-NEXT: bl expf861; CHECK-SD-NEXT: fcvt h0, s0862; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload863; CHECK-SD-NEXT: mov v1.h[3], v0.h[0]864; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload865; CHECK-SD-NEXT: mov h0, v0.h[4]866; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill867; CHECK-SD-NEXT: fcvt s0, h0868; CHECK-SD-NEXT: bl expf869; CHECK-SD-NEXT: fcvt h0, s0870; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload871; CHECK-SD-NEXT: mov v1.h[4], v0.h[0]872; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload873; CHECK-SD-NEXT: mov h0, v0.h[5]874; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill875; CHECK-SD-NEXT: fcvt s0, h0876; CHECK-SD-NEXT: bl expf877; CHECK-SD-NEXT: fcvt h0, s0878; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload879; CHECK-SD-NEXT: mov v1.h[5], v0.h[0]880; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload881; CHECK-SD-NEXT: mov h0, v0.h[6]882; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill883; CHECK-SD-NEXT: fcvt s0, h0884; CHECK-SD-NEXT: bl expf885; CHECK-SD-NEXT: fcvt h0, s0886; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload887; CHECK-SD-NEXT: mov v1.h[6], v0.h[0]888; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload889; CHECK-SD-NEXT: mov h0, v0.h[7]890; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill891; CHECK-SD-NEXT: fcvt s0, h0892; CHECK-SD-NEXT: bl expf893; CHECK-SD-NEXT: fcvt h1, s0894; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload895; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload896; CHECK-SD-NEXT: mov v0.h[7], v1.h[0]897; CHECK-SD-NEXT: add sp, sp, #48898; CHECK-SD-NEXT: ret899;900; CHECK-GI-LABEL: exp_v8f16:901; CHECK-GI: // %bb.0: // %entry902; CHECK-GI-NEXT: sub sp, sp, #176903; CHECK-GI-NEXT: str d14, [sp, #112] // 8-byte Spill904; CHECK-GI-NEXT: stp d13, d12, [sp, #120] // 16-byte Folded Spill905; CHECK-GI-NEXT: stp d11, d10, [sp, #136] // 16-byte Folded Spill906; CHECK-GI-NEXT: stp d9, d8, [sp, #152] // 16-byte Folded Spill907; CHECK-GI-NEXT: str x30, [sp, #168] // 8-byte Spill908; CHECK-GI-NEXT: .cfi_def_cfa_offset 176909; CHECK-GI-NEXT: .cfi_offset w30, -8910; CHECK-GI-NEXT: .cfi_offset b8, -16911; CHECK-GI-NEXT: .cfi_offset b9, -24912; CHECK-GI-NEXT: .cfi_offset b10, -32913; CHECK-GI-NEXT: .cfi_offset b11, -40914; CHECK-GI-NEXT: .cfi_offset b12, -48915; CHECK-GI-NEXT: .cfi_offset b13, -56916; CHECK-GI-NEXT: .cfi_offset b14, -64917; CHECK-GI-NEXT: mov h8, v0.h[1]918; CHECK-GI-NEXT: mov h9, v0.h[2]919; CHECK-GI-NEXT: mov h10, v0.h[3]920; CHECK-GI-NEXT: mov h11, v0.h[4]921; CHECK-GI-NEXT: mov h12, v0.h[5]922; CHECK-GI-NEXT: mov h13, v0.h[6]923; CHECK-GI-NEXT: mov h14, v0.h[7]924; CHECK-GI-NEXT: fcvt s0, h0925; CHECK-GI-NEXT: bl expf926; CHECK-GI-NEXT: fcvt s1, h8927; CHECK-GI-NEXT: fcvt h0, s0928; CHECK-GI-NEXT: str q0, [sp, #96] // 16-byte Spill929; CHECK-GI-NEXT: fmov s0, s1930; CHECK-GI-NEXT: bl expf931; CHECK-GI-NEXT: fcvt s1, h9932; CHECK-GI-NEXT: fcvt h0, s0933; CHECK-GI-NEXT: str q0, [sp, #64] // 16-byte Spill934; CHECK-GI-NEXT: fmov s0, s1935; CHECK-GI-NEXT: bl expf936; CHECK-GI-NEXT: fcvt s1, h10937; CHECK-GI-NEXT: fcvt h0, s0938; CHECK-GI-NEXT: str q0, [sp, #80] // 16-byte Spill939; CHECK-GI-NEXT: fmov s0, s1940; CHECK-GI-NEXT: bl expf941; CHECK-GI-NEXT: fcvt s1, h11942; CHECK-GI-NEXT: fcvt h0, s0943; CHECK-GI-NEXT: str q0, [sp, #48] // 16-byte Spill944; CHECK-GI-NEXT: fmov s0, s1945; CHECK-GI-NEXT: bl expf946; CHECK-GI-NEXT: fcvt s1, h12947; CHECK-GI-NEXT: fcvt h0, s0948; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill949; CHECK-GI-NEXT: fmov s0, s1950; CHECK-GI-NEXT: bl expf951; CHECK-GI-NEXT: fcvt s1, h13952; CHECK-GI-NEXT: fcvt h0, s0953; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill954; CHECK-GI-NEXT: fmov s0, s1955; CHECK-GI-NEXT: bl expf956; CHECK-GI-NEXT: fcvt s1, h14957; CHECK-GI-NEXT: fcvt h0, s0958; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill959; CHECK-GI-NEXT: fmov s0, s1960; CHECK-GI-NEXT: bl expf961; CHECK-GI-NEXT: ldp q3, q2, [sp, #64] // 32-byte Folded Reload962; CHECK-GI-NEXT: fcvt h0, s0963; CHECK-GI-NEXT: ldr q1, [sp, #96] // 16-byte Reload964; CHECK-GI-NEXT: ldp d9, d8, [sp, #152] // 16-byte Folded Reload965; CHECK-GI-NEXT: ldp d11, d10, [sp, #136] // 16-byte Folded Reload966; CHECK-GI-NEXT: ldr x30, [sp, #168] // 8-byte Reload967; CHECK-GI-NEXT: mov v1.h[1], v3.h[0]968; CHECK-GI-NEXT: ldr d14, [sp, #112] // 8-byte Reload969; CHECK-GI-NEXT: ldp d13, d12, [sp, #120] // 16-byte Folded Reload970; CHECK-GI-NEXT: mov v1.h[2], v2.h[0]971; CHECK-GI-NEXT: ldp q2, q3, [sp, #32] // 32-byte Folded Reload972; CHECK-GI-NEXT: mov v1.h[3], v3.h[0]973; CHECK-GI-NEXT: mov v1.h[4], v2.h[0]974; CHECK-GI-NEXT: ldp q2, q3, [sp] // 32-byte Folded Reload975; CHECK-GI-NEXT: mov v1.h[5], v3.h[0]976; CHECK-GI-NEXT: mov v1.h[6], v2.h[0]977; CHECK-GI-NEXT: mov v1.h[7], v0.h[0]978; CHECK-GI-NEXT: mov v0.16b, v1.16b979; CHECK-GI-NEXT: add sp, sp, #176980; CHECK-GI-NEXT: ret981entry:982 %c = call <8 x half> @llvm.exp.v8f16(<8 x half> %a)983 ret <8 x half> %c984}985 986define <16 x half> @exp_v16f16(<16 x half> %a) {987; CHECK-SD-LABEL: exp_v16f16:988; CHECK-SD: // %bb.0: // %entry989; CHECK-SD-NEXT: sub sp, sp, #64990; CHECK-SD-NEXT: str x30, [sp, #48] // 8-byte Spill991; CHECK-SD-NEXT: .cfi_def_cfa_offset 64992; CHECK-SD-NEXT: .cfi_offset w30, -16993; CHECK-SD-NEXT: stp q1, q0, [sp] // 32-byte Folded Spill994; CHECK-SD-NEXT: mov h1, v0.h[1]995; CHECK-SD-NEXT: fcvt s0, h1996; CHECK-SD-NEXT: bl expf997; CHECK-SD-NEXT: fcvt h0, s0998; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Spill999; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload1000; CHECK-SD-NEXT: fcvt s0, h01001; CHECK-SD-NEXT: bl expf1002; CHECK-SD-NEXT: fcvt h0, s01003; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload1004; CHECK-SD-NEXT: mov v0.h[1], v1.h[0]1005; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Spill1006; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload1007; CHECK-SD-NEXT: mov h0, v0.h[2]1008; CHECK-SD-NEXT: fcvt s0, h01009; CHECK-SD-NEXT: bl expf1010; CHECK-SD-NEXT: fcvt h0, s01011; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload1012; CHECK-SD-NEXT: mov v1.h[2], v0.h[0]1013; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload1014; CHECK-SD-NEXT: mov h0, v0.h[3]1015; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill1016; CHECK-SD-NEXT: fcvt s0, h01017; CHECK-SD-NEXT: bl expf1018; CHECK-SD-NEXT: fcvt h0, s01019; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload1020; CHECK-SD-NEXT: mov v1.h[3], v0.h[0]1021; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload1022; CHECK-SD-NEXT: mov h0, v0.h[4]1023; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill1024; CHECK-SD-NEXT: fcvt s0, h01025; CHECK-SD-NEXT: bl expf1026; CHECK-SD-NEXT: fcvt h0, s01027; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload1028; CHECK-SD-NEXT: mov v1.h[4], v0.h[0]1029; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload1030; CHECK-SD-NEXT: mov h0, v0.h[5]1031; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill1032; CHECK-SD-NEXT: fcvt s0, h01033; CHECK-SD-NEXT: bl expf1034; CHECK-SD-NEXT: fcvt h0, s01035; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload1036; CHECK-SD-NEXT: mov v1.h[5], v0.h[0]1037; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload1038; CHECK-SD-NEXT: mov h0, v0.h[6]1039; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill1040; CHECK-SD-NEXT: fcvt s0, h01041; CHECK-SD-NEXT: bl expf1042; CHECK-SD-NEXT: fcvt h0, s01043; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload1044; CHECK-SD-NEXT: mov v1.h[6], v0.h[0]1045; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload1046; CHECK-SD-NEXT: mov h0, v0.h[7]1047; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill1048; CHECK-SD-NEXT: fcvt s0, h01049; CHECK-SD-NEXT: bl expf1050; CHECK-SD-NEXT: fcvt h0, s01051; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload1052; CHECK-SD-NEXT: mov v1.h[7], v0.h[0]1053; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload1054; CHECK-SD-NEXT: mov h0, v0.h[1]1055; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill1056; CHECK-SD-NEXT: fcvt s0, h01057; CHECK-SD-NEXT: bl expf1058; CHECK-SD-NEXT: fcvt h0, s01059; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill1060; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload1061; CHECK-SD-NEXT: fcvt s0, h01062; CHECK-SD-NEXT: bl expf1063; CHECK-SD-NEXT: fcvt h0, s01064; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload1065; CHECK-SD-NEXT: mov v0.h[1], v1.h[0]1066; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill1067; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload1068; CHECK-SD-NEXT: mov h0, v0.h[2]1069; CHECK-SD-NEXT: fcvt s0, h01070; CHECK-SD-NEXT: bl expf1071; CHECK-SD-NEXT: fcvt h0, s01072; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload1073; CHECK-SD-NEXT: mov v1.h[2], v0.h[0]1074; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload1075; CHECK-SD-NEXT: mov h0, v0.h[3]1076; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill1077; CHECK-SD-NEXT: fcvt s0, h01078; CHECK-SD-NEXT: bl expf1079; CHECK-SD-NEXT: fcvt h0, s01080; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload1081; CHECK-SD-NEXT: mov v1.h[3], v0.h[0]1082; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload1083; CHECK-SD-NEXT: mov h0, v0.h[4]1084; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill1085; CHECK-SD-NEXT: fcvt s0, h01086; CHECK-SD-NEXT: bl expf1087; CHECK-SD-NEXT: fcvt h0, s01088; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload1089; CHECK-SD-NEXT: mov v1.h[4], v0.h[0]1090; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload1091; CHECK-SD-NEXT: mov h0, v0.h[5]1092; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill1093; CHECK-SD-NEXT: fcvt s0, h01094; CHECK-SD-NEXT: bl expf1095; CHECK-SD-NEXT: fcvt h0, s01096; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload1097; CHECK-SD-NEXT: mov v1.h[5], v0.h[0]1098; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload1099; CHECK-SD-NEXT: mov h0, v0.h[6]1100; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill1101; CHECK-SD-NEXT: fcvt s0, h01102; CHECK-SD-NEXT: bl expf1103; CHECK-SD-NEXT: fcvt h0, s01104; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload1105; CHECK-SD-NEXT: mov v1.h[6], v0.h[0]1106; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload1107; CHECK-SD-NEXT: mov h0, v0.h[7]1108; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill1109; CHECK-SD-NEXT: fcvt s0, h01110; CHECK-SD-NEXT: bl expf1111; CHECK-SD-NEXT: fmov s1, s01112; CHECK-SD-NEXT: ldr x30, [sp, #48] // 8-byte Reload1113; CHECK-SD-NEXT: fcvt h2, s11114; CHECK-SD-NEXT: ldp q1, q0, [sp, #16] // 32-byte Folded Reload1115; CHECK-SD-NEXT: mov v1.h[7], v2.h[0]1116; CHECK-SD-NEXT: add sp, sp, #641117; CHECK-SD-NEXT: ret1118;1119; CHECK-GI-LABEL: exp_v16f16:1120; CHECK-GI: // %bb.0: // %entry1121; CHECK-GI-NEXT: sub sp, sp, #3201122; CHECK-GI-NEXT: stp d15, d14, [sp, #240] // 16-byte Folded Spill1123; CHECK-GI-NEXT: stp d13, d12, [sp, #256] // 16-byte Folded Spill1124; CHECK-GI-NEXT: stp d11, d10, [sp, #272] // 16-byte Folded Spill1125; CHECK-GI-NEXT: stp d9, d8, [sp, #288] // 16-byte Folded Spill1126; CHECK-GI-NEXT: stp x29, x30, [sp, #304] // 16-byte Folded Spill1127; CHECK-GI-NEXT: .cfi_def_cfa_offset 3201128; CHECK-GI-NEXT: .cfi_offset w30, -81129; CHECK-GI-NEXT: .cfi_offset w29, -161130; CHECK-GI-NEXT: .cfi_offset b8, -241131; CHECK-GI-NEXT: .cfi_offset b9, -321132; CHECK-GI-NEXT: .cfi_offset b10, -401133; CHECK-GI-NEXT: .cfi_offset b11, -481134; CHECK-GI-NEXT: .cfi_offset b12, -561135; CHECK-GI-NEXT: .cfi_offset b13, -641136; CHECK-GI-NEXT: .cfi_offset b14, -721137; CHECK-GI-NEXT: .cfi_offset b15, -801138; CHECK-GI-NEXT: mov v2.16b, v1.16b1139; CHECK-GI-NEXT: str q1, [sp, #80] // 16-byte Spill1140; CHECK-GI-NEXT: mov h14, v1.h[1]1141; CHECK-GI-NEXT: mov h1, v1.h[2]1142; CHECK-GI-NEXT: mov h15, v0.h[1]1143; CHECK-GI-NEXT: mov h8, v0.h[2]1144; CHECK-GI-NEXT: mov h9, v0.h[3]1145; CHECK-GI-NEXT: mov h10, v0.h[4]1146; CHECK-GI-NEXT: mov h11, v0.h[5]1147; CHECK-GI-NEXT: mov h12, v0.h[6]1148; CHECK-GI-NEXT: mov h13, v0.h[7]1149; CHECK-GI-NEXT: fcvt s0, h01150; CHECK-GI-NEXT: str h1, [sp, #16] // 2-byte Spill1151; CHECK-GI-NEXT: mov h1, v2.h[3]1152; CHECK-GI-NEXT: str h1, [sp, #32] // 2-byte Spill1153; CHECK-GI-NEXT: mov h1, v2.h[4]1154; CHECK-GI-NEXT: str h1, [sp, #48] // 2-byte Spill1155; CHECK-GI-NEXT: mov h1, v2.h[5]1156; CHECK-GI-NEXT: str h1, [sp, #64] // 2-byte Spill1157; CHECK-GI-NEXT: mov h1, v2.h[6]1158; CHECK-GI-NEXT: str h1, [sp, #96] // 2-byte Spill1159; CHECK-GI-NEXT: mov h1, v2.h[7]1160; CHECK-GI-NEXT: str h1, [sp, #160] // 2-byte Spill1161; CHECK-GI-NEXT: bl expf1162; CHECK-GI-NEXT: fcvt s1, h151163; CHECK-GI-NEXT: fcvt h0, s01164; CHECK-GI-NEXT: str q0, [sp, #192] // 16-byte Spill1165; CHECK-GI-NEXT: fmov s0, s11166; CHECK-GI-NEXT: bl expf1167; CHECK-GI-NEXT: fcvt s1, h81168; CHECK-GI-NEXT: fcvt h0, s01169; CHECK-GI-NEXT: str q0, [sp, #112] // 16-byte Spill1170; CHECK-GI-NEXT: fmov s0, s11171; CHECK-GI-NEXT: bl expf1172; CHECK-GI-NEXT: fcvt s1, h91173; CHECK-GI-NEXT: fcvt h0, s01174; CHECK-GI-NEXT: str q0, [sp, #224] // 16-byte Spill1175; CHECK-GI-NEXT: fmov s0, s11176; CHECK-GI-NEXT: bl expf1177; CHECK-GI-NEXT: fcvt s1, h101178; CHECK-GI-NEXT: fcvt h0, s01179; CHECK-GI-NEXT: str q0, [sp, #208] // 16-byte Spill1180; CHECK-GI-NEXT: fmov s0, s11181; CHECK-GI-NEXT: bl expf1182; CHECK-GI-NEXT: fcvt s1, h111183; CHECK-GI-NEXT: fcvt h0, s01184; CHECK-GI-NEXT: str q0, [sp, #176] // 16-byte Spill1185; CHECK-GI-NEXT: fmov s0, s11186; CHECK-GI-NEXT: bl expf1187; CHECK-GI-NEXT: fcvt s1, h121188; CHECK-GI-NEXT: fcvt h0, s01189; CHECK-GI-NEXT: str q0, [sp, #144] // 16-byte Spill1190; CHECK-GI-NEXT: fmov s0, s11191; CHECK-GI-NEXT: bl expf1192; CHECK-GI-NEXT: fcvt s1, h131193; CHECK-GI-NEXT: fcvt h0, s01194; CHECK-GI-NEXT: str q0, [sp, #128] // 16-byte Spill1195; CHECK-GI-NEXT: fmov s0, s11196; CHECK-GI-NEXT: bl expf1197; CHECK-GI-NEXT: ldr q1, [sp, #80] // 16-byte Reload1198; CHECK-GI-NEXT: fcvt h0, s01199; CHECK-GI-NEXT: fcvt s1, h11200; CHECK-GI-NEXT: str q0, [sp, #80] // 16-byte Spill1201; CHECK-GI-NEXT: fmov s0, s11202; CHECK-GI-NEXT: bl expf1203; CHECK-GI-NEXT: fcvt s1, h141204; CHECK-GI-NEXT: fcvt h0, s01205; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill1206; CHECK-GI-NEXT: fmov s0, s11207; CHECK-GI-NEXT: bl expf1208; CHECK-GI-NEXT: ldr h1, [sp, #16] // 2-byte Reload1209; CHECK-GI-NEXT: fcvt h0, s01210; CHECK-GI-NEXT: fcvt s1, h11211; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill1212; CHECK-GI-NEXT: fmov s0, s11213; CHECK-GI-NEXT: bl expf1214; CHECK-GI-NEXT: ldr h1, [sp, #32] // 2-byte Reload1215; CHECK-GI-NEXT: fcvt h0, s01216; CHECK-GI-NEXT: fcvt s1, h11217; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill1218; CHECK-GI-NEXT: fmov s0, s11219; CHECK-GI-NEXT: bl expf1220; CHECK-GI-NEXT: ldr h1, [sp, #48] // 2-byte Reload1221; CHECK-GI-NEXT: fcvt h0, s01222; CHECK-GI-NEXT: fcvt s1, h11223; CHECK-GI-NEXT: str q0, [sp, #48] // 16-byte Spill1224; CHECK-GI-NEXT: fmov s0, s11225; CHECK-GI-NEXT: bl expf1226; CHECK-GI-NEXT: ldr h1, [sp, #64] // 2-byte Reload1227; CHECK-GI-NEXT: fcvt h0, s01228; CHECK-GI-NEXT: fcvt s1, h11229; CHECK-GI-NEXT: str q0, [sp, #64] // 16-byte Spill1230; CHECK-GI-NEXT: fmov s0, s11231; CHECK-GI-NEXT: bl expf1232; CHECK-GI-NEXT: ldr h1, [sp, #96] // 2-byte Reload1233; CHECK-GI-NEXT: fcvt h0, s01234; CHECK-GI-NEXT: fcvt s1, h11235; CHECK-GI-NEXT: str q0, [sp, #96] // 16-byte Spill1236; CHECK-GI-NEXT: fmov s0, s11237; CHECK-GI-NEXT: bl expf1238; CHECK-GI-NEXT: ldr h1, [sp, #160] // 2-byte Reload1239; CHECK-GI-NEXT: fcvt h0, s01240; CHECK-GI-NEXT: fcvt s1, h11241; CHECK-GI-NEXT: str q0, [sp, #160] // 16-byte Spill1242; CHECK-GI-NEXT: fmov s0, s11243; CHECK-GI-NEXT: bl expf1244; CHECK-GI-NEXT: ldr q3, [sp, #192] // 16-byte Reload1245; CHECK-GI-NEXT: ldr q2, [sp, #112] // 16-byte Reload1246; CHECK-GI-NEXT: ldp x29, x30, [sp, #304] // 16-byte Folded Reload1247; CHECK-GI-NEXT: mov v3.h[1], v2.h[0]1248; CHECK-GI-NEXT: ldp q1, q2, [sp] // 32-byte Folded Reload1249; CHECK-GI-NEXT: ldp d9, d8, [sp, #288] // 16-byte Folded Reload1250; CHECK-GI-NEXT: ldp d11, d10, [sp, #272] // 16-byte Folded Reload1251; CHECK-GI-NEXT: mov v1.h[1], v2.h[0]1252; CHECK-GI-NEXT: ldr q2, [sp, #224] // 16-byte Reload1253; CHECK-GI-NEXT: ldp d13, d12, [sp, #256] // 16-byte Folded Reload1254; CHECK-GI-NEXT: mov v3.h[2], v2.h[0]1255; CHECK-GI-NEXT: ldr q2, [sp, #32] // 16-byte Reload1256; CHECK-GI-NEXT: ldp d15, d14, [sp, #240] // 16-byte Folded Reload1257; CHECK-GI-NEXT: mov v1.h[2], v2.h[0]1258; CHECK-GI-NEXT: ldr q2, [sp, #208] // 16-byte Reload1259; CHECK-GI-NEXT: mov v3.h[3], v2.h[0]1260; CHECK-GI-NEXT: ldr q2, [sp, #48] // 16-byte Reload1261; CHECK-GI-NEXT: mov v1.h[3], v2.h[0]1262; CHECK-GI-NEXT: ldr q2, [sp, #176] // 16-byte Reload1263; CHECK-GI-NEXT: mov v3.h[4], v2.h[0]1264; CHECK-GI-NEXT: ldr q2, [sp, #64] // 16-byte Reload1265; CHECK-GI-NEXT: mov v1.h[4], v2.h[0]1266; CHECK-GI-NEXT: ldr q2, [sp, #144] // 16-byte Reload1267; CHECK-GI-NEXT: mov v3.h[5], v2.h[0]1268; CHECK-GI-NEXT: ldr q2, [sp, #96] // 16-byte Reload1269; CHECK-GI-NEXT: mov v1.h[5], v2.h[0]1270; CHECK-GI-NEXT: fcvt h2, s01271; CHECK-GI-NEXT: ldr q0, [sp, #128] // 16-byte Reload1272; CHECK-GI-NEXT: mov v3.h[6], v0.h[0]1273; CHECK-GI-NEXT: ldr q0, [sp, #160] // 16-byte Reload1274; CHECK-GI-NEXT: mov v1.h[6], v0.h[0]1275; CHECK-GI-NEXT: ldr q0, [sp, #80] // 16-byte Reload1276; CHECK-GI-NEXT: mov v3.h[7], v0.h[0]1277; CHECK-GI-NEXT: mov v1.h[7], v2.h[0]1278; CHECK-GI-NEXT: mov v0.16b, v3.16b1279; CHECK-GI-NEXT: add sp, sp, #3201280; CHECK-GI-NEXT: ret1281entry:1282 %c = call <16 x half> @llvm.exp.v16f16(<16 x half> %a)1283 ret <16 x half> %c1284}1285 1286define <2 x fp128> @exp_v2fp128(<2 x fp128> %a) {1287; CHECK-LABEL: exp_v2fp128:1288; CHECK: // %bb.0: // %entry1289; CHECK-NEXT: sub sp, sp, #481290; CHECK-NEXT: str x30, [sp, #32] // 8-byte Spill1291; CHECK-NEXT: .cfi_def_cfa_offset 481292; CHECK-NEXT: .cfi_offset w30, -161293; CHECK-NEXT: str q1, [sp, #16] // 16-byte Spill1294; CHECK-NEXT: bl expl1295; CHECK-NEXT: str q0, [sp] // 16-byte Spill1296; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload1297; CHECK-NEXT: bl expl1298; CHECK-NEXT: mov v1.16b, v0.16b1299; CHECK-NEXT: ldr q0, [sp] // 16-byte Reload1300; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Reload1301; CHECK-NEXT: add sp, sp, #481302; CHECK-NEXT: ret1303entry:1304 %c = call <2 x fp128> @llvm.exp.v2fp128(<2 x fp128> %a)1305 ret <2 x fp128> %c1306}1307 1308define double @exp2_f64(double %a) {1309; CHECK-LABEL: exp2_f64:1310; CHECK: // %bb.0: // %entry1311; CHECK-NEXT: b exp21312entry:1313 %c = call double @llvm.exp2.f64(double %a)1314 ret double %c1315}1316 1317define float @exp2_f32(float %a) {1318; CHECK-LABEL: exp2_f32:1319; CHECK: // %bb.0: // %entry1320; CHECK-NEXT: b exp2f1321entry:1322 %c = call float @llvm.exp2.f32(float %a)1323 ret float %c1324}1325 1326define half @exp2_f16(half %a) {1327; CHECK-LABEL: exp2_f16:1328; CHECK: // %bb.0: // %entry1329; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill1330; CHECK-NEXT: .cfi_def_cfa_offset 161331; CHECK-NEXT: .cfi_offset w30, -161332; CHECK-NEXT: fcvt s0, h01333; CHECK-NEXT: bl exp2f1334; CHECK-NEXT: fcvt h0, s01335; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload1336; CHECK-NEXT: ret1337entry:1338 %c = call half @llvm.exp2.f16(half %a)1339 ret half %c1340}1341 1342define fp128 @exp2_fp128(fp128 %a) {1343; CHECK-LABEL: exp2_fp128:1344; CHECK: // %bb.0: // %entry1345; CHECK-NEXT: b exp2l1346entry:1347 %c = call fp128 @llvm.exp2.fp128(fp128 %a)1348 ret fp128 %c1349}1350 1351define <1 x double> @exp2_v1f64(<1 x double> %a) {1352; CHECK-LABEL: exp2_v1f64:1353; CHECK: // %bb.0: // %entry1354; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill1355; CHECK-NEXT: .cfi_def_cfa_offset 161356; CHECK-NEXT: .cfi_offset w30, -161357; CHECK-NEXT: bl exp21358; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload1359; CHECK-NEXT: ret1360entry:1361 %c = call <1 x double> @llvm.exp2.v1f64(<1 x double> %a)1362 ret <1 x double> %c1363}1364 1365define <2 x double> @exp2_v2f64(<2 x double> %a) {1366; CHECK-SD-LABEL: exp2_v2f64:1367; CHECK-SD: // %bb.0: // %entry1368; CHECK-SD-NEXT: sub sp, sp, #481369; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Spill1370; CHECK-SD-NEXT: .cfi_def_cfa_offset 481371; CHECK-SD-NEXT: .cfi_offset w30, -161372; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill1373; CHECK-SD-NEXT: mov d0, v0.d[1]1374; CHECK-SD-NEXT: bl exp21375; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q01376; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill1377; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload1378; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q01379; CHECK-SD-NEXT: bl exp21380; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload1381; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q01382; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload1383; CHECK-SD-NEXT: mov v0.d[1], v1.d[0]1384; CHECK-SD-NEXT: add sp, sp, #481385; CHECK-SD-NEXT: ret1386;1387; CHECK-GI-LABEL: exp2_v2f64:1388; CHECK-GI: // %bb.0: // %entry1389; CHECK-GI-NEXT: sub sp, sp, #321390; CHECK-GI-NEXT: str d8, [sp, #16] // 8-byte Spill1391; CHECK-GI-NEXT: str x30, [sp, #24] // 8-byte Spill1392; CHECK-GI-NEXT: .cfi_def_cfa_offset 321393; CHECK-GI-NEXT: .cfi_offset w30, -81394; CHECK-GI-NEXT: .cfi_offset b8, -161395; CHECK-GI-NEXT: mov d8, v0.d[1]1396; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q01397; CHECK-GI-NEXT: bl exp21398; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q01399; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill1400; CHECK-GI-NEXT: fmov d0, d81401; CHECK-GI-NEXT: bl exp21402; CHECK-GI-NEXT: ldr q1, [sp] // 16-byte Reload1403; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q01404; CHECK-GI-NEXT: ldr x30, [sp, #24] // 8-byte Reload1405; CHECK-GI-NEXT: ldr d8, [sp, #16] // 8-byte Reload1406; CHECK-GI-NEXT: mov v1.d[1], v0.d[0]1407; CHECK-GI-NEXT: mov v0.16b, v1.16b1408; CHECK-GI-NEXT: add sp, sp, #321409; CHECK-GI-NEXT: ret1410entry:1411 %c = call <2 x double> @llvm.exp2.v2f64(<2 x double> %a)1412 ret <2 x double> %c1413}1414 1415define <3 x double> @exp2_v3f64(<3 x double> %a) {1416; CHECK-SD-LABEL: exp2_v3f64:1417; CHECK-SD: // %bb.0: // %entry1418; CHECK-SD-NEXT: str d10, [sp, #-32]! // 8-byte Folded Spill1419; CHECK-SD-NEXT: stp d9, d8, [sp, #8] // 16-byte Folded Spill1420; CHECK-SD-NEXT: str x30, [sp, #24] // 8-byte Spill1421; CHECK-SD-NEXT: .cfi_def_cfa_offset 321422; CHECK-SD-NEXT: .cfi_offset w30, -81423; CHECK-SD-NEXT: .cfi_offset b8, -161424; CHECK-SD-NEXT: .cfi_offset b9, -241425; CHECK-SD-NEXT: .cfi_offset b10, -321426; CHECK-SD-NEXT: fmov d8, d21427; CHECK-SD-NEXT: fmov d9, d11428; CHECK-SD-NEXT: bl exp21429; CHECK-SD-NEXT: fmov d10, d01430; CHECK-SD-NEXT: fmov d0, d91431; CHECK-SD-NEXT: bl exp21432; CHECK-SD-NEXT: fmov d9, d01433; CHECK-SD-NEXT: fmov d0, d81434; CHECK-SD-NEXT: bl exp21435; CHECK-SD-NEXT: fmov d1, d91436; CHECK-SD-NEXT: ldp d9, d8, [sp, #8] // 16-byte Folded Reload1437; CHECK-SD-NEXT: ldr x30, [sp, #24] // 8-byte Reload1438; CHECK-SD-NEXT: fmov d2, d01439; CHECK-SD-NEXT: fmov d0, d101440; CHECK-SD-NEXT: ldr d10, [sp], #32 // 8-byte Folded Reload1441; CHECK-SD-NEXT: ret1442;1443; CHECK-GI-LABEL: exp2_v3f64:1444; CHECK-GI: // %bb.0: // %entry1445; CHECK-GI-NEXT: str d10, [sp, #-32]! // 8-byte Folded Spill1446; CHECK-GI-NEXT: stp d9, d8, [sp, #8] // 16-byte Folded Spill1447; CHECK-GI-NEXT: str x30, [sp, #24] // 8-byte Spill1448; CHECK-GI-NEXT: .cfi_def_cfa_offset 321449; CHECK-GI-NEXT: .cfi_offset w30, -81450; CHECK-GI-NEXT: .cfi_offset b8, -161451; CHECK-GI-NEXT: .cfi_offset b9, -241452; CHECK-GI-NEXT: .cfi_offset b10, -321453; CHECK-GI-NEXT: fmov d8, d11454; CHECK-GI-NEXT: fmov d9, d21455; CHECK-GI-NEXT: bl exp21456; CHECK-GI-NEXT: fmov d10, d01457; CHECK-GI-NEXT: fmov d0, d81458; CHECK-GI-NEXT: bl exp21459; CHECK-GI-NEXT: fmov d8, d01460; CHECK-GI-NEXT: fmov d0, d91461; CHECK-GI-NEXT: bl exp21462; CHECK-GI-NEXT: fmov d1, d81463; CHECK-GI-NEXT: ldp d9, d8, [sp, #8] // 16-byte Folded Reload1464; CHECK-GI-NEXT: ldr x30, [sp, #24] // 8-byte Reload1465; CHECK-GI-NEXT: fmov d2, d01466; CHECK-GI-NEXT: fmov d0, d101467; CHECK-GI-NEXT: ldr d10, [sp], #32 // 8-byte Folded Reload1468; CHECK-GI-NEXT: ret1469entry:1470 %c = call <3 x double> @llvm.exp2.v3f64(<3 x double> %a)1471 ret <3 x double> %c1472}1473 1474define <4 x double> @exp2_v4f64(<4 x double> %a) {1475; CHECK-SD-LABEL: exp2_v4f64:1476; CHECK-SD: // %bb.0: // %entry1477; CHECK-SD-NEXT: sub sp, sp, #641478; CHECK-SD-NEXT: str x30, [sp, #48] // 8-byte Spill1479; CHECK-SD-NEXT: .cfi_def_cfa_offset 641480; CHECK-SD-NEXT: .cfi_offset w30, -161481; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill1482; CHECK-SD-NEXT: mov d0, v0.d[1]1483; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill1484; CHECK-SD-NEXT: bl exp21485; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q01486; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill1487; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload1488; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q01489; CHECK-SD-NEXT: bl exp21490; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload1491; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q01492; CHECK-SD-NEXT: mov v0.d[1], v1.d[0]1493; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill1494; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Reload1495; CHECK-SD-NEXT: mov d0, v0.d[1]1496; CHECK-SD-NEXT: bl exp21497; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q01498; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill1499; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Reload1500; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q01501; CHECK-SD-NEXT: bl exp21502; CHECK-SD-NEXT: fmov d1, d01503; CHECK-SD-NEXT: ldp q2, q0, [sp] // 32-byte Folded Reload1504; CHECK-SD-NEXT: ldr x30, [sp, #48] // 8-byte Reload1505; CHECK-SD-NEXT: mov v1.d[1], v2.d[0]1506; CHECK-SD-NEXT: add sp, sp, #641507; CHECK-SD-NEXT: ret1508;1509; CHECK-GI-LABEL: exp2_v4f64:1510; CHECK-GI: // %bb.0: // %entry1511; CHECK-GI-NEXT: sub sp, sp, #801512; CHECK-GI-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill1513; CHECK-GI-NEXT: str x30, [sp, #64] // 8-byte Spill1514; CHECK-GI-NEXT: .cfi_def_cfa_offset 801515; CHECK-GI-NEXT: .cfi_offset w30, -161516; CHECK-GI-NEXT: .cfi_offset b8, -241517; CHECK-GI-NEXT: .cfi_offset b9, -321518; CHECK-GI-NEXT: str q1, [sp] // 16-byte Spill1519; CHECK-GI-NEXT: mov d8, v0.d[1]1520; CHECK-GI-NEXT: mov d9, v1.d[1]1521; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q01522; CHECK-GI-NEXT: bl exp21523; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q01524; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill1525; CHECK-GI-NEXT: fmov d0, d81526; CHECK-GI-NEXT: bl exp21527; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q01528; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill1529; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Reload1530; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q01531; CHECK-GI-NEXT: bl exp21532; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q01533; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill1534; CHECK-GI-NEXT: fmov d0, d91535; CHECK-GI-NEXT: bl exp21536; CHECK-GI-NEXT: ldp q1, q2, [sp, #16] // 32-byte Folded Reload1537; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q01538; CHECK-GI-NEXT: ldr x30, [sp, #64] // 8-byte Reload1539; CHECK-GI-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload1540; CHECK-GI-NEXT: mov v2.d[1], v1.d[0]1541; CHECK-GI-NEXT: ldr q1, [sp] // 16-byte Reload1542; CHECK-GI-NEXT: mov v1.d[1], v0.d[0]1543; CHECK-GI-NEXT: mov v0.16b, v2.16b1544; CHECK-GI-NEXT: add sp, sp, #801545; CHECK-GI-NEXT: ret1546entry:1547 %c = call <4 x double> @llvm.exp2.v4f64(<4 x double> %a)1548 ret <4 x double> %c1549}1550 1551define <2 x float> @exp2_v2f32(<2 x float> %a) {1552; CHECK-SD-LABEL: exp2_v2f32:1553; CHECK-SD: // %bb.0: // %entry1554; CHECK-SD-NEXT: sub sp, sp, #481555; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Spill1556; CHECK-SD-NEXT: .cfi_def_cfa_offset 481557; CHECK-SD-NEXT: .cfi_offset w30, -161558; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q01559; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill1560; CHECK-SD-NEXT: mov s0, v0.s[1]1561; CHECK-SD-NEXT: bl exp2f1562; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q01563; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill1564; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload1565; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q01566; CHECK-SD-NEXT: bl exp2f1567; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload1568; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q01569; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload1570; CHECK-SD-NEXT: mov v0.s[1], v1.s[0]1571; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q01572; CHECK-SD-NEXT: add sp, sp, #481573; CHECK-SD-NEXT: ret1574;1575; CHECK-GI-LABEL: exp2_v2f32:1576; CHECK-GI: // %bb.0: // %entry1577; CHECK-GI-NEXT: sub sp, sp, #321578; CHECK-GI-NEXT: str d8, [sp, #16] // 8-byte Spill1579; CHECK-GI-NEXT: str x30, [sp, #24] // 8-byte Spill1580; CHECK-GI-NEXT: .cfi_def_cfa_offset 321581; CHECK-GI-NEXT: .cfi_offset w30, -81582; CHECK-GI-NEXT: .cfi_offset b8, -161583; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q01584; CHECK-GI-NEXT: mov s8, v0.s[1]1585; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q01586; CHECK-GI-NEXT: bl exp2f1587; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q01588; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill1589; CHECK-GI-NEXT: fmov s0, s81590; CHECK-GI-NEXT: bl exp2f1591; CHECK-GI-NEXT: ldr q1, [sp] // 16-byte Reload1592; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q01593; CHECK-GI-NEXT: ldr x30, [sp, #24] // 8-byte Reload1594; CHECK-GI-NEXT: ldr d8, [sp, #16] // 8-byte Reload1595; CHECK-GI-NEXT: mov v1.s[1], v0.s[0]1596; CHECK-GI-NEXT: fmov d0, d11597; CHECK-GI-NEXT: add sp, sp, #321598; CHECK-GI-NEXT: ret1599entry:1600 %c = call <2 x float> @llvm.exp2.v2f32(<2 x float> %a)1601 ret <2 x float> %c1602}1603 1604define <3 x float> @exp2_v3f32(<3 x float> %a) {1605; CHECK-SD-LABEL: exp2_v3f32:1606; CHECK-SD: // %bb.0: // %entry1607; CHECK-SD-NEXT: sub sp, sp, #481608; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Spill1609; CHECK-SD-NEXT: .cfi_def_cfa_offset 481610; CHECK-SD-NEXT: .cfi_offset w30, -161611; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill1612; CHECK-SD-NEXT: mov s0, v0.s[1]1613; CHECK-SD-NEXT: bl exp2f1614; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q01615; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill1616; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload1617; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q01618; CHECK-SD-NEXT: bl exp2f1619; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload1620; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q01621; CHECK-SD-NEXT: mov v0.s[1], v1.s[0]1622; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill1623; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload1624; CHECK-SD-NEXT: mov s0, v0.s[2]1625; CHECK-SD-NEXT: bl exp2f1626; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload1627; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q01628; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload1629; CHECK-SD-NEXT: mov v1.s[2], v0.s[0]1630; CHECK-SD-NEXT: mov v0.16b, v1.16b1631; CHECK-SD-NEXT: add sp, sp, #481632; CHECK-SD-NEXT: ret1633;1634; CHECK-GI-LABEL: exp2_v3f32:1635; CHECK-GI: // %bb.0: // %entry1636; CHECK-GI-NEXT: sub sp, sp, #641637; CHECK-GI-NEXT: stp d9, d8, [sp, #32] // 16-byte Folded Spill1638; CHECK-GI-NEXT: str x30, [sp, #48] // 8-byte Spill1639; CHECK-GI-NEXT: .cfi_def_cfa_offset 641640; CHECK-GI-NEXT: .cfi_offset w30, -161641; CHECK-GI-NEXT: .cfi_offset b8, -241642; CHECK-GI-NEXT: .cfi_offset b9, -321643; CHECK-GI-NEXT: mov s8, v0.s[1]1644; CHECK-GI-NEXT: mov s9, v0.s[2]1645; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q01646; CHECK-GI-NEXT: bl exp2f1647; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q01648; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill1649; CHECK-GI-NEXT: fmov s0, s81650; CHECK-GI-NEXT: bl exp2f1651; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q01652; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill1653; CHECK-GI-NEXT: fmov s0, s91654; CHECK-GI-NEXT: bl exp2f1655; CHECK-GI-NEXT: ldp q2, q1, [sp] // 32-byte Folded Reload1656; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q01657; CHECK-GI-NEXT: ldr x30, [sp, #48] // 8-byte Reload1658; CHECK-GI-NEXT: ldp d9, d8, [sp, #32] // 16-byte Folded Reload1659; CHECK-GI-NEXT: mov v1.s[1], v2.s[0]1660; CHECK-GI-NEXT: mov v1.s[2], v0.s[0]1661; CHECK-GI-NEXT: mov v0.16b, v1.16b1662; CHECK-GI-NEXT: add sp, sp, #641663; CHECK-GI-NEXT: ret1664entry:1665 %c = call <3 x float> @llvm.exp2.v3f32(<3 x float> %a)1666 ret <3 x float> %c1667}1668 1669define <4 x float> @exp2_v4f32(<4 x float> %a) {1670; CHECK-SD-LABEL: exp2_v4f32:1671; CHECK-SD: // %bb.0: // %entry1672; CHECK-SD-NEXT: sub sp, sp, #481673; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Spill1674; CHECK-SD-NEXT: .cfi_def_cfa_offset 481675; CHECK-SD-NEXT: .cfi_offset w30, -161676; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill1677; CHECK-SD-NEXT: mov s0, v0.s[1]1678; CHECK-SD-NEXT: bl exp2f1679; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q01680; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill1681; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload1682; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q01683; CHECK-SD-NEXT: bl exp2f1684; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload1685; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q01686; CHECK-SD-NEXT: mov v0.s[1], v1.s[0]1687; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill1688; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload1689; CHECK-SD-NEXT: mov s0, v0.s[2]1690; CHECK-SD-NEXT: bl exp2f1691; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload1692; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q01693; CHECK-SD-NEXT: mov v1.s[2], v0.s[0]1694; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload1695; CHECK-SD-NEXT: mov s0, v0.s[3]1696; CHECK-SD-NEXT: str q1, [sp] // 16-byte Spill1697; CHECK-SD-NEXT: bl exp2f1698; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload1699; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q01700; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload1701; CHECK-SD-NEXT: mov v1.s[3], v0.s[0]1702; CHECK-SD-NEXT: mov v0.16b, v1.16b1703; CHECK-SD-NEXT: add sp, sp, #481704; CHECK-SD-NEXT: ret1705;1706; CHECK-GI-LABEL: exp2_v4f32:1707; CHECK-GI: // %bb.0: // %entry1708; CHECK-GI-NEXT: sub sp, sp, #801709; CHECK-GI-NEXT: str d10, [sp, #48] // 8-byte Spill1710; CHECK-GI-NEXT: stp d9, d8, [sp, #56] // 16-byte Folded Spill1711; CHECK-GI-NEXT: str x30, [sp, #72] // 8-byte Spill1712; CHECK-GI-NEXT: .cfi_def_cfa_offset 801713; CHECK-GI-NEXT: .cfi_offset w30, -81714; CHECK-GI-NEXT: .cfi_offset b8, -161715; CHECK-GI-NEXT: .cfi_offset b9, -241716; CHECK-GI-NEXT: .cfi_offset b10, -321717; CHECK-GI-NEXT: mov s8, v0.s[1]1718; CHECK-GI-NEXT: mov s9, v0.s[2]1719; CHECK-GI-NEXT: mov s10, v0.s[3]1720; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q01721; CHECK-GI-NEXT: bl exp2f1722; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q01723; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill1724; CHECK-GI-NEXT: fmov s0, s81725; CHECK-GI-NEXT: bl exp2f1726; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q01727; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill1728; CHECK-GI-NEXT: fmov s0, s91729; CHECK-GI-NEXT: bl exp2f1730; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q01731; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill1732; CHECK-GI-NEXT: fmov s0, s101733; CHECK-GI-NEXT: bl exp2f1734; CHECK-GI-NEXT: ldp q2, q1, [sp, #16] // 32-byte Folded Reload1735; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q01736; CHECK-GI-NEXT: ldr x30, [sp, #72] // 8-byte Reload1737; CHECK-GI-NEXT: ldp d9, d8, [sp, #56] // 16-byte Folded Reload1738; CHECK-GI-NEXT: ldr d10, [sp, #48] // 8-byte Reload1739; CHECK-GI-NEXT: mov v1.s[1], v2.s[0]1740; CHECK-GI-NEXT: ldr q2, [sp] // 16-byte Reload1741; CHECK-GI-NEXT: mov v1.s[2], v2.s[0]1742; CHECK-GI-NEXT: mov v1.s[3], v0.s[0]1743; CHECK-GI-NEXT: mov v0.16b, v1.16b1744; CHECK-GI-NEXT: add sp, sp, #801745; CHECK-GI-NEXT: ret1746entry:1747 %c = call <4 x float> @llvm.exp2.v4f32(<4 x float> %a)1748 ret <4 x float> %c1749}1750 1751define <8 x float> @exp2_v8f32(<8 x float> %a) {1752; CHECK-SD-LABEL: exp2_v8f32:1753; CHECK-SD: // %bb.0: // %entry1754; CHECK-SD-NEXT: sub sp, sp, #641755; CHECK-SD-NEXT: str x30, [sp, #48] // 8-byte Spill1756; CHECK-SD-NEXT: .cfi_def_cfa_offset 641757; CHECK-SD-NEXT: .cfi_offset w30, -161758; CHECK-SD-NEXT: stp q0, q1, [sp] // 32-byte Folded Spill1759; CHECK-SD-NEXT: mov s0, v0.s[1]1760; CHECK-SD-NEXT: bl exp2f1761; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q01762; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Spill1763; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload1764; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q01765; CHECK-SD-NEXT: bl exp2f1766; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload1767; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q01768; CHECK-SD-NEXT: mov v0.s[1], v1.s[0]1769; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Spill1770; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload1771; CHECK-SD-NEXT: mov s0, v0.s[2]1772; CHECK-SD-NEXT: bl exp2f1773; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload1774; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q01775; CHECK-SD-NEXT: mov v1.s[2], v0.s[0]1776; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload1777; CHECK-SD-NEXT: mov s0, v0.s[3]1778; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill1779; CHECK-SD-NEXT: bl exp2f1780; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload1781; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q01782; CHECK-SD-NEXT: mov v1.s[3], v0.s[0]1783; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload1784; CHECK-SD-NEXT: mov s0, v0.s[1]1785; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill1786; CHECK-SD-NEXT: bl exp2f1787; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q01788; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill1789; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload1790; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q01791; CHECK-SD-NEXT: bl exp2f1792; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload1793; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q01794; CHECK-SD-NEXT: mov v0.s[1], v1.s[0]1795; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill1796; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload1797; CHECK-SD-NEXT: mov s0, v0.s[2]1798; CHECK-SD-NEXT: bl exp2f1799; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload1800; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q01801; CHECK-SD-NEXT: mov v1.s[2], v0.s[0]1802; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload1803; CHECK-SD-NEXT: mov s0, v0.s[3]1804; CHECK-SD-NEXT: str q1, [sp] // 16-byte Spill1805; CHECK-SD-NEXT: bl exp2f1806; CHECK-SD-NEXT: fmov s2, s01807; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload1808; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Reload1809; CHECK-SD-NEXT: ldr x30, [sp, #48] // 8-byte Reload1810; CHECK-SD-NEXT: mov v1.s[3], v2.s[0]1811; CHECK-SD-NEXT: add sp, sp, #641812; CHECK-SD-NEXT: ret1813;1814; CHECK-GI-LABEL: exp2_v8f32:1815; CHECK-GI: // %bb.0: // %entry1816; CHECK-GI-NEXT: sub sp, sp, #1761817; CHECK-GI-NEXT: stp d13, d12, [sp, #112] // 16-byte Folded Spill1818; CHECK-GI-NEXT: stp d11, d10, [sp, #128] // 16-byte Folded Spill1819; CHECK-GI-NEXT: stp d9, d8, [sp, #144] // 16-byte Folded Spill1820; CHECK-GI-NEXT: str x30, [sp, #160] // 8-byte Spill1821; CHECK-GI-NEXT: .cfi_def_cfa_offset 1761822; CHECK-GI-NEXT: .cfi_offset w30, -161823; CHECK-GI-NEXT: .cfi_offset b8, -241824; CHECK-GI-NEXT: .cfi_offset b9, -321825; CHECK-GI-NEXT: .cfi_offset b10, -401826; CHECK-GI-NEXT: .cfi_offset b11, -481827; CHECK-GI-NEXT: .cfi_offset b12, -561828; CHECK-GI-NEXT: .cfi_offset b13, -641829; CHECK-GI-NEXT: str q1, [sp, #32] // 16-byte Spill1830; CHECK-GI-NEXT: mov s8, v0.s[1]1831; CHECK-GI-NEXT: mov s9, v0.s[2]1832; CHECK-GI-NEXT: mov s10, v0.s[3]1833; CHECK-GI-NEXT: mov s11, v1.s[1]1834; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q01835; CHECK-GI-NEXT: mov s12, v1.s[2]1836; CHECK-GI-NEXT: mov s13, v1.s[3]1837; CHECK-GI-NEXT: bl exp2f1838; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q01839; CHECK-GI-NEXT: str q0, [sp, #64] // 16-byte Spill1840; CHECK-GI-NEXT: fmov s0, s81841; CHECK-GI-NEXT: bl exp2f1842; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q01843; CHECK-GI-NEXT: str q0, [sp, #48] // 16-byte Spill1844; CHECK-GI-NEXT: fmov s0, s91845; CHECK-GI-NEXT: bl exp2f1846; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q01847; CHECK-GI-NEXT: str q0, [sp, #96] // 16-byte Spill1848; CHECK-GI-NEXT: fmov s0, s101849; CHECK-GI-NEXT: bl exp2f1850; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q01851; CHECK-GI-NEXT: str q0, [sp, #80] // 16-byte Spill1852; CHECK-GI-NEXT: ldr q0, [sp, #32] // 16-byte Reload1853; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q01854; CHECK-GI-NEXT: bl exp2f1855; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q01856; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill1857; CHECK-GI-NEXT: fmov s0, s111858; CHECK-GI-NEXT: bl exp2f1859; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q01860; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill1861; CHECK-GI-NEXT: fmov s0, s121862; CHECK-GI-NEXT: bl exp2f1863; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q01864; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill1865; CHECK-GI-NEXT: fmov s0, s131866; CHECK-GI-NEXT: bl exp2f1867; CHECK-GI-NEXT: ldp q2, q1, [sp, #48] // 32-byte Folded Reload1868; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q01869; CHECK-GI-NEXT: ldr x30, [sp, #160] // 8-byte Reload1870; CHECK-GI-NEXT: ldp d9, d8, [sp, #144] // 16-byte Folded Reload1871; CHECK-GI-NEXT: ldp d11, d10, [sp, #128] // 16-byte Folded Reload1872; CHECK-GI-NEXT: mov v1.s[1], v2.s[0]1873; CHECK-GI-NEXT: ldp q2, q3, [sp, #16] // 32-byte Folded Reload1874; CHECK-GI-NEXT: ldp d13, d12, [sp, #112] // 16-byte Folded Reload1875; CHECK-GI-NEXT: mov v3.s[1], v2.s[0]1876; CHECK-GI-NEXT: ldr q2, [sp, #96] // 16-byte Reload1877; CHECK-GI-NEXT: mov v1.s[2], v2.s[0]1878; CHECK-GI-NEXT: ldr q2, [sp] // 16-byte Reload1879; CHECK-GI-NEXT: mov v3.s[2], v2.s[0]1880; CHECK-GI-NEXT: ldr q2, [sp, #80] // 16-byte Reload1881; CHECK-GI-NEXT: mov v1.s[3], v2.s[0]1882; CHECK-GI-NEXT: mov v3.s[3], v0.s[0]1883; CHECK-GI-NEXT: mov v2.16b, v1.16b1884; CHECK-GI-NEXT: mov v1.16b, v3.16b1885; CHECK-GI-NEXT: mov v0.16b, v2.16b1886; CHECK-GI-NEXT: add sp, sp, #1761887; CHECK-GI-NEXT: ret1888entry:1889 %c = call <8 x float> @llvm.exp2.v8f32(<8 x float> %a)1890 ret <8 x float> %c1891}1892 1893define <7 x half> @exp2_v7f16(<7 x half> %a) {1894; CHECK-SD-LABEL: exp2_v7f16:1895; CHECK-SD: // %bb.0: // %entry1896; CHECK-SD-NEXT: sub sp, sp, #481897; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Spill1898; CHECK-SD-NEXT: .cfi_def_cfa_offset 481899; CHECK-SD-NEXT: .cfi_offset w30, -161900; CHECK-SD-NEXT: mov h1, v0.h[1]1901; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill1902; CHECK-SD-NEXT: fcvt s0, h11903; CHECK-SD-NEXT: bl exp2f1904; CHECK-SD-NEXT: fcvt h0, s01905; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill1906; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload1907; CHECK-SD-NEXT: fcvt s0, h01908; CHECK-SD-NEXT: bl exp2f1909; CHECK-SD-NEXT: fcvt h0, s01910; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload1911; CHECK-SD-NEXT: mov v0.h[1], v1.h[0]1912; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill1913; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload1914; CHECK-SD-NEXT: mov h0, v0.h[2]1915; CHECK-SD-NEXT: fcvt s0, h01916; CHECK-SD-NEXT: bl exp2f1917; CHECK-SD-NEXT: fcvt h0, s01918; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload1919; CHECK-SD-NEXT: mov v1.h[2], v0.h[0]1920; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload1921; CHECK-SD-NEXT: mov h0, v0.h[3]1922; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill1923; CHECK-SD-NEXT: fcvt s0, h01924; CHECK-SD-NEXT: bl exp2f1925; CHECK-SD-NEXT: fcvt h0, s01926; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload1927; CHECK-SD-NEXT: mov v1.h[3], v0.h[0]1928; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload1929; CHECK-SD-NEXT: mov h0, v0.h[4]1930; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill1931; CHECK-SD-NEXT: fcvt s0, h01932; CHECK-SD-NEXT: bl exp2f1933; CHECK-SD-NEXT: fcvt h0, s01934; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload1935; CHECK-SD-NEXT: mov v1.h[4], v0.h[0]1936; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload1937; CHECK-SD-NEXT: mov h0, v0.h[5]1938; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill1939; CHECK-SD-NEXT: fcvt s0, h01940; CHECK-SD-NEXT: bl exp2f1941; CHECK-SD-NEXT: fcvt h0, s01942; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload1943; CHECK-SD-NEXT: mov v1.h[5], v0.h[0]1944; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload1945; CHECK-SD-NEXT: mov h0, v0.h[6]1946; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill1947; CHECK-SD-NEXT: fcvt s0, h01948; CHECK-SD-NEXT: bl exp2f1949; CHECK-SD-NEXT: fcvt h0, s01950; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload1951; CHECK-SD-NEXT: mov v1.h[6], v0.h[0]1952; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload1953; CHECK-SD-NEXT: mov h0, v0.h[7]1954; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill1955; CHECK-SD-NEXT: fcvt s0, h01956; CHECK-SD-NEXT: bl exp2f1957; CHECK-SD-NEXT: fcvt h1, s01958; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload1959; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload1960; CHECK-SD-NEXT: mov v0.h[7], v1.h[0]1961; CHECK-SD-NEXT: add sp, sp, #481962; CHECK-SD-NEXT: ret1963;1964; CHECK-GI-LABEL: exp2_v7f16:1965; CHECK-GI: // %bb.0: // %entry1966; CHECK-GI-NEXT: sub sp, sp, #1601967; CHECK-GI-NEXT: stp d13, d12, [sp, #96] // 16-byte Folded Spill1968; CHECK-GI-NEXT: stp d11, d10, [sp, #112] // 16-byte Folded Spill1969; CHECK-GI-NEXT: stp d9, d8, [sp, #128] // 16-byte Folded Spill1970; CHECK-GI-NEXT: str x30, [sp, #144] // 8-byte Spill1971; CHECK-GI-NEXT: .cfi_def_cfa_offset 1601972; CHECK-GI-NEXT: .cfi_offset w30, -161973; CHECK-GI-NEXT: .cfi_offset b8, -241974; CHECK-GI-NEXT: .cfi_offset b9, -321975; CHECK-GI-NEXT: .cfi_offset b10, -401976; CHECK-GI-NEXT: .cfi_offset b11, -481977; CHECK-GI-NEXT: .cfi_offset b12, -561978; CHECK-GI-NEXT: .cfi_offset b13, -641979; CHECK-GI-NEXT: mov h8, v0.h[1]1980; CHECK-GI-NEXT: mov h9, v0.h[2]1981; CHECK-GI-NEXT: mov h10, v0.h[3]1982; CHECK-GI-NEXT: mov h11, v0.h[4]1983; CHECK-GI-NEXT: mov h12, v0.h[5]1984; CHECK-GI-NEXT: mov h13, v0.h[6]1985; CHECK-GI-NEXT: fcvt s0, h01986; CHECK-GI-NEXT: bl exp2f1987; CHECK-GI-NEXT: fcvt s1, h81988; CHECK-GI-NEXT: fcvt h0, s01989; CHECK-GI-NEXT: str q0, [sp, #80] // 16-byte Spill1990; CHECK-GI-NEXT: fmov s0, s11991; CHECK-GI-NEXT: bl exp2f1992; CHECK-GI-NEXT: fcvt s1, h91993; CHECK-GI-NEXT: fcvt h0, s01994; CHECK-GI-NEXT: str q0, [sp, #48] // 16-byte Spill1995; CHECK-GI-NEXT: fmov s0, s11996; CHECK-GI-NEXT: bl exp2f1997; CHECK-GI-NEXT: fcvt s1, h101998; CHECK-GI-NEXT: fcvt h0, s01999; CHECK-GI-NEXT: str q0, [sp, #64] // 16-byte Spill2000; CHECK-GI-NEXT: fmov s0, s12001; CHECK-GI-NEXT: bl exp2f2002; CHECK-GI-NEXT: fcvt s1, h112003; CHECK-GI-NEXT: fcvt h0, s02004; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill2005; CHECK-GI-NEXT: fmov s0, s12006; CHECK-GI-NEXT: bl exp2f2007; CHECK-GI-NEXT: fcvt s1, h122008; CHECK-GI-NEXT: fcvt h0, s02009; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill2010; CHECK-GI-NEXT: fmov s0, s12011; CHECK-GI-NEXT: bl exp2f2012; CHECK-GI-NEXT: fcvt s1, h132013; CHECK-GI-NEXT: fcvt h0, s02014; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill2015; CHECK-GI-NEXT: fmov s0, s12016; CHECK-GI-NEXT: bl exp2f2017; CHECK-GI-NEXT: ldp q3, q2, [sp, #48] // 32-byte Folded Reload2018; CHECK-GI-NEXT: fcvt h0, s02019; CHECK-GI-NEXT: ldr q1, [sp, #80] // 16-byte Reload2020; CHECK-GI-NEXT: ldp d9, d8, [sp, #128] // 16-byte Folded Reload2021; CHECK-GI-NEXT: ldp d11, d10, [sp, #112] // 16-byte Folded Reload2022; CHECK-GI-NEXT: ldr x30, [sp, #144] // 8-byte Reload2023; CHECK-GI-NEXT: mov v1.h[1], v3.h[0]2024; CHECK-GI-NEXT: ldp d13, d12, [sp, #96] // 16-byte Folded Reload2025; CHECK-GI-NEXT: mov v1.h[2], v2.h[0]2026; CHECK-GI-NEXT: ldp q2, q3, [sp, #16] // 32-byte Folded Reload2027; CHECK-GI-NEXT: mov v1.h[3], v3.h[0]2028; CHECK-GI-NEXT: mov v1.h[4], v2.h[0]2029; CHECK-GI-NEXT: ldr q2, [sp] // 16-byte Reload2030; CHECK-GI-NEXT: mov v1.h[5], v2.h[0]2031; CHECK-GI-NEXT: mov v1.h[6], v0.h[0]2032; CHECK-GI-NEXT: mov v0.16b, v1.16b2033; CHECK-GI-NEXT: add sp, sp, #1602034; CHECK-GI-NEXT: ret2035entry:2036 %c = call <7 x half> @llvm.exp2.v7f16(<7 x half> %a)2037 ret <7 x half> %c2038}2039 2040define <4 x half> @exp2_v4f16(<4 x half> %a) {2041; CHECK-SD-LABEL: exp2_v4f16:2042; CHECK-SD: // %bb.0: // %entry2043; CHECK-SD-NEXT: sub sp, sp, #482044; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Spill2045; CHECK-SD-NEXT: .cfi_def_cfa_offset 482046; CHECK-SD-NEXT: .cfi_offset w30, -162047; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q02048; CHECK-SD-NEXT: mov h1, v0.h[1]2049; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill2050; CHECK-SD-NEXT: fcvt s0, h12051; CHECK-SD-NEXT: bl exp2f2052; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload2053; CHECK-SD-NEXT: fcvt h0, s02054; CHECK-SD-NEXT: fcvt s1, h12055; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill2056; CHECK-SD-NEXT: fmov s0, s12057; CHECK-SD-NEXT: bl exp2f2058; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload2059; CHECK-SD-NEXT: fcvt h2, s02060; CHECK-SD-NEXT: mov h1, v1.h[2]2061; CHECK-SD-NEXT: fcvt s0, h12062; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload2063; CHECK-SD-NEXT: mov v2.h[1], v1.h[0]2064; CHECK-SD-NEXT: str q2, [sp] // 16-byte Spill2065; CHECK-SD-NEXT: bl exp2f2066; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload2067; CHECK-SD-NEXT: fcvt h2, s02068; CHECK-SD-NEXT: mov h1, v1.h[3]2069; CHECK-SD-NEXT: fcvt s0, h12070; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload2071; CHECK-SD-NEXT: mov v1.h[2], v2.h[0]2072; CHECK-SD-NEXT: str q1, [sp] // 16-byte Spill2073; CHECK-SD-NEXT: bl exp2f2074; CHECK-SD-NEXT: fcvt h1, s02075; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload2076; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload2077; CHECK-SD-NEXT: mov v0.h[3], v1.h[0]2078; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q02079; CHECK-SD-NEXT: add sp, sp, #482080; CHECK-SD-NEXT: ret2081;2082; CHECK-GI-LABEL: exp2_v4f16:2083; CHECK-GI: // %bb.0: // %entry2084; CHECK-GI-NEXT: sub sp, sp, #802085; CHECK-GI-NEXT: str d10, [sp, #48] // 8-byte Spill2086; CHECK-GI-NEXT: stp d9, d8, [sp, #56] // 16-byte Folded Spill2087; CHECK-GI-NEXT: str x30, [sp, #72] // 8-byte Spill2088; CHECK-GI-NEXT: .cfi_def_cfa_offset 802089; CHECK-GI-NEXT: .cfi_offset w30, -82090; CHECK-GI-NEXT: .cfi_offset b8, -162091; CHECK-GI-NEXT: .cfi_offset b9, -242092; CHECK-GI-NEXT: .cfi_offset b10, -322093; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q02094; CHECK-GI-NEXT: mov h8, v0.h[1]2095; CHECK-GI-NEXT: mov h9, v0.h[2]2096; CHECK-GI-NEXT: mov h10, v0.h[3]2097; CHECK-GI-NEXT: fcvt s0, h02098; CHECK-GI-NEXT: bl exp2f2099; CHECK-GI-NEXT: fcvt s1, h82100; CHECK-GI-NEXT: fcvt h0, s02101; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill2102; CHECK-GI-NEXT: fmov s0, s12103; CHECK-GI-NEXT: bl exp2f2104; CHECK-GI-NEXT: fcvt s1, h92105; CHECK-GI-NEXT: fcvt h0, s02106; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill2107; CHECK-GI-NEXT: fmov s0, s12108; CHECK-GI-NEXT: bl exp2f2109; CHECK-GI-NEXT: fcvt s1, h102110; CHECK-GI-NEXT: fcvt h0, s02111; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill2112; CHECK-GI-NEXT: fmov s0, s12113; CHECK-GI-NEXT: bl exp2f2114; CHECK-GI-NEXT: ldp q3, q2, [sp] // 32-byte Folded Reload2115; CHECK-GI-NEXT: fcvt h0, s02116; CHECK-GI-NEXT: ldr q1, [sp, #32] // 16-byte Reload2117; CHECK-GI-NEXT: ldp d9, d8, [sp, #56] // 16-byte Folded Reload2118; CHECK-GI-NEXT: ldr x30, [sp, #72] // 8-byte Reload2119; CHECK-GI-NEXT: ldr d10, [sp, #48] // 8-byte Reload2120; CHECK-GI-NEXT: mov v1.h[1], v3.h[0]2121; CHECK-GI-NEXT: mov v1.h[2], v2.h[0]2122; CHECK-GI-NEXT: mov v1.h[3], v0.h[0]2123; CHECK-GI-NEXT: mov v0.16b, v1.16b2124; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q02125; CHECK-GI-NEXT: add sp, sp, #802126; CHECK-GI-NEXT: ret2127entry:2128 %c = call <4 x half> @llvm.exp2.v4f16(<4 x half> %a)2129 ret <4 x half> %c2130}2131 2132define <8 x half> @exp2_v8f16(<8 x half> %a) {2133; CHECK-SD-LABEL: exp2_v8f16:2134; CHECK-SD: // %bb.0: // %entry2135; CHECK-SD-NEXT: sub sp, sp, #482136; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Spill2137; CHECK-SD-NEXT: .cfi_def_cfa_offset 482138; CHECK-SD-NEXT: .cfi_offset w30, -162139; CHECK-SD-NEXT: mov h1, v0.h[1]2140; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill2141; CHECK-SD-NEXT: fcvt s0, h12142; CHECK-SD-NEXT: bl exp2f2143; CHECK-SD-NEXT: fcvt h0, s02144; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill2145; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload2146; CHECK-SD-NEXT: fcvt s0, h02147; CHECK-SD-NEXT: bl exp2f2148; CHECK-SD-NEXT: fcvt h0, s02149; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload2150; CHECK-SD-NEXT: mov v0.h[1], v1.h[0]2151; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill2152; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload2153; CHECK-SD-NEXT: mov h0, v0.h[2]2154; CHECK-SD-NEXT: fcvt s0, h02155; CHECK-SD-NEXT: bl exp2f2156; CHECK-SD-NEXT: fcvt h0, s02157; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload2158; CHECK-SD-NEXT: mov v1.h[2], v0.h[0]2159; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload2160; CHECK-SD-NEXT: mov h0, v0.h[3]2161; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill2162; CHECK-SD-NEXT: fcvt s0, h02163; CHECK-SD-NEXT: bl exp2f2164; CHECK-SD-NEXT: fcvt h0, s02165; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload2166; CHECK-SD-NEXT: mov v1.h[3], v0.h[0]2167; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload2168; CHECK-SD-NEXT: mov h0, v0.h[4]2169; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill2170; CHECK-SD-NEXT: fcvt s0, h02171; CHECK-SD-NEXT: bl exp2f2172; CHECK-SD-NEXT: fcvt h0, s02173; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload2174; CHECK-SD-NEXT: mov v1.h[4], v0.h[0]2175; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload2176; CHECK-SD-NEXT: mov h0, v0.h[5]2177; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill2178; CHECK-SD-NEXT: fcvt s0, h02179; CHECK-SD-NEXT: bl exp2f2180; CHECK-SD-NEXT: fcvt h0, s02181; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload2182; CHECK-SD-NEXT: mov v1.h[5], v0.h[0]2183; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload2184; CHECK-SD-NEXT: mov h0, v0.h[6]2185; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill2186; CHECK-SD-NEXT: fcvt s0, h02187; CHECK-SD-NEXT: bl exp2f2188; CHECK-SD-NEXT: fcvt h0, s02189; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload2190; CHECK-SD-NEXT: mov v1.h[6], v0.h[0]2191; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload2192; CHECK-SD-NEXT: mov h0, v0.h[7]2193; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill2194; CHECK-SD-NEXT: fcvt s0, h02195; CHECK-SD-NEXT: bl exp2f2196; CHECK-SD-NEXT: fcvt h1, s02197; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload2198; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload2199; CHECK-SD-NEXT: mov v0.h[7], v1.h[0]2200; CHECK-SD-NEXT: add sp, sp, #482201; CHECK-SD-NEXT: ret2202;2203; CHECK-GI-LABEL: exp2_v8f16:2204; CHECK-GI: // %bb.0: // %entry2205; CHECK-GI-NEXT: sub sp, sp, #1762206; CHECK-GI-NEXT: str d14, [sp, #112] // 8-byte Spill2207; CHECK-GI-NEXT: stp d13, d12, [sp, #120] // 16-byte Folded Spill2208; CHECK-GI-NEXT: stp d11, d10, [sp, #136] // 16-byte Folded Spill2209; CHECK-GI-NEXT: stp d9, d8, [sp, #152] // 16-byte Folded Spill2210; CHECK-GI-NEXT: str x30, [sp, #168] // 8-byte Spill2211; CHECK-GI-NEXT: .cfi_def_cfa_offset 1762212; CHECK-GI-NEXT: .cfi_offset w30, -82213; CHECK-GI-NEXT: .cfi_offset b8, -162214; CHECK-GI-NEXT: .cfi_offset b9, -242215; CHECK-GI-NEXT: .cfi_offset b10, -322216; CHECK-GI-NEXT: .cfi_offset b11, -402217; CHECK-GI-NEXT: .cfi_offset b12, -482218; CHECK-GI-NEXT: .cfi_offset b13, -562219; CHECK-GI-NEXT: .cfi_offset b14, -642220; CHECK-GI-NEXT: mov h8, v0.h[1]2221; CHECK-GI-NEXT: mov h9, v0.h[2]2222; CHECK-GI-NEXT: mov h10, v0.h[3]2223; CHECK-GI-NEXT: mov h11, v0.h[4]2224; CHECK-GI-NEXT: mov h12, v0.h[5]2225; CHECK-GI-NEXT: mov h13, v0.h[6]2226; CHECK-GI-NEXT: mov h14, v0.h[7]2227; CHECK-GI-NEXT: fcvt s0, h02228; CHECK-GI-NEXT: bl exp2f2229; CHECK-GI-NEXT: fcvt s1, h82230; CHECK-GI-NEXT: fcvt h0, s02231; CHECK-GI-NEXT: str q0, [sp, #96] // 16-byte Spill2232; CHECK-GI-NEXT: fmov s0, s12233; CHECK-GI-NEXT: bl exp2f2234; CHECK-GI-NEXT: fcvt s1, h92235; CHECK-GI-NEXT: fcvt h0, s02236; CHECK-GI-NEXT: str q0, [sp, #64] // 16-byte Spill2237; CHECK-GI-NEXT: fmov s0, s12238; CHECK-GI-NEXT: bl exp2f2239; CHECK-GI-NEXT: fcvt s1, h102240; CHECK-GI-NEXT: fcvt h0, s02241; CHECK-GI-NEXT: str q0, [sp, #80] // 16-byte Spill2242; CHECK-GI-NEXT: fmov s0, s12243; CHECK-GI-NEXT: bl exp2f2244; CHECK-GI-NEXT: fcvt s1, h112245; CHECK-GI-NEXT: fcvt h0, s02246; CHECK-GI-NEXT: str q0, [sp, #48] // 16-byte Spill2247; CHECK-GI-NEXT: fmov s0, s12248; CHECK-GI-NEXT: bl exp2f2249; CHECK-GI-NEXT: fcvt s1, h122250; CHECK-GI-NEXT: fcvt h0, s02251; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill2252; CHECK-GI-NEXT: fmov s0, s12253; CHECK-GI-NEXT: bl exp2f2254; CHECK-GI-NEXT: fcvt s1, h132255; CHECK-GI-NEXT: fcvt h0, s02256; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill2257; CHECK-GI-NEXT: fmov s0, s12258; CHECK-GI-NEXT: bl exp2f2259; CHECK-GI-NEXT: fcvt s1, h142260; CHECK-GI-NEXT: fcvt h0, s02261; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill2262; CHECK-GI-NEXT: fmov s0, s12263; CHECK-GI-NEXT: bl exp2f2264; CHECK-GI-NEXT: ldp q3, q2, [sp, #64] // 32-byte Folded Reload2265; CHECK-GI-NEXT: fcvt h0, s02266; CHECK-GI-NEXT: ldr q1, [sp, #96] // 16-byte Reload2267; CHECK-GI-NEXT: ldp d9, d8, [sp, #152] // 16-byte Folded Reload2268; CHECK-GI-NEXT: ldp d11, d10, [sp, #136] // 16-byte Folded Reload2269; CHECK-GI-NEXT: ldr x30, [sp, #168] // 8-byte Reload2270; CHECK-GI-NEXT: mov v1.h[1], v3.h[0]2271; CHECK-GI-NEXT: ldr d14, [sp, #112] // 8-byte Reload2272; CHECK-GI-NEXT: ldp d13, d12, [sp, #120] // 16-byte Folded Reload2273; CHECK-GI-NEXT: mov v1.h[2], v2.h[0]2274; CHECK-GI-NEXT: ldp q2, q3, [sp, #32] // 32-byte Folded Reload2275; CHECK-GI-NEXT: mov v1.h[3], v3.h[0]2276; CHECK-GI-NEXT: mov v1.h[4], v2.h[0]2277; CHECK-GI-NEXT: ldp q2, q3, [sp] // 32-byte Folded Reload2278; CHECK-GI-NEXT: mov v1.h[5], v3.h[0]2279; CHECK-GI-NEXT: mov v1.h[6], v2.h[0]2280; CHECK-GI-NEXT: mov v1.h[7], v0.h[0]2281; CHECK-GI-NEXT: mov v0.16b, v1.16b2282; CHECK-GI-NEXT: add sp, sp, #1762283; CHECK-GI-NEXT: ret2284entry:2285 %c = call <8 x half> @llvm.exp2.v8f16(<8 x half> %a)2286 ret <8 x half> %c2287}2288 2289define <16 x half> @exp2_v16f16(<16 x half> %a) {2290; CHECK-SD-LABEL: exp2_v16f16:2291; CHECK-SD: // %bb.0: // %entry2292; CHECK-SD-NEXT: sub sp, sp, #642293; CHECK-SD-NEXT: str x30, [sp, #48] // 8-byte Spill2294; CHECK-SD-NEXT: .cfi_def_cfa_offset 642295; CHECK-SD-NEXT: .cfi_offset w30, -162296; CHECK-SD-NEXT: stp q1, q0, [sp] // 32-byte Folded Spill2297; CHECK-SD-NEXT: mov h1, v0.h[1]2298; CHECK-SD-NEXT: fcvt s0, h12299; CHECK-SD-NEXT: bl exp2f2300; CHECK-SD-NEXT: fcvt h0, s02301; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Spill2302; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload2303; CHECK-SD-NEXT: fcvt s0, h02304; CHECK-SD-NEXT: bl exp2f2305; CHECK-SD-NEXT: fcvt h0, s02306; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload2307; CHECK-SD-NEXT: mov v0.h[1], v1.h[0]2308; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Spill2309; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload2310; CHECK-SD-NEXT: mov h0, v0.h[2]2311; CHECK-SD-NEXT: fcvt s0, h02312; CHECK-SD-NEXT: bl exp2f2313; CHECK-SD-NEXT: fcvt h0, s02314; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload2315; CHECK-SD-NEXT: mov v1.h[2], v0.h[0]2316; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload2317; CHECK-SD-NEXT: mov h0, v0.h[3]2318; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill2319; CHECK-SD-NEXT: fcvt s0, h02320; CHECK-SD-NEXT: bl exp2f2321; CHECK-SD-NEXT: fcvt h0, s02322; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload2323; CHECK-SD-NEXT: mov v1.h[3], v0.h[0]2324; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload2325; CHECK-SD-NEXT: mov h0, v0.h[4]2326; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill2327; CHECK-SD-NEXT: fcvt s0, h02328; CHECK-SD-NEXT: bl exp2f2329; CHECK-SD-NEXT: fcvt h0, s02330; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload2331; CHECK-SD-NEXT: mov v1.h[4], v0.h[0]2332; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload2333; CHECK-SD-NEXT: mov h0, v0.h[5]2334; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill2335; CHECK-SD-NEXT: fcvt s0, h02336; CHECK-SD-NEXT: bl exp2f2337; CHECK-SD-NEXT: fcvt h0, s02338; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload2339; CHECK-SD-NEXT: mov v1.h[5], v0.h[0]2340; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload2341; CHECK-SD-NEXT: mov h0, v0.h[6]2342; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill2343; CHECK-SD-NEXT: fcvt s0, h02344; CHECK-SD-NEXT: bl exp2f2345; CHECK-SD-NEXT: fcvt h0, s02346; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload2347; CHECK-SD-NEXT: mov v1.h[6], v0.h[0]2348; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload2349; CHECK-SD-NEXT: mov h0, v0.h[7]2350; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill2351; CHECK-SD-NEXT: fcvt s0, h02352; CHECK-SD-NEXT: bl exp2f2353; CHECK-SD-NEXT: fcvt h0, s02354; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload2355; CHECK-SD-NEXT: mov v1.h[7], v0.h[0]2356; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload2357; CHECK-SD-NEXT: mov h0, v0.h[1]2358; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill2359; CHECK-SD-NEXT: fcvt s0, h02360; CHECK-SD-NEXT: bl exp2f2361; CHECK-SD-NEXT: fcvt h0, s02362; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill2363; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload2364; CHECK-SD-NEXT: fcvt s0, h02365; CHECK-SD-NEXT: bl exp2f2366; CHECK-SD-NEXT: fcvt h0, s02367; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload2368; CHECK-SD-NEXT: mov v0.h[1], v1.h[0]2369; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill2370; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload2371; CHECK-SD-NEXT: mov h0, v0.h[2]2372; CHECK-SD-NEXT: fcvt s0, h02373; CHECK-SD-NEXT: bl exp2f2374; CHECK-SD-NEXT: fcvt h0, s02375; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload2376; CHECK-SD-NEXT: mov v1.h[2], v0.h[0]2377; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload2378; CHECK-SD-NEXT: mov h0, v0.h[3]2379; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill2380; CHECK-SD-NEXT: fcvt s0, h02381; CHECK-SD-NEXT: bl exp2f2382; CHECK-SD-NEXT: fcvt h0, s02383; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload2384; CHECK-SD-NEXT: mov v1.h[3], v0.h[0]2385; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload2386; CHECK-SD-NEXT: mov h0, v0.h[4]2387; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill2388; CHECK-SD-NEXT: fcvt s0, h02389; CHECK-SD-NEXT: bl exp2f2390; CHECK-SD-NEXT: fcvt h0, s02391; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload2392; CHECK-SD-NEXT: mov v1.h[4], v0.h[0]2393; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload2394; CHECK-SD-NEXT: mov h0, v0.h[5]2395; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill2396; CHECK-SD-NEXT: fcvt s0, h02397; CHECK-SD-NEXT: bl exp2f2398; CHECK-SD-NEXT: fcvt h0, s02399; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload2400; CHECK-SD-NEXT: mov v1.h[5], v0.h[0]2401; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload2402; CHECK-SD-NEXT: mov h0, v0.h[6]2403; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill2404; CHECK-SD-NEXT: fcvt s0, h02405; CHECK-SD-NEXT: bl exp2f2406; CHECK-SD-NEXT: fcvt h0, s02407; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload2408; CHECK-SD-NEXT: mov v1.h[6], v0.h[0]2409; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload2410; CHECK-SD-NEXT: mov h0, v0.h[7]2411; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill2412; CHECK-SD-NEXT: fcvt s0, h02413; CHECK-SD-NEXT: bl exp2f2414; CHECK-SD-NEXT: fmov s1, s02415; CHECK-SD-NEXT: ldr x30, [sp, #48] // 8-byte Reload2416; CHECK-SD-NEXT: fcvt h2, s12417; CHECK-SD-NEXT: ldp q1, q0, [sp, #16] // 32-byte Folded Reload2418; CHECK-SD-NEXT: mov v1.h[7], v2.h[0]2419; CHECK-SD-NEXT: add sp, sp, #642420; CHECK-SD-NEXT: ret2421;2422; CHECK-GI-LABEL: exp2_v16f16:2423; CHECK-GI: // %bb.0: // %entry2424; CHECK-GI-NEXT: sub sp, sp, #3202425; CHECK-GI-NEXT: stp d15, d14, [sp, #240] // 16-byte Folded Spill2426; CHECK-GI-NEXT: stp d13, d12, [sp, #256] // 16-byte Folded Spill2427; CHECK-GI-NEXT: stp d11, d10, [sp, #272] // 16-byte Folded Spill2428; CHECK-GI-NEXT: stp d9, d8, [sp, #288] // 16-byte Folded Spill2429; CHECK-GI-NEXT: stp x29, x30, [sp, #304] // 16-byte Folded Spill2430; CHECK-GI-NEXT: .cfi_def_cfa_offset 3202431; CHECK-GI-NEXT: .cfi_offset w30, -82432; CHECK-GI-NEXT: .cfi_offset w29, -162433; CHECK-GI-NEXT: .cfi_offset b8, -242434; CHECK-GI-NEXT: .cfi_offset b9, -322435; CHECK-GI-NEXT: .cfi_offset b10, -402436; CHECK-GI-NEXT: .cfi_offset b11, -482437; CHECK-GI-NEXT: .cfi_offset b12, -562438; CHECK-GI-NEXT: .cfi_offset b13, -642439; CHECK-GI-NEXT: .cfi_offset b14, -722440; CHECK-GI-NEXT: .cfi_offset b15, -802441; CHECK-GI-NEXT: mov v2.16b, v1.16b2442; CHECK-GI-NEXT: str q1, [sp, #80] // 16-byte Spill2443; CHECK-GI-NEXT: mov h14, v1.h[1]2444; CHECK-GI-NEXT: mov h1, v1.h[2]2445; CHECK-GI-NEXT: mov h15, v0.h[1]2446; CHECK-GI-NEXT: mov h8, v0.h[2]2447; CHECK-GI-NEXT: mov h9, v0.h[3]2448; CHECK-GI-NEXT: mov h10, v0.h[4]2449; CHECK-GI-NEXT: mov h11, v0.h[5]2450; CHECK-GI-NEXT: mov h12, v0.h[6]2451; CHECK-GI-NEXT: mov h13, v0.h[7]2452; CHECK-GI-NEXT: fcvt s0, h02453; CHECK-GI-NEXT: str h1, [sp, #16] // 2-byte Spill2454; CHECK-GI-NEXT: mov h1, v2.h[3]2455; CHECK-GI-NEXT: str h1, [sp, #32] // 2-byte Spill2456; CHECK-GI-NEXT: mov h1, v2.h[4]2457; CHECK-GI-NEXT: str h1, [sp, #48] // 2-byte Spill2458; CHECK-GI-NEXT: mov h1, v2.h[5]2459; CHECK-GI-NEXT: str h1, [sp, #64] // 2-byte Spill2460; CHECK-GI-NEXT: mov h1, v2.h[6]2461; CHECK-GI-NEXT: str h1, [sp, #96] // 2-byte Spill2462; CHECK-GI-NEXT: mov h1, v2.h[7]2463; CHECK-GI-NEXT: str h1, [sp, #160] // 2-byte Spill2464; CHECK-GI-NEXT: bl exp2f2465; CHECK-GI-NEXT: fcvt s1, h152466; CHECK-GI-NEXT: fcvt h0, s02467; CHECK-GI-NEXT: str q0, [sp, #192] // 16-byte Spill2468; CHECK-GI-NEXT: fmov s0, s12469; CHECK-GI-NEXT: bl exp2f2470; CHECK-GI-NEXT: fcvt s1, h82471; CHECK-GI-NEXT: fcvt h0, s02472; CHECK-GI-NEXT: str q0, [sp, #112] // 16-byte Spill2473; CHECK-GI-NEXT: fmov s0, s12474; CHECK-GI-NEXT: bl exp2f2475; CHECK-GI-NEXT: fcvt s1, h92476; CHECK-GI-NEXT: fcvt h0, s02477; CHECK-GI-NEXT: str q0, [sp, #224] // 16-byte Spill2478; CHECK-GI-NEXT: fmov s0, s12479; CHECK-GI-NEXT: bl exp2f2480; CHECK-GI-NEXT: fcvt s1, h102481; CHECK-GI-NEXT: fcvt h0, s02482; CHECK-GI-NEXT: str q0, [sp, #208] // 16-byte Spill2483; CHECK-GI-NEXT: fmov s0, s12484; CHECK-GI-NEXT: bl exp2f2485; CHECK-GI-NEXT: fcvt s1, h112486; CHECK-GI-NEXT: fcvt h0, s02487; CHECK-GI-NEXT: str q0, [sp, #176] // 16-byte Spill2488; CHECK-GI-NEXT: fmov s0, s12489; CHECK-GI-NEXT: bl exp2f2490; CHECK-GI-NEXT: fcvt s1, h122491; CHECK-GI-NEXT: fcvt h0, s02492; CHECK-GI-NEXT: str q0, [sp, #144] // 16-byte Spill2493; CHECK-GI-NEXT: fmov s0, s12494; CHECK-GI-NEXT: bl exp2f2495; CHECK-GI-NEXT: fcvt s1, h132496; CHECK-GI-NEXT: fcvt h0, s02497; CHECK-GI-NEXT: str q0, [sp, #128] // 16-byte Spill2498; CHECK-GI-NEXT: fmov s0, s12499; CHECK-GI-NEXT: bl exp2f2500; CHECK-GI-NEXT: ldr q1, [sp, #80] // 16-byte Reload2501; CHECK-GI-NEXT: fcvt h0, s02502; CHECK-GI-NEXT: fcvt s1, h12503; CHECK-GI-NEXT: str q0, [sp, #80] // 16-byte Spill2504; CHECK-GI-NEXT: fmov s0, s12505; CHECK-GI-NEXT: bl exp2f2506; CHECK-GI-NEXT: fcvt s1, h142507; CHECK-GI-NEXT: fcvt h0, s02508; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill2509; CHECK-GI-NEXT: fmov s0, s12510; CHECK-GI-NEXT: bl exp2f2511; CHECK-GI-NEXT: ldr h1, [sp, #16] // 2-byte Reload2512; CHECK-GI-NEXT: fcvt h0, s02513; CHECK-GI-NEXT: fcvt s1, h12514; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill2515; CHECK-GI-NEXT: fmov s0, s12516; CHECK-GI-NEXT: bl exp2f2517; CHECK-GI-NEXT: ldr h1, [sp, #32] // 2-byte Reload2518; CHECK-GI-NEXT: fcvt h0, s02519; CHECK-GI-NEXT: fcvt s1, h12520; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill2521; CHECK-GI-NEXT: fmov s0, s12522; CHECK-GI-NEXT: bl exp2f2523; CHECK-GI-NEXT: ldr h1, [sp, #48] // 2-byte Reload2524; CHECK-GI-NEXT: fcvt h0, s02525; CHECK-GI-NEXT: fcvt s1, h12526; CHECK-GI-NEXT: str q0, [sp, #48] // 16-byte Spill2527; CHECK-GI-NEXT: fmov s0, s12528; CHECK-GI-NEXT: bl exp2f2529; CHECK-GI-NEXT: ldr h1, [sp, #64] // 2-byte Reload2530; CHECK-GI-NEXT: fcvt h0, s02531; CHECK-GI-NEXT: fcvt s1, h12532; CHECK-GI-NEXT: str q0, [sp, #64] // 16-byte Spill2533; CHECK-GI-NEXT: fmov s0, s12534; CHECK-GI-NEXT: bl exp2f2535; CHECK-GI-NEXT: ldr h1, [sp, #96] // 2-byte Reload2536; CHECK-GI-NEXT: fcvt h0, s02537; CHECK-GI-NEXT: fcvt s1, h12538; CHECK-GI-NEXT: str q0, [sp, #96] // 16-byte Spill2539; CHECK-GI-NEXT: fmov s0, s12540; CHECK-GI-NEXT: bl exp2f2541; CHECK-GI-NEXT: ldr h1, [sp, #160] // 2-byte Reload2542; CHECK-GI-NEXT: fcvt h0, s02543; CHECK-GI-NEXT: fcvt s1, h12544; CHECK-GI-NEXT: str q0, [sp, #160] // 16-byte Spill2545; CHECK-GI-NEXT: fmov s0, s12546; CHECK-GI-NEXT: bl exp2f2547; CHECK-GI-NEXT: ldr q3, [sp, #192] // 16-byte Reload2548; CHECK-GI-NEXT: ldr q2, [sp, #112] // 16-byte Reload2549; CHECK-GI-NEXT: ldp x29, x30, [sp, #304] // 16-byte Folded Reload2550; CHECK-GI-NEXT: mov v3.h[1], v2.h[0]2551; CHECK-GI-NEXT: ldp q1, q2, [sp] // 32-byte Folded Reload2552; CHECK-GI-NEXT: ldp d9, d8, [sp, #288] // 16-byte Folded Reload2553; CHECK-GI-NEXT: ldp d11, d10, [sp, #272] // 16-byte Folded Reload2554; CHECK-GI-NEXT: mov v1.h[1], v2.h[0]2555; CHECK-GI-NEXT: ldr q2, [sp, #224] // 16-byte Reload2556; CHECK-GI-NEXT: ldp d13, d12, [sp, #256] // 16-byte Folded Reload2557; CHECK-GI-NEXT: mov v3.h[2], v2.h[0]2558; CHECK-GI-NEXT: ldr q2, [sp, #32] // 16-byte Reload2559; CHECK-GI-NEXT: ldp d15, d14, [sp, #240] // 16-byte Folded Reload2560; CHECK-GI-NEXT: mov v1.h[2], v2.h[0]2561; CHECK-GI-NEXT: ldr q2, [sp, #208] // 16-byte Reload2562; CHECK-GI-NEXT: mov v3.h[3], v2.h[0]2563; CHECK-GI-NEXT: ldr q2, [sp, #48] // 16-byte Reload2564; CHECK-GI-NEXT: mov v1.h[3], v2.h[0]2565; CHECK-GI-NEXT: ldr q2, [sp, #176] // 16-byte Reload2566; CHECK-GI-NEXT: mov v3.h[4], v2.h[0]2567; CHECK-GI-NEXT: ldr q2, [sp, #64] // 16-byte Reload2568; CHECK-GI-NEXT: mov v1.h[4], v2.h[0]2569; CHECK-GI-NEXT: ldr q2, [sp, #144] // 16-byte Reload2570; CHECK-GI-NEXT: mov v3.h[5], v2.h[0]2571; CHECK-GI-NEXT: ldr q2, [sp, #96] // 16-byte Reload2572; CHECK-GI-NEXT: mov v1.h[5], v2.h[0]2573; CHECK-GI-NEXT: fcvt h2, s02574; CHECK-GI-NEXT: ldr q0, [sp, #128] // 16-byte Reload2575; CHECK-GI-NEXT: mov v3.h[6], v0.h[0]2576; CHECK-GI-NEXT: ldr q0, [sp, #160] // 16-byte Reload2577; CHECK-GI-NEXT: mov v1.h[6], v0.h[0]2578; CHECK-GI-NEXT: ldr q0, [sp, #80] // 16-byte Reload2579; CHECK-GI-NEXT: mov v3.h[7], v0.h[0]2580; CHECK-GI-NEXT: mov v1.h[7], v2.h[0]2581; CHECK-GI-NEXT: mov v0.16b, v3.16b2582; CHECK-GI-NEXT: add sp, sp, #3202583; CHECK-GI-NEXT: ret2584entry:2585 %c = call <16 x half> @llvm.exp2.v16f16(<16 x half> %a)2586 ret <16 x half> %c2587}2588 2589define <2 x fp128> @exp2_v2fp128(<2 x fp128> %a) {2590; CHECK-LABEL: exp2_v2fp128:2591; CHECK: // %bb.0: // %entry2592; CHECK-NEXT: sub sp, sp, #482593; CHECK-NEXT: str x30, [sp, #32] // 8-byte Spill2594; CHECK-NEXT: .cfi_def_cfa_offset 482595; CHECK-NEXT: .cfi_offset w30, -162596; CHECK-NEXT: str q1, [sp, #16] // 16-byte Spill2597; CHECK-NEXT: bl exp2l2598; CHECK-NEXT: str q0, [sp] // 16-byte Spill2599; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload2600; CHECK-NEXT: bl exp2l2601; CHECK-NEXT: mov v1.16b, v0.16b2602; CHECK-NEXT: ldr q0, [sp] // 16-byte Reload2603; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Reload2604; CHECK-NEXT: add sp, sp, #482605; CHECK-NEXT: ret2606entry:2607 %c = call <2 x fp128> @llvm.exp2.v2fp128(<2 x fp128> %a)2608 ret <2 x fp128> %c2609}2610 2611define double @log_f64(double %a) {2612; CHECK-LABEL: log_f64:2613; CHECK: // %bb.0: // %entry2614; CHECK-NEXT: b log2615entry:2616 %c = call double @llvm.log.f64(double %a)2617 ret double %c2618}2619 2620define float @log_f32(float %a) {2621; CHECK-LABEL: log_f32:2622; CHECK: // %bb.0: // %entry2623; CHECK-NEXT: b logf2624entry:2625 %c = call float @llvm.log.f32(float %a)2626 ret float %c2627}2628 2629define half @log_f16(half %a) {2630; CHECK-LABEL: log_f16:2631; CHECK: // %bb.0: // %entry2632; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2633; CHECK-NEXT: .cfi_def_cfa_offset 162634; CHECK-NEXT: .cfi_offset w30, -162635; CHECK-NEXT: fcvt s0, h02636; CHECK-NEXT: bl logf2637; CHECK-NEXT: fcvt h0, s02638; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2639; CHECK-NEXT: ret2640entry:2641 %c = call half @llvm.log.f16(half %a)2642 ret half %c2643}2644 2645define fp128 @log_fp128(fp128 %a) {2646; CHECK-LABEL: log_fp128:2647; CHECK: // %bb.0: // %entry2648; CHECK-NEXT: b logl2649entry:2650 %c = call fp128 @llvm.log.fp128(fp128 %a)2651 ret fp128 %c2652}2653 2654define <1 x double> @log_v1f64(<1 x double> %a) {2655; CHECK-LABEL: log_v1f64:2656; CHECK: // %bb.0: // %entry2657; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill2658; CHECK-NEXT: .cfi_def_cfa_offset 162659; CHECK-NEXT: .cfi_offset w30, -162660; CHECK-NEXT: bl log2661; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload2662; CHECK-NEXT: ret2663entry:2664 %c = call <1 x double> @llvm.log.v1f64(<1 x double> %a)2665 ret <1 x double> %c2666}2667 2668define <2 x double> @log_v2f64(<2 x double> %a) {2669; CHECK-SD-LABEL: log_v2f64:2670; CHECK-SD: // %bb.0: // %entry2671; CHECK-SD-NEXT: sub sp, sp, #482672; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Spill2673; CHECK-SD-NEXT: .cfi_def_cfa_offset 482674; CHECK-SD-NEXT: .cfi_offset w30, -162675; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill2676; CHECK-SD-NEXT: mov d0, v0.d[1]2677; CHECK-SD-NEXT: bl log2678; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q02679; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill2680; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload2681; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q02682; CHECK-SD-NEXT: bl log2683; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload2684; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q02685; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload2686; CHECK-SD-NEXT: mov v0.d[1], v1.d[0]2687; CHECK-SD-NEXT: add sp, sp, #482688; CHECK-SD-NEXT: ret2689;2690; CHECK-GI-LABEL: log_v2f64:2691; CHECK-GI: // %bb.0: // %entry2692; CHECK-GI-NEXT: sub sp, sp, #322693; CHECK-GI-NEXT: str d8, [sp, #16] // 8-byte Spill2694; CHECK-GI-NEXT: str x30, [sp, #24] // 8-byte Spill2695; CHECK-GI-NEXT: .cfi_def_cfa_offset 322696; CHECK-GI-NEXT: .cfi_offset w30, -82697; CHECK-GI-NEXT: .cfi_offset b8, -162698; CHECK-GI-NEXT: mov d8, v0.d[1]2699; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q02700; CHECK-GI-NEXT: bl log2701; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q02702; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill2703; CHECK-GI-NEXT: fmov d0, d82704; CHECK-GI-NEXT: bl log2705; CHECK-GI-NEXT: ldr q1, [sp] // 16-byte Reload2706; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q02707; CHECK-GI-NEXT: ldr x30, [sp, #24] // 8-byte Reload2708; CHECK-GI-NEXT: ldr d8, [sp, #16] // 8-byte Reload2709; CHECK-GI-NEXT: mov v1.d[1], v0.d[0]2710; CHECK-GI-NEXT: mov v0.16b, v1.16b2711; CHECK-GI-NEXT: add sp, sp, #322712; CHECK-GI-NEXT: ret2713entry:2714 %c = call <2 x double> @llvm.log.v2f64(<2 x double> %a)2715 ret <2 x double> %c2716}2717 2718define <3 x double> @log_v3f64(<3 x double> %a) {2719; CHECK-SD-LABEL: log_v3f64:2720; CHECK-SD: // %bb.0: // %entry2721; CHECK-SD-NEXT: str d10, [sp, #-32]! // 8-byte Folded Spill2722; CHECK-SD-NEXT: stp d9, d8, [sp, #8] // 16-byte Folded Spill2723; CHECK-SD-NEXT: str x30, [sp, #24] // 8-byte Spill2724; CHECK-SD-NEXT: .cfi_def_cfa_offset 322725; CHECK-SD-NEXT: .cfi_offset w30, -82726; CHECK-SD-NEXT: .cfi_offset b8, -162727; CHECK-SD-NEXT: .cfi_offset b9, -242728; CHECK-SD-NEXT: .cfi_offset b10, -322729; CHECK-SD-NEXT: fmov d8, d22730; CHECK-SD-NEXT: fmov d9, d12731; CHECK-SD-NEXT: bl log2732; CHECK-SD-NEXT: fmov d10, d02733; CHECK-SD-NEXT: fmov d0, d92734; CHECK-SD-NEXT: bl log2735; CHECK-SD-NEXT: fmov d9, d02736; CHECK-SD-NEXT: fmov d0, d82737; CHECK-SD-NEXT: bl log2738; CHECK-SD-NEXT: fmov d1, d92739; CHECK-SD-NEXT: ldp d9, d8, [sp, #8] // 16-byte Folded Reload2740; CHECK-SD-NEXT: ldr x30, [sp, #24] // 8-byte Reload2741; CHECK-SD-NEXT: fmov d2, d02742; CHECK-SD-NEXT: fmov d0, d102743; CHECK-SD-NEXT: ldr d10, [sp], #32 // 8-byte Folded Reload2744; CHECK-SD-NEXT: ret2745;2746; CHECK-GI-LABEL: log_v3f64:2747; CHECK-GI: // %bb.0: // %entry2748; CHECK-GI-NEXT: str d10, [sp, #-32]! // 8-byte Folded Spill2749; CHECK-GI-NEXT: stp d9, d8, [sp, #8] // 16-byte Folded Spill2750; CHECK-GI-NEXT: str x30, [sp, #24] // 8-byte Spill2751; CHECK-GI-NEXT: .cfi_def_cfa_offset 322752; CHECK-GI-NEXT: .cfi_offset w30, -82753; CHECK-GI-NEXT: .cfi_offset b8, -162754; CHECK-GI-NEXT: .cfi_offset b9, -242755; CHECK-GI-NEXT: .cfi_offset b10, -322756; CHECK-GI-NEXT: fmov d8, d12757; CHECK-GI-NEXT: fmov d9, d22758; CHECK-GI-NEXT: bl log2759; CHECK-GI-NEXT: fmov d10, d02760; CHECK-GI-NEXT: fmov d0, d82761; CHECK-GI-NEXT: bl log2762; CHECK-GI-NEXT: fmov d8, d02763; CHECK-GI-NEXT: fmov d0, d92764; CHECK-GI-NEXT: bl log2765; CHECK-GI-NEXT: fmov d1, d82766; CHECK-GI-NEXT: ldp d9, d8, [sp, #8] // 16-byte Folded Reload2767; CHECK-GI-NEXT: ldr x30, [sp, #24] // 8-byte Reload2768; CHECK-GI-NEXT: fmov d2, d02769; CHECK-GI-NEXT: fmov d0, d102770; CHECK-GI-NEXT: ldr d10, [sp], #32 // 8-byte Folded Reload2771; CHECK-GI-NEXT: ret2772entry:2773 %c = call <3 x double> @llvm.log.v3f64(<3 x double> %a)2774 ret <3 x double> %c2775}2776 2777define <4 x double> @log_v4f64(<4 x double> %a) {2778; CHECK-SD-LABEL: log_v4f64:2779; CHECK-SD: // %bb.0: // %entry2780; CHECK-SD-NEXT: sub sp, sp, #642781; CHECK-SD-NEXT: str x30, [sp, #48] // 8-byte Spill2782; CHECK-SD-NEXT: .cfi_def_cfa_offset 642783; CHECK-SD-NEXT: .cfi_offset w30, -162784; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill2785; CHECK-SD-NEXT: mov d0, v0.d[1]2786; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill2787; CHECK-SD-NEXT: bl log2788; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q02789; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill2790; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload2791; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q02792; CHECK-SD-NEXT: bl log2793; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload2794; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q02795; CHECK-SD-NEXT: mov v0.d[1], v1.d[0]2796; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill2797; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Reload2798; CHECK-SD-NEXT: mov d0, v0.d[1]2799; CHECK-SD-NEXT: bl log2800; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q02801; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill2802; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Reload2803; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q02804; CHECK-SD-NEXT: bl log2805; CHECK-SD-NEXT: fmov d1, d02806; CHECK-SD-NEXT: ldp q2, q0, [sp] // 32-byte Folded Reload2807; CHECK-SD-NEXT: ldr x30, [sp, #48] // 8-byte Reload2808; CHECK-SD-NEXT: mov v1.d[1], v2.d[0]2809; CHECK-SD-NEXT: add sp, sp, #642810; CHECK-SD-NEXT: ret2811;2812; CHECK-GI-LABEL: log_v4f64:2813; CHECK-GI: // %bb.0: // %entry2814; CHECK-GI-NEXT: sub sp, sp, #802815; CHECK-GI-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill2816; CHECK-GI-NEXT: str x30, [sp, #64] // 8-byte Spill2817; CHECK-GI-NEXT: .cfi_def_cfa_offset 802818; CHECK-GI-NEXT: .cfi_offset w30, -162819; CHECK-GI-NEXT: .cfi_offset b8, -242820; CHECK-GI-NEXT: .cfi_offset b9, -322821; CHECK-GI-NEXT: str q1, [sp] // 16-byte Spill2822; CHECK-GI-NEXT: mov d8, v0.d[1]2823; CHECK-GI-NEXT: mov d9, v1.d[1]2824; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q02825; CHECK-GI-NEXT: bl log2826; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q02827; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill2828; CHECK-GI-NEXT: fmov d0, d82829; CHECK-GI-NEXT: bl log2830; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q02831; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill2832; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Reload2833; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q02834; CHECK-GI-NEXT: bl log2835; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q02836; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill2837; CHECK-GI-NEXT: fmov d0, d92838; CHECK-GI-NEXT: bl log2839; CHECK-GI-NEXT: ldp q1, q2, [sp, #16] // 32-byte Folded Reload2840; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q02841; CHECK-GI-NEXT: ldr x30, [sp, #64] // 8-byte Reload2842; CHECK-GI-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload2843; CHECK-GI-NEXT: mov v2.d[1], v1.d[0]2844; CHECK-GI-NEXT: ldr q1, [sp] // 16-byte Reload2845; CHECK-GI-NEXT: mov v1.d[1], v0.d[0]2846; CHECK-GI-NEXT: mov v0.16b, v2.16b2847; CHECK-GI-NEXT: add sp, sp, #802848; CHECK-GI-NEXT: ret2849entry:2850 %c = call <4 x double> @llvm.log.v4f64(<4 x double> %a)2851 ret <4 x double> %c2852}2853 2854define <2 x float> @log_v2f32(<2 x float> %a) {2855; CHECK-SD-LABEL: log_v2f32:2856; CHECK-SD: // %bb.0: // %entry2857; CHECK-SD-NEXT: sub sp, sp, #482858; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Spill2859; CHECK-SD-NEXT: .cfi_def_cfa_offset 482860; CHECK-SD-NEXT: .cfi_offset w30, -162861; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q02862; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill2863; CHECK-SD-NEXT: mov s0, v0.s[1]2864; CHECK-SD-NEXT: bl logf2865; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q02866; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill2867; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload2868; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q02869; CHECK-SD-NEXT: bl logf2870; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload2871; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q02872; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload2873; CHECK-SD-NEXT: mov v0.s[1], v1.s[0]2874; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q02875; CHECK-SD-NEXT: add sp, sp, #482876; CHECK-SD-NEXT: ret2877;2878; CHECK-GI-LABEL: log_v2f32:2879; CHECK-GI: // %bb.0: // %entry2880; CHECK-GI-NEXT: sub sp, sp, #322881; CHECK-GI-NEXT: str d8, [sp, #16] // 8-byte Spill2882; CHECK-GI-NEXT: str x30, [sp, #24] // 8-byte Spill2883; CHECK-GI-NEXT: .cfi_def_cfa_offset 322884; CHECK-GI-NEXT: .cfi_offset w30, -82885; CHECK-GI-NEXT: .cfi_offset b8, -162886; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q02887; CHECK-GI-NEXT: mov s8, v0.s[1]2888; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q02889; CHECK-GI-NEXT: bl logf2890; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q02891; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill2892; CHECK-GI-NEXT: fmov s0, s82893; CHECK-GI-NEXT: bl logf2894; CHECK-GI-NEXT: ldr q1, [sp] // 16-byte Reload2895; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q02896; CHECK-GI-NEXT: ldr x30, [sp, #24] // 8-byte Reload2897; CHECK-GI-NEXT: ldr d8, [sp, #16] // 8-byte Reload2898; CHECK-GI-NEXT: mov v1.s[1], v0.s[0]2899; CHECK-GI-NEXT: fmov d0, d12900; CHECK-GI-NEXT: add sp, sp, #322901; CHECK-GI-NEXT: ret2902entry:2903 %c = call <2 x float> @llvm.log.v2f32(<2 x float> %a)2904 ret <2 x float> %c2905}2906 2907define <3 x float> @log_v3f32(<3 x float> %a) {2908; CHECK-SD-LABEL: log_v3f32:2909; CHECK-SD: // %bb.0: // %entry2910; CHECK-SD-NEXT: sub sp, sp, #482911; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Spill2912; CHECK-SD-NEXT: .cfi_def_cfa_offset 482913; CHECK-SD-NEXT: .cfi_offset w30, -162914; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill2915; CHECK-SD-NEXT: mov s0, v0.s[1]2916; CHECK-SD-NEXT: bl logf2917; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q02918; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill2919; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload2920; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q02921; CHECK-SD-NEXT: bl logf2922; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload2923; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q02924; CHECK-SD-NEXT: mov v0.s[1], v1.s[0]2925; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill2926; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload2927; CHECK-SD-NEXT: mov s0, v0.s[2]2928; CHECK-SD-NEXT: bl logf2929; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload2930; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q02931; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload2932; CHECK-SD-NEXT: mov v1.s[2], v0.s[0]2933; CHECK-SD-NEXT: mov v0.16b, v1.16b2934; CHECK-SD-NEXT: add sp, sp, #482935; CHECK-SD-NEXT: ret2936;2937; CHECK-GI-LABEL: log_v3f32:2938; CHECK-GI: // %bb.0: // %entry2939; CHECK-GI-NEXT: sub sp, sp, #642940; CHECK-GI-NEXT: stp d9, d8, [sp, #32] // 16-byte Folded Spill2941; CHECK-GI-NEXT: str x30, [sp, #48] // 8-byte Spill2942; CHECK-GI-NEXT: .cfi_def_cfa_offset 642943; CHECK-GI-NEXT: .cfi_offset w30, -162944; CHECK-GI-NEXT: .cfi_offset b8, -242945; CHECK-GI-NEXT: .cfi_offset b9, -322946; CHECK-GI-NEXT: mov s8, v0.s[1]2947; CHECK-GI-NEXT: mov s9, v0.s[2]2948; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q02949; CHECK-GI-NEXT: bl logf2950; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q02951; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill2952; CHECK-GI-NEXT: fmov s0, s82953; CHECK-GI-NEXT: bl logf2954; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q02955; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill2956; CHECK-GI-NEXT: fmov s0, s92957; CHECK-GI-NEXT: bl logf2958; CHECK-GI-NEXT: ldp q2, q1, [sp] // 32-byte Folded Reload2959; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q02960; CHECK-GI-NEXT: ldr x30, [sp, #48] // 8-byte Reload2961; CHECK-GI-NEXT: ldp d9, d8, [sp, #32] // 16-byte Folded Reload2962; CHECK-GI-NEXT: mov v1.s[1], v2.s[0]2963; CHECK-GI-NEXT: mov v1.s[2], v0.s[0]2964; CHECK-GI-NEXT: mov v0.16b, v1.16b2965; CHECK-GI-NEXT: add sp, sp, #642966; CHECK-GI-NEXT: ret2967entry:2968 %c = call <3 x float> @llvm.log.v3f32(<3 x float> %a)2969 ret <3 x float> %c2970}2971 2972define <4 x float> @log_v4f32(<4 x float> %a) {2973; CHECK-SD-LABEL: log_v4f32:2974; CHECK-SD: // %bb.0: // %entry2975; CHECK-SD-NEXT: sub sp, sp, #482976; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Spill2977; CHECK-SD-NEXT: .cfi_def_cfa_offset 482978; CHECK-SD-NEXT: .cfi_offset w30, -162979; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill2980; CHECK-SD-NEXT: mov s0, v0.s[1]2981; CHECK-SD-NEXT: bl logf2982; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q02983; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill2984; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload2985; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q02986; CHECK-SD-NEXT: bl logf2987; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload2988; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q02989; CHECK-SD-NEXT: mov v0.s[1], v1.s[0]2990; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill2991; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload2992; CHECK-SD-NEXT: mov s0, v0.s[2]2993; CHECK-SD-NEXT: bl logf2994; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload2995; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q02996; CHECK-SD-NEXT: mov v1.s[2], v0.s[0]2997; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload2998; CHECK-SD-NEXT: mov s0, v0.s[3]2999; CHECK-SD-NEXT: str q1, [sp] // 16-byte Spill3000; CHECK-SD-NEXT: bl logf3001; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload3002; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q03003; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload3004; CHECK-SD-NEXT: mov v1.s[3], v0.s[0]3005; CHECK-SD-NEXT: mov v0.16b, v1.16b3006; CHECK-SD-NEXT: add sp, sp, #483007; CHECK-SD-NEXT: ret3008;3009; CHECK-GI-LABEL: log_v4f32:3010; CHECK-GI: // %bb.0: // %entry3011; CHECK-GI-NEXT: sub sp, sp, #803012; CHECK-GI-NEXT: str d10, [sp, #48] // 8-byte Spill3013; CHECK-GI-NEXT: stp d9, d8, [sp, #56] // 16-byte Folded Spill3014; CHECK-GI-NEXT: str x30, [sp, #72] // 8-byte Spill3015; CHECK-GI-NEXT: .cfi_def_cfa_offset 803016; CHECK-GI-NEXT: .cfi_offset w30, -83017; CHECK-GI-NEXT: .cfi_offset b8, -163018; CHECK-GI-NEXT: .cfi_offset b9, -243019; CHECK-GI-NEXT: .cfi_offset b10, -323020; CHECK-GI-NEXT: mov s8, v0.s[1]3021; CHECK-GI-NEXT: mov s9, v0.s[2]3022; CHECK-GI-NEXT: mov s10, v0.s[3]3023; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q03024; CHECK-GI-NEXT: bl logf3025; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q03026; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill3027; CHECK-GI-NEXT: fmov s0, s83028; CHECK-GI-NEXT: bl logf3029; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q03030; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill3031; CHECK-GI-NEXT: fmov s0, s93032; CHECK-GI-NEXT: bl logf3033; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q03034; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill3035; CHECK-GI-NEXT: fmov s0, s103036; CHECK-GI-NEXT: bl logf3037; CHECK-GI-NEXT: ldp q2, q1, [sp, #16] // 32-byte Folded Reload3038; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q03039; CHECK-GI-NEXT: ldr x30, [sp, #72] // 8-byte Reload3040; CHECK-GI-NEXT: ldp d9, d8, [sp, #56] // 16-byte Folded Reload3041; CHECK-GI-NEXT: ldr d10, [sp, #48] // 8-byte Reload3042; CHECK-GI-NEXT: mov v1.s[1], v2.s[0]3043; CHECK-GI-NEXT: ldr q2, [sp] // 16-byte Reload3044; CHECK-GI-NEXT: mov v1.s[2], v2.s[0]3045; CHECK-GI-NEXT: mov v1.s[3], v0.s[0]3046; CHECK-GI-NEXT: mov v0.16b, v1.16b3047; CHECK-GI-NEXT: add sp, sp, #803048; CHECK-GI-NEXT: ret3049entry:3050 %c = call <4 x float> @llvm.log.v4f32(<4 x float> %a)3051 ret <4 x float> %c3052}3053 3054define <8 x float> @log_v8f32(<8 x float> %a) {3055; CHECK-SD-LABEL: log_v8f32:3056; CHECK-SD: // %bb.0: // %entry3057; CHECK-SD-NEXT: sub sp, sp, #643058; CHECK-SD-NEXT: str x30, [sp, #48] // 8-byte Spill3059; CHECK-SD-NEXT: .cfi_def_cfa_offset 643060; CHECK-SD-NEXT: .cfi_offset w30, -163061; CHECK-SD-NEXT: stp q0, q1, [sp] // 32-byte Folded Spill3062; CHECK-SD-NEXT: mov s0, v0.s[1]3063; CHECK-SD-NEXT: bl logf3064; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q03065; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Spill3066; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload3067; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q03068; CHECK-SD-NEXT: bl logf3069; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload3070; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q03071; CHECK-SD-NEXT: mov v0.s[1], v1.s[0]3072; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Spill3073; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload3074; CHECK-SD-NEXT: mov s0, v0.s[2]3075; CHECK-SD-NEXT: bl logf3076; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload3077; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q03078; CHECK-SD-NEXT: mov v1.s[2], v0.s[0]3079; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload3080; CHECK-SD-NEXT: mov s0, v0.s[3]3081; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill3082; CHECK-SD-NEXT: bl logf3083; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload3084; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q03085; CHECK-SD-NEXT: mov v1.s[3], v0.s[0]3086; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload3087; CHECK-SD-NEXT: mov s0, v0.s[1]3088; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill3089; CHECK-SD-NEXT: bl logf3090; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q03091; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill3092; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload3093; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q03094; CHECK-SD-NEXT: bl logf3095; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload3096; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q03097; CHECK-SD-NEXT: mov v0.s[1], v1.s[0]3098; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill3099; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload3100; CHECK-SD-NEXT: mov s0, v0.s[2]3101; CHECK-SD-NEXT: bl logf3102; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload3103; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q03104; CHECK-SD-NEXT: mov v1.s[2], v0.s[0]3105; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload3106; CHECK-SD-NEXT: mov s0, v0.s[3]3107; CHECK-SD-NEXT: str q1, [sp] // 16-byte Spill3108; CHECK-SD-NEXT: bl logf3109; CHECK-SD-NEXT: fmov s2, s03110; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload3111; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Reload3112; CHECK-SD-NEXT: ldr x30, [sp, #48] // 8-byte Reload3113; CHECK-SD-NEXT: mov v1.s[3], v2.s[0]3114; CHECK-SD-NEXT: add sp, sp, #643115; CHECK-SD-NEXT: ret3116;3117; CHECK-GI-LABEL: log_v8f32:3118; CHECK-GI: // %bb.0: // %entry3119; CHECK-GI-NEXT: sub sp, sp, #1763120; CHECK-GI-NEXT: stp d13, d12, [sp, #112] // 16-byte Folded Spill3121; CHECK-GI-NEXT: stp d11, d10, [sp, #128] // 16-byte Folded Spill3122; CHECK-GI-NEXT: stp d9, d8, [sp, #144] // 16-byte Folded Spill3123; CHECK-GI-NEXT: str x30, [sp, #160] // 8-byte Spill3124; CHECK-GI-NEXT: .cfi_def_cfa_offset 1763125; CHECK-GI-NEXT: .cfi_offset w30, -163126; CHECK-GI-NEXT: .cfi_offset b8, -243127; CHECK-GI-NEXT: .cfi_offset b9, -323128; CHECK-GI-NEXT: .cfi_offset b10, -403129; CHECK-GI-NEXT: .cfi_offset b11, -483130; CHECK-GI-NEXT: .cfi_offset b12, -563131; CHECK-GI-NEXT: .cfi_offset b13, -643132; CHECK-GI-NEXT: str q1, [sp, #32] // 16-byte Spill3133; CHECK-GI-NEXT: mov s8, v0.s[1]3134; CHECK-GI-NEXT: mov s9, v0.s[2]3135; CHECK-GI-NEXT: mov s10, v0.s[3]3136; CHECK-GI-NEXT: mov s11, v1.s[1]3137; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q03138; CHECK-GI-NEXT: mov s12, v1.s[2]3139; CHECK-GI-NEXT: mov s13, v1.s[3]3140; CHECK-GI-NEXT: bl logf3141; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q03142; CHECK-GI-NEXT: str q0, [sp, #64] // 16-byte Spill3143; CHECK-GI-NEXT: fmov s0, s83144; CHECK-GI-NEXT: bl logf3145; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q03146; CHECK-GI-NEXT: str q0, [sp, #48] // 16-byte Spill3147; CHECK-GI-NEXT: fmov s0, s93148; CHECK-GI-NEXT: bl logf3149; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q03150; CHECK-GI-NEXT: str q0, [sp, #96] // 16-byte Spill3151; CHECK-GI-NEXT: fmov s0, s103152; CHECK-GI-NEXT: bl logf3153; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q03154; CHECK-GI-NEXT: str q0, [sp, #80] // 16-byte Spill3155; CHECK-GI-NEXT: ldr q0, [sp, #32] // 16-byte Reload3156; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q03157; CHECK-GI-NEXT: bl logf3158; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q03159; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill3160; CHECK-GI-NEXT: fmov s0, s113161; CHECK-GI-NEXT: bl logf3162; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q03163; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill3164; CHECK-GI-NEXT: fmov s0, s123165; CHECK-GI-NEXT: bl logf3166; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q03167; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill3168; CHECK-GI-NEXT: fmov s0, s133169; CHECK-GI-NEXT: bl logf3170; CHECK-GI-NEXT: ldp q2, q1, [sp, #48] // 32-byte Folded Reload3171; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q03172; CHECK-GI-NEXT: ldr x30, [sp, #160] // 8-byte Reload3173; CHECK-GI-NEXT: ldp d9, d8, [sp, #144] // 16-byte Folded Reload3174; CHECK-GI-NEXT: ldp d11, d10, [sp, #128] // 16-byte Folded Reload3175; CHECK-GI-NEXT: mov v1.s[1], v2.s[0]3176; CHECK-GI-NEXT: ldp q2, q3, [sp, #16] // 32-byte Folded Reload3177; CHECK-GI-NEXT: ldp d13, d12, [sp, #112] // 16-byte Folded Reload3178; CHECK-GI-NEXT: mov v3.s[1], v2.s[0]3179; CHECK-GI-NEXT: ldr q2, [sp, #96] // 16-byte Reload3180; CHECK-GI-NEXT: mov v1.s[2], v2.s[0]3181; CHECK-GI-NEXT: ldr q2, [sp] // 16-byte Reload3182; CHECK-GI-NEXT: mov v3.s[2], v2.s[0]3183; CHECK-GI-NEXT: ldr q2, [sp, #80] // 16-byte Reload3184; CHECK-GI-NEXT: mov v1.s[3], v2.s[0]3185; CHECK-GI-NEXT: mov v3.s[3], v0.s[0]3186; CHECK-GI-NEXT: mov v2.16b, v1.16b3187; CHECK-GI-NEXT: mov v1.16b, v3.16b3188; CHECK-GI-NEXT: mov v0.16b, v2.16b3189; CHECK-GI-NEXT: add sp, sp, #1763190; CHECK-GI-NEXT: ret3191entry:3192 %c = call <8 x float> @llvm.log.v8f32(<8 x float> %a)3193 ret <8 x float> %c3194}3195 3196define <7 x half> @log_v7f16(<7 x half> %a) {3197; CHECK-SD-LABEL: log_v7f16:3198; CHECK-SD: // %bb.0: // %entry3199; CHECK-SD-NEXT: sub sp, sp, #483200; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Spill3201; CHECK-SD-NEXT: .cfi_def_cfa_offset 483202; CHECK-SD-NEXT: .cfi_offset w30, -163203; CHECK-SD-NEXT: mov h1, v0.h[1]3204; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill3205; CHECK-SD-NEXT: fcvt s0, h13206; CHECK-SD-NEXT: bl logf3207; CHECK-SD-NEXT: fcvt h0, s03208; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill3209; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload3210; CHECK-SD-NEXT: fcvt s0, h03211; CHECK-SD-NEXT: bl logf3212; CHECK-SD-NEXT: fcvt h0, s03213; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload3214; CHECK-SD-NEXT: mov v0.h[1], v1.h[0]3215; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill3216; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload3217; CHECK-SD-NEXT: mov h0, v0.h[2]3218; CHECK-SD-NEXT: fcvt s0, h03219; CHECK-SD-NEXT: bl logf3220; CHECK-SD-NEXT: fcvt h0, s03221; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload3222; CHECK-SD-NEXT: mov v1.h[2], v0.h[0]3223; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload3224; CHECK-SD-NEXT: mov h0, v0.h[3]3225; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill3226; CHECK-SD-NEXT: fcvt s0, h03227; CHECK-SD-NEXT: bl logf3228; CHECK-SD-NEXT: fcvt h0, s03229; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload3230; CHECK-SD-NEXT: mov v1.h[3], v0.h[0]3231; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload3232; CHECK-SD-NEXT: mov h0, v0.h[4]3233; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill3234; CHECK-SD-NEXT: fcvt s0, h03235; CHECK-SD-NEXT: bl logf3236; CHECK-SD-NEXT: fcvt h0, s03237; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload3238; CHECK-SD-NEXT: mov v1.h[4], v0.h[0]3239; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload3240; CHECK-SD-NEXT: mov h0, v0.h[5]3241; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill3242; CHECK-SD-NEXT: fcvt s0, h03243; CHECK-SD-NEXT: bl logf3244; CHECK-SD-NEXT: fcvt h0, s03245; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload3246; CHECK-SD-NEXT: mov v1.h[5], v0.h[0]3247; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload3248; CHECK-SD-NEXT: mov h0, v0.h[6]3249; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill3250; CHECK-SD-NEXT: fcvt s0, h03251; CHECK-SD-NEXT: bl logf3252; CHECK-SD-NEXT: fcvt h0, s03253; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload3254; CHECK-SD-NEXT: mov v1.h[6], v0.h[0]3255; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload3256; CHECK-SD-NEXT: mov h0, v0.h[7]3257; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill3258; CHECK-SD-NEXT: fcvt s0, h03259; CHECK-SD-NEXT: bl logf3260; CHECK-SD-NEXT: fcvt h1, s03261; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload3262; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload3263; CHECK-SD-NEXT: mov v0.h[7], v1.h[0]3264; CHECK-SD-NEXT: add sp, sp, #483265; CHECK-SD-NEXT: ret3266;3267; CHECK-GI-LABEL: log_v7f16:3268; CHECK-GI: // %bb.0: // %entry3269; CHECK-GI-NEXT: sub sp, sp, #1603270; CHECK-GI-NEXT: stp d13, d12, [sp, #96] // 16-byte Folded Spill3271; CHECK-GI-NEXT: stp d11, d10, [sp, #112] // 16-byte Folded Spill3272; CHECK-GI-NEXT: stp d9, d8, [sp, #128] // 16-byte Folded Spill3273; CHECK-GI-NEXT: str x30, [sp, #144] // 8-byte Spill3274; CHECK-GI-NEXT: .cfi_def_cfa_offset 1603275; CHECK-GI-NEXT: .cfi_offset w30, -163276; CHECK-GI-NEXT: .cfi_offset b8, -243277; CHECK-GI-NEXT: .cfi_offset b9, -323278; CHECK-GI-NEXT: .cfi_offset b10, -403279; CHECK-GI-NEXT: .cfi_offset b11, -483280; CHECK-GI-NEXT: .cfi_offset b12, -563281; CHECK-GI-NEXT: .cfi_offset b13, -643282; CHECK-GI-NEXT: mov h8, v0.h[1]3283; CHECK-GI-NEXT: mov h9, v0.h[2]3284; CHECK-GI-NEXT: mov h10, v0.h[3]3285; CHECK-GI-NEXT: mov h11, v0.h[4]3286; CHECK-GI-NEXT: mov h12, v0.h[5]3287; CHECK-GI-NEXT: mov h13, v0.h[6]3288; CHECK-GI-NEXT: fcvt s0, h03289; CHECK-GI-NEXT: bl logf3290; CHECK-GI-NEXT: fcvt s1, h83291; CHECK-GI-NEXT: fcvt h0, s03292; CHECK-GI-NEXT: str q0, [sp, #80] // 16-byte Spill3293; CHECK-GI-NEXT: fmov s0, s13294; CHECK-GI-NEXT: bl logf3295; CHECK-GI-NEXT: fcvt s1, h93296; CHECK-GI-NEXT: fcvt h0, s03297; CHECK-GI-NEXT: str q0, [sp, #48] // 16-byte Spill3298; CHECK-GI-NEXT: fmov s0, s13299; CHECK-GI-NEXT: bl logf3300; CHECK-GI-NEXT: fcvt s1, h103301; CHECK-GI-NEXT: fcvt h0, s03302; CHECK-GI-NEXT: str q0, [sp, #64] // 16-byte Spill3303; CHECK-GI-NEXT: fmov s0, s13304; CHECK-GI-NEXT: bl logf3305; CHECK-GI-NEXT: fcvt s1, h113306; CHECK-GI-NEXT: fcvt h0, s03307; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill3308; CHECK-GI-NEXT: fmov s0, s13309; CHECK-GI-NEXT: bl logf3310; CHECK-GI-NEXT: fcvt s1, h123311; CHECK-GI-NEXT: fcvt h0, s03312; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill3313; CHECK-GI-NEXT: fmov s0, s13314; CHECK-GI-NEXT: bl logf3315; CHECK-GI-NEXT: fcvt s1, h133316; CHECK-GI-NEXT: fcvt h0, s03317; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill3318; CHECK-GI-NEXT: fmov s0, s13319; CHECK-GI-NEXT: bl logf3320; CHECK-GI-NEXT: ldp q3, q2, [sp, #48] // 32-byte Folded Reload3321; CHECK-GI-NEXT: fcvt h0, s03322; CHECK-GI-NEXT: ldr q1, [sp, #80] // 16-byte Reload3323; CHECK-GI-NEXT: ldp d9, d8, [sp, #128] // 16-byte Folded Reload3324; CHECK-GI-NEXT: ldp d11, d10, [sp, #112] // 16-byte Folded Reload3325; CHECK-GI-NEXT: ldr x30, [sp, #144] // 8-byte Reload3326; CHECK-GI-NEXT: mov v1.h[1], v3.h[0]3327; CHECK-GI-NEXT: ldp d13, d12, [sp, #96] // 16-byte Folded Reload3328; CHECK-GI-NEXT: mov v1.h[2], v2.h[0]3329; CHECK-GI-NEXT: ldp q2, q3, [sp, #16] // 32-byte Folded Reload3330; CHECK-GI-NEXT: mov v1.h[3], v3.h[0]3331; CHECK-GI-NEXT: mov v1.h[4], v2.h[0]3332; CHECK-GI-NEXT: ldr q2, [sp] // 16-byte Reload3333; CHECK-GI-NEXT: mov v1.h[5], v2.h[0]3334; CHECK-GI-NEXT: mov v1.h[6], v0.h[0]3335; CHECK-GI-NEXT: mov v0.16b, v1.16b3336; CHECK-GI-NEXT: add sp, sp, #1603337; CHECK-GI-NEXT: ret3338entry:3339 %c = call <7 x half> @llvm.log.v7f16(<7 x half> %a)3340 ret <7 x half> %c3341}3342 3343define <4 x half> @log_v4f16(<4 x half> %a) {3344; CHECK-SD-LABEL: log_v4f16:3345; CHECK-SD: // %bb.0: // %entry3346; CHECK-SD-NEXT: sub sp, sp, #483347; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Spill3348; CHECK-SD-NEXT: .cfi_def_cfa_offset 483349; CHECK-SD-NEXT: .cfi_offset w30, -163350; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q03351; CHECK-SD-NEXT: mov h1, v0.h[1]3352; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill3353; CHECK-SD-NEXT: fcvt s0, h13354; CHECK-SD-NEXT: bl logf3355; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload3356; CHECK-SD-NEXT: fcvt h0, s03357; CHECK-SD-NEXT: fcvt s1, h13358; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill3359; CHECK-SD-NEXT: fmov s0, s13360; CHECK-SD-NEXT: bl logf3361; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload3362; CHECK-SD-NEXT: fcvt h2, s03363; CHECK-SD-NEXT: mov h1, v1.h[2]3364; CHECK-SD-NEXT: fcvt s0, h13365; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload3366; CHECK-SD-NEXT: mov v2.h[1], v1.h[0]3367; CHECK-SD-NEXT: str q2, [sp] // 16-byte Spill3368; CHECK-SD-NEXT: bl logf3369; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload3370; CHECK-SD-NEXT: fcvt h2, s03371; CHECK-SD-NEXT: mov h1, v1.h[3]3372; CHECK-SD-NEXT: fcvt s0, h13373; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload3374; CHECK-SD-NEXT: mov v1.h[2], v2.h[0]3375; CHECK-SD-NEXT: str q1, [sp] // 16-byte Spill3376; CHECK-SD-NEXT: bl logf3377; CHECK-SD-NEXT: fcvt h1, s03378; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload3379; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload3380; CHECK-SD-NEXT: mov v0.h[3], v1.h[0]3381; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q03382; CHECK-SD-NEXT: add sp, sp, #483383; CHECK-SD-NEXT: ret3384;3385; CHECK-GI-LABEL: log_v4f16:3386; CHECK-GI: // %bb.0: // %entry3387; CHECK-GI-NEXT: sub sp, sp, #803388; CHECK-GI-NEXT: str d10, [sp, #48] // 8-byte Spill3389; CHECK-GI-NEXT: stp d9, d8, [sp, #56] // 16-byte Folded Spill3390; CHECK-GI-NEXT: str x30, [sp, #72] // 8-byte Spill3391; CHECK-GI-NEXT: .cfi_def_cfa_offset 803392; CHECK-GI-NEXT: .cfi_offset w30, -83393; CHECK-GI-NEXT: .cfi_offset b8, -163394; CHECK-GI-NEXT: .cfi_offset b9, -243395; CHECK-GI-NEXT: .cfi_offset b10, -323396; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q03397; CHECK-GI-NEXT: mov h8, v0.h[1]3398; CHECK-GI-NEXT: mov h9, v0.h[2]3399; CHECK-GI-NEXT: mov h10, v0.h[3]3400; CHECK-GI-NEXT: fcvt s0, h03401; CHECK-GI-NEXT: bl logf3402; CHECK-GI-NEXT: fcvt s1, h83403; CHECK-GI-NEXT: fcvt h0, s03404; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill3405; CHECK-GI-NEXT: fmov s0, s13406; CHECK-GI-NEXT: bl logf3407; CHECK-GI-NEXT: fcvt s1, h93408; CHECK-GI-NEXT: fcvt h0, s03409; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill3410; CHECK-GI-NEXT: fmov s0, s13411; CHECK-GI-NEXT: bl logf3412; CHECK-GI-NEXT: fcvt s1, h103413; CHECK-GI-NEXT: fcvt h0, s03414; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill3415; CHECK-GI-NEXT: fmov s0, s13416; CHECK-GI-NEXT: bl logf3417; CHECK-GI-NEXT: ldp q3, q2, [sp] // 32-byte Folded Reload3418; CHECK-GI-NEXT: fcvt h0, s03419; CHECK-GI-NEXT: ldr q1, [sp, #32] // 16-byte Reload3420; CHECK-GI-NEXT: ldp d9, d8, [sp, #56] // 16-byte Folded Reload3421; CHECK-GI-NEXT: ldr x30, [sp, #72] // 8-byte Reload3422; CHECK-GI-NEXT: ldr d10, [sp, #48] // 8-byte Reload3423; CHECK-GI-NEXT: mov v1.h[1], v3.h[0]3424; CHECK-GI-NEXT: mov v1.h[2], v2.h[0]3425; CHECK-GI-NEXT: mov v1.h[3], v0.h[0]3426; CHECK-GI-NEXT: mov v0.16b, v1.16b3427; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q03428; CHECK-GI-NEXT: add sp, sp, #803429; CHECK-GI-NEXT: ret3430entry:3431 %c = call <4 x half> @llvm.log.v4f16(<4 x half> %a)3432 ret <4 x half> %c3433}3434 3435define <8 x half> @log_v8f16(<8 x half> %a) {3436; CHECK-SD-LABEL: log_v8f16:3437; CHECK-SD: // %bb.0: // %entry3438; CHECK-SD-NEXT: sub sp, sp, #483439; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Spill3440; CHECK-SD-NEXT: .cfi_def_cfa_offset 483441; CHECK-SD-NEXT: .cfi_offset w30, -163442; CHECK-SD-NEXT: mov h1, v0.h[1]3443; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill3444; CHECK-SD-NEXT: fcvt s0, h13445; CHECK-SD-NEXT: bl logf3446; CHECK-SD-NEXT: fcvt h0, s03447; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill3448; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload3449; CHECK-SD-NEXT: fcvt s0, h03450; CHECK-SD-NEXT: bl logf3451; CHECK-SD-NEXT: fcvt h0, s03452; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload3453; CHECK-SD-NEXT: mov v0.h[1], v1.h[0]3454; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill3455; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload3456; CHECK-SD-NEXT: mov h0, v0.h[2]3457; CHECK-SD-NEXT: fcvt s0, h03458; CHECK-SD-NEXT: bl logf3459; CHECK-SD-NEXT: fcvt h0, s03460; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload3461; CHECK-SD-NEXT: mov v1.h[2], v0.h[0]3462; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload3463; CHECK-SD-NEXT: mov h0, v0.h[3]3464; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill3465; CHECK-SD-NEXT: fcvt s0, h03466; CHECK-SD-NEXT: bl logf3467; CHECK-SD-NEXT: fcvt h0, s03468; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload3469; CHECK-SD-NEXT: mov v1.h[3], v0.h[0]3470; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload3471; CHECK-SD-NEXT: mov h0, v0.h[4]3472; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill3473; CHECK-SD-NEXT: fcvt s0, h03474; CHECK-SD-NEXT: bl logf3475; CHECK-SD-NEXT: fcvt h0, s03476; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload3477; CHECK-SD-NEXT: mov v1.h[4], v0.h[0]3478; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload3479; CHECK-SD-NEXT: mov h0, v0.h[5]3480; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill3481; CHECK-SD-NEXT: fcvt s0, h03482; CHECK-SD-NEXT: bl logf3483; CHECK-SD-NEXT: fcvt h0, s03484; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload3485; CHECK-SD-NEXT: mov v1.h[5], v0.h[0]3486; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload3487; CHECK-SD-NEXT: mov h0, v0.h[6]3488; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill3489; CHECK-SD-NEXT: fcvt s0, h03490; CHECK-SD-NEXT: bl logf3491; CHECK-SD-NEXT: fcvt h0, s03492; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload3493; CHECK-SD-NEXT: mov v1.h[6], v0.h[0]3494; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload3495; CHECK-SD-NEXT: mov h0, v0.h[7]3496; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill3497; CHECK-SD-NEXT: fcvt s0, h03498; CHECK-SD-NEXT: bl logf3499; CHECK-SD-NEXT: fcvt h1, s03500; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload3501; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload3502; CHECK-SD-NEXT: mov v0.h[7], v1.h[0]3503; CHECK-SD-NEXT: add sp, sp, #483504; CHECK-SD-NEXT: ret3505;3506; CHECK-GI-LABEL: log_v8f16:3507; CHECK-GI: // %bb.0: // %entry3508; CHECK-GI-NEXT: sub sp, sp, #1763509; CHECK-GI-NEXT: str d14, [sp, #112] // 8-byte Spill3510; CHECK-GI-NEXT: stp d13, d12, [sp, #120] // 16-byte Folded Spill3511; CHECK-GI-NEXT: stp d11, d10, [sp, #136] // 16-byte Folded Spill3512; CHECK-GI-NEXT: stp d9, d8, [sp, #152] // 16-byte Folded Spill3513; CHECK-GI-NEXT: str x30, [sp, #168] // 8-byte Spill3514; CHECK-GI-NEXT: .cfi_def_cfa_offset 1763515; CHECK-GI-NEXT: .cfi_offset w30, -83516; CHECK-GI-NEXT: .cfi_offset b8, -163517; CHECK-GI-NEXT: .cfi_offset b9, -243518; CHECK-GI-NEXT: .cfi_offset b10, -323519; CHECK-GI-NEXT: .cfi_offset b11, -403520; CHECK-GI-NEXT: .cfi_offset b12, -483521; CHECK-GI-NEXT: .cfi_offset b13, -563522; CHECK-GI-NEXT: .cfi_offset b14, -643523; CHECK-GI-NEXT: mov h8, v0.h[1]3524; CHECK-GI-NEXT: mov h9, v0.h[2]3525; CHECK-GI-NEXT: mov h10, v0.h[3]3526; CHECK-GI-NEXT: mov h11, v0.h[4]3527; CHECK-GI-NEXT: mov h12, v0.h[5]3528; CHECK-GI-NEXT: mov h13, v0.h[6]3529; CHECK-GI-NEXT: mov h14, v0.h[7]3530; CHECK-GI-NEXT: fcvt s0, h03531; CHECK-GI-NEXT: bl logf3532; CHECK-GI-NEXT: fcvt s1, h83533; CHECK-GI-NEXT: fcvt h0, s03534; CHECK-GI-NEXT: str q0, [sp, #96] // 16-byte Spill3535; CHECK-GI-NEXT: fmov s0, s13536; CHECK-GI-NEXT: bl logf3537; CHECK-GI-NEXT: fcvt s1, h93538; CHECK-GI-NEXT: fcvt h0, s03539; CHECK-GI-NEXT: str q0, [sp, #64] // 16-byte Spill3540; CHECK-GI-NEXT: fmov s0, s13541; CHECK-GI-NEXT: bl logf3542; CHECK-GI-NEXT: fcvt s1, h103543; CHECK-GI-NEXT: fcvt h0, s03544; CHECK-GI-NEXT: str q0, [sp, #80] // 16-byte Spill3545; CHECK-GI-NEXT: fmov s0, s13546; CHECK-GI-NEXT: bl logf3547; CHECK-GI-NEXT: fcvt s1, h113548; CHECK-GI-NEXT: fcvt h0, s03549; CHECK-GI-NEXT: str q0, [sp, #48] // 16-byte Spill3550; CHECK-GI-NEXT: fmov s0, s13551; CHECK-GI-NEXT: bl logf3552; CHECK-GI-NEXT: fcvt s1, h123553; CHECK-GI-NEXT: fcvt h0, s03554; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill3555; CHECK-GI-NEXT: fmov s0, s13556; CHECK-GI-NEXT: bl logf3557; CHECK-GI-NEXT: fcvt s1, h133558; CHECK-GI-NEXT: fcvt h0, s03559; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill3560; CHECK-GI-NEXT: fmov s0, s13561; CHECK-GI-NEXT: bl logf3562; CHECK-GI-NEXT: fcvt s1, h143563; CHECK-GI-NEXT: fcvt h0, s03564; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill3565; CHECK-GI-NEXT: fmov s0, s13566; CHECK-GI-NEXT: bl logf3567; CHECK-GI-NEXT: ldp q3, q2, [sp, #64] // 32-byte Folded Reload3568; CHECK-GI-NEXT: fcvt h0, s03569; CHECK-GI-NEXT: ldr q1, [sp, #96] // 16-byte Reload3570; CHECK-GI-NEXT: ldp d9, d8, [sp, #152] // 16-byte Folded Reload3571; CHECK-GI-NEXT: ldp d11, d10, [sp, #136] // 16-byte Folded Reload3572; CHECK-GI-NEXT: ldr x30, [sp, #168] // 8-byte Reload3573; CHECK-GI-NEXT: mov v1.h[1], v3.h[0]3574; CHECK-GI-NEXT: ldr d14, [sp, #112] // 8-byte Reload3575; CHECK-GI-NEXT: ldp d13, d12, [sp, #120] // 16-byte Folded Reload3576; CHECK-GI-NEXT: mov v1.h[2], v2.h[0]3577; CHECK-GI-NEXT: ldp q2, q3, [sp, #32] // 32-byte Folded Reload3578; CHECK-GI-NEXT: mov v1.h[3], v3.h[0]3579; CHECK-GI-NEXT: mov v1.h[4], v2.h[0]3580; CHECK-GI-NEXT: ldp q2, q3, [sp] // 32-byte Folded Reload3581; CHECK-GI-NEXT: mov v1.h[5], v3.h[0]3582; CHECK-GI-NEXT: mov v1.h[6], v2.h[0]3583; CHECK-GI-NEXT: mov v1.h[7], v0.h[0]3584; CHECK-GI-NEXT: mov v0.16b, v1.16b3585; CHECK-GI-NEXT: add sp, sp, #1763586; CHECK-GI-NEXT: ret3587entry:3588 %c = call <8 x half> @llvm.log.v8f16(<8 x half> %a)3589 ret <8 x half> %c3590}3591 3592define <16 x half> @log_v16f16(<16 x half> %a) {3593; CHECK-SD-LABEL: log_v16f16:3594; CHECK-SD: // %bb.0: // %entry3595; CHECK-SD-NEXT: sub sp, sp, #643596; CHECK-SD-NEXT: str x30, [sp, #48] // 8-byte Spill3597; CHECK-SD-NEXT: .cfi_def_cfa_offset 643598; CHECK-SD-NEXT: .cfi_offset w30, -163599; CHECK-SD-NEXT: stp q1, q0, [sp] // 32-byte Folded Spill3600; CHECK-SD-NEXT: mov h1, v0.h[1]3601; CHECK-SD-NEXT: fcvt s0, h13602; CHECK-SD-NEXT: bl logf3603; CHECK-SD-NEXT: fcvt h0, s03604; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Spill3605; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload3606; CHECK-SD-NEXT: fcvt s0, h03607; CHECK-SD-NEXT: bl logf3608; CHECK-SD-NEXT: fcvt h0, s03609; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload3610; CHECK-SD-NEXT: mov v0.h[1], v1.h[0]3611; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Spill3612; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload3613; CHECK-SD-NEXT: mov h0, v0.h[2]3614; CHECK-SD-NEXT: fcvt s0, h03615; CHECK-SD-NEXT: bl logf3616; CHECK-SD-NEXT: fcvt h0, s03617; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload3618; CHECK-SD-NEXT: mov v1.h[2], v0.h[0]3619; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload3620; CHECK-SD-NEXT: mov h0, v0.h[3]3621; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill3622; CHECK-SD-NEXT: fcvt s0, h03623; CHECK-SD-NEXT: bl logf3624; CHECK-SD-NEXT: fcvt h0, s03625; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload3626; CHECK-SD-NEXT: mov v1.h[3], v0.h[0]3627; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload3628; CHECK-SD-NEXT: mov h0, v0.h[4]3629; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill3630; CHECK-SD-NEXT: fcvt s0, h03631; CHECK-SD-NEXT: bl logf3632; CHECK-SD-NEXT: fcvt h0, s03633; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload3634; CHECK-SD-NEXT: mov v1.h[4], v0.h[0]3635; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload3636; CHECK-SD-NEXT: mov h0, v0.h[5]3637; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill3638; CHECK-SD-NEXT: fcvt s0, h03639; CHECK-SD-NEXT: bl logf3640; CHECK-SD-NEXT: fcvt h0, s03641; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload3642; CHECK-SD-NEXT: mov v1.h[5], v0.h[0]3643; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload3644; CHECK-SD-NEXT: mov h0, v0.h[6]3645; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill3646; CHECK-SD-NEXT: fcvt s0, h03647; CHECK-SD-NEXT: bl logf3648; CHECK-SD-NEXT: fcvt h0, s03649; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload3650; CHECK-SD-NEXT: mov v1.h[6], v0.h[0]3651; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload3652; CHECK-SD-NEXT: mov h0, v0.h[7]3653; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill3654; CHECK-SD-NEXT: fcvt s0, h03655; CHECK-SD-NEXT: bl logf3656; CHECK-SD-NEXT: fcvt h0, s03657; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload3658; CHECK-SD-NEXT: mov v1.h[7], v0.h[0]3659; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload3660; CHECK-SD-NEXT: mov h0, v0.h[1]3661; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill3662; CHECK-SD-NEXT: fcvt s0, h03663; CHECK-SD-NEXT: bl logf3664; CHECK-SD-NEXT: fcvt h0, s03665; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill3666; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload3667; CHECK-SD-NEXT: fcvt s0, h03668; CHECK-SD-NEXT: bl logf3669; CHECK-SD-NEXT: fcvt h0, s03670; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload3671; CHECK-SD-NEXT: mov v0.h[1], v1.h[0]3672; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill3673; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload3674; CHECK-SD-NEXT: mov h0, v0.h[2]3675; CHECK-SD-NEXT: fcvt s0, h03676; CHECK-SD-NEXT: bl logf3677; CHECK-SD-NEXT: fcvt h0, s03678; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload3679; CHECK-SD-NEXT: mov v1.h[2], v0.h[0]3680; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload3681; CHECK-SD-NEXT: mov h0, v0.h[3]3682; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill3683; CHECK-SD-NEXT: fcvt s0, h03684; CHECK-SD-NEXT: bl logf3685; CHECK-SD-NEXT: fcvt h0, s03686; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload3687; CHECK-SD-NEXT: mov v1.h[3], v0.h[0]3688; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload3689; CHECK-SD-NEXT: mov h0, v0.h[4]3690; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill3691; CHECK-SD-NEXT: fcvt s0, h03692; CHECK-SD-NEXT: bl logf3693; CHECK-SD-NEXT: fcvt h0, s03694; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload3695; CHECK-SD-NEXT: mov v1.h[4], v0.h[0]3696; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload3697; CHECK-SD-NEXT: mov h0, v0.h[5]3698; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill3699; CHECK-SD-NEXT: fcvt s0, h03700; CHECK-SD-NEXT: bl logf3701; CHECK-SD-NEXT: fcvt h0, s03702; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload3703; CHECK-SD-NEXT: mov v1.h[5], v0.h[0]3704; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload3705; CHECK-SD-NEXT: mov h0, v0.h[6]3706; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill3707; CHECK-SD-NEXT: fcvt s0, h03708; CHECK-SD-NEXT: bl logf3709; CHECK-SD-NEXT: fcvt h0, s03710; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload3711; CHECK-SD-NEXT: mov v1.h[6], v0.h[0]3712; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload3713; CHECK-SD-NEXT: mov h0, v0.h[7]3714; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill3715; CHECK-SD-NEXT: fcvt s0, h03716; CHECK-SD-NEXT: bl logf3717; CHECK-SD-NEXT: fmov s1, s03718; CHECK-SD-NEXT: ldr x30, [sp, #48] // 8-byte Reload3719; CHECK-SD-NEXT: fcvt h2, s13720; CHECK-SD-NEXT: ldp q1, q0, [sp, #16] // 32-byte Folded Reload3721; CHECK-SD-NEXT: mov v1.h[7], v2.h[0]3722; CHECK-SD-NEXT: add sp, sp, #643723; CHECK-SD-NEXT: ret3724;3725; CHECK-GI-LABEL: log_v16f16:3726; CHECK-GI: // %bb.0: // %entry3727; CHECK-GI-NEXT: sub sp, sp, #3203728; CHECK-GI-NEXT: stp d15, d14, [sp, #240] // 16-byte Folded Spill3729; CHECK-GI-NEXT: stp d13, d12, [sp, #256] // 16-byte Folded Spill3730; CHECK-GI-NEXT: stp d11, d10, [sp, #272] // 16-byte Folded Spill3731; CHECK-GI-NEXT: stp d9, d8, [sp, #288] // 16-byte Folded Spill3732; CHECK-GI-NEXT: stp x29, x30, [sp, #304] // 16-byte Folded Spill3733; CHECK-GI-NEXT: .cfi_def_cfa_offset 3203734; CHECK-GI-NEXT: .cfi_offset w30, -83735; CHECK-GI-NEXT: .cfi_offset w29, -163736; CHECK-GI-NEXT: .cfi_offset b8, -243737; CHECK-GI-NEXT: .cfi_offset b9, -323738; CHECK-GI-NEXT: .cfi_offset b10, -403739; CHECK-GI-NEXT: .cfi_offset b11, -483740; CHECK-GI-NEXT: .cfi_offset b12, -563741; CHECK-GI-NEXT: .cfi_offset b13, -643742; CHECK-GI-NEXT: .cfi_offset b14, -723743; CHECK-GI-NEXT: .cfi_offset b15, -803744; CHECK-GI-NEXT: mov v2.16b, v1.16b3745; CHECK-GI-NEXT: str q1, [sp, #80] // 16-byte Spill3746; CHECK-GI-NEXT: mov h14, v1.h[1]3747; CHECK-GI-NEXT: mov h1, v1.h[2]3748; CHECK-GI-NEXT: mov h15, v0.h[1]3749; CHECK-GI-NEXT: mov h8, v0.h[2]3750; CHECK-GI-NEXT: mov h9, v0.h[3]3751; CHECK-GI-NEXT: mov h10, v0.h[4]3752; CHECK-GI-NEXT: mov h11, v0.h[5]3753; CHECK-GI-NEXT: mov h12, v0.h[6]3754; CHECK-GI-NEXT: mov h13, v0.h[7]3755; CHECK-GI-NEXT: fcvt s0, h03756; CHECK-GI-NEXT: str h1, [sp, #16] // 2-byte Spill3757; CHECK-GI-NEXT: mov h1, v2.h[3]3758; CHECK-GI-NEXT: str h1, [sp, #32] // 2-byte Spill3759; CHECK-GI-NEXT: mov h1, v2.h[4]3760; CHECK-GI-NEXT: str h1, [sp, #48] // 2-byte Spill3761; CHECK-GI-NEXT: mov h1, v2.h[5]3762; CHECK-GI-NEXT: str h1, [sp, #64] // 2-byte Spill3763; CHECK-GI-NEXT: mov h1, v2.h[6]3764; CHECK-GI-NEXT: str h1, [sp, #96] // 2-byte Spill3765; CHECK-GI-NEXT: mov h1, v2.h[7]3766; CHECK-GI-NEXT: str h1, [sp, #160] // 2-byte Spill3767; CHECK-GI-NEXT: bl logf3768; CHECK-GI-NEXT: fcvt s1, h153769; CHECK-GI-NEXT: fcvt h0, s03770; CHECK-GI-NEXT: str q0, [sp, #192] // 16-byte Spill3771; CHECK-GI-NEXT: fmov s0, s13772; CHECK-GI-NEXT: bl logf3773; CHECK-GI-NEXT: fcvt s1, h83774; CHECK-GI-NEXT: fcvt h0, s03775; CHECK-GI-NEXT: str q0, [sp, #112] // 16-byte Spill3776; CHECK-GI-NEXT: fmov s0, s13777; CHECK-GI-NEXT: bl logf3778; CHECK-GI-NEXT: fcvt s1, h93779; CHECK-GI-NEXT: fcvt h0, s03780; CHECK-GI-NEXT: str q0, [sp, #224] // 16-byte Spill3781; CHECK-GI-NEXT: fmov s0, s13782; CHECK-GI-NEXT: bl logf3783; CHECK-GI-NEXT: fcvt s1, h103784; CHECK-GI-NEXT: fcvt h0, s03785; CHECK-GI-NEXT: str q0, [sp, #208] // 16-byte Spill3786; CHECK-GI-NEXT: fmov s0, s13787; CHECK-GI-NEXT: bl logf3788; CHECK-GI-NEXT: fcvt s1, h113789; CHECK-GI-NEXT: fcvt h0, s03790; CHECK-GI-NEXT: str q0, [sp, #176] // 16-byte Spill3791; CHECK-GI-NEXT: fmov s0, s13792; CHECK-GI-NEXT: bl logf3793; CHECK-GI-NEXT: fcvt s1, h123794; CHECK-GI-NEXT: fcvt h0, s03795; CHECK-GI-NEXT: str q0, [sp, #144] // 16-byte Spill3796; CHECK-GI-NEXT: fmov s0, s13797; CHECK-GI-NEXT: bl logf3798; CHECK-GI-NEXT: fcvt s1, h133799; CHECK-GI-NEXT: fcvt h0, s03800; CHECK-GI-NEXT: str q0, [sp, #128] // 16-byte Spill3801; CHECK-GI-NEXT: fmov s0, s13802; CHECK-GI-NEXT: bl logf3803; CHECK-GI-NEXT: ldr q1, [sp, #80] // 16-byte Reload3804; CHECK-GI-NEXT: fcvt h0, s03805; CHECK-GI-NEXT: fcvt s1, h13806; CHECK-GI-NEXT: str q0, [sp, #80] // 16-byte Spill3807; CHECK-GI-NEXT: fmov s0, s13808; CHECK-GI-NEXT: bl logf3809; CHECK-GI-NEXT: fcvt s1, h143810; CHECK-GI-NEXT: fcvt h0, s03811; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill3812; CHECK-GI-NEXT: fmov s0, s13813; CHECK-GI-NEXT: bl logf3814; CHECK-GI-NEXT: ldr h1, [sp, #16] // 2-byte Reload3815; CHECK-GI-NEXT: fcvt h0, s03816; CHECK-GI-NEXT: fcvt s1, h13817; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill3818; CHECK-GI-NEXT: fmov s0, s13819; CHECK-GI-NEXT: bl logf3820; CHECK-GI-NEXT: ldr h1, [sp, #32] // 2-byte Reload3821; CHECK-GI-NEXT: fcvt h0, s03822; CHECK-GI-NEXT: fcvt s1, h13823; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill3824; CHECK-GI-NEXT: fmov s0, s13825; CHECK-GI-NEXT: bl logf3826; CHECK-GI-NEXT: ldr h1, [sp, #48] // 2-byte Reload3827; CHECK-GI-NEXT: fcvt h0, s03828; CHECK-GI-NEXT: fcvt s1, h13829; CHECK-GI-NEXT: str q0, [sp, #48] // 16-byte Spill3830; CHECK-GI-NEXT: fmov s0, s13831; CHECK-GI-NEXT: bl logf3832; CHECK-GI-NEXT: ldr h1, [sp, #64] // 2-byte Reload3833; CHECK-GI-NEXT: fcvt h0, s03834; CHECK-GI-NEXT: fcvt s1, h13835; CHECK-GI-NEXT: str q0, [sp, #64] // 16-byte Spill3836; CHECK-GI-NEXT: fmov s0, s13837; CHECK-GI-NEXT: bl logf3838; CHECK-GI-NEXT: ldr h1, [sp, #96] // 2-byte Reload3839; CHECK-GI-NEXT: fcvt h0, s03840; CHECK-GI-NEXT: fcvt s1, h13841; CHECK-GI-NEXT: str q0, [sp, #96] // 16-byte Spill3842; CHECK-GI-NEXT: fmov s0, s13843; CHECK-GI-NEXT: bl logf3844; CHECK-GI-NEXT: ldr h1, [sp, #160] // 2-byte Reload3845; CHECK-GI-NEXT: fcvt h0, s03846; CHECK-GI-NEXT: fcvt s1, h13847; CHECK-GI-NEXT: str q0, [sp, #160] // 16-byte Spill3848; CHECK-GI-NEXT: fmov s0, s13849; CHECK-GI-NEXT: bl logf3850; CHECK-GI-NEXT: ldr q3, [sp, #192] // 16-byte Reload3851; CHECK-GI-NEXT: ldr q2, [sp, #112] // 16-byte Reload3852; CHECK-GI-NEXT: ldp x29, x30, [sp, #304] // 16-byte Folded Reload3853; CHECK-GI-NEXT: mov v3.h[1], v2.h[0]3854; CHECK-GI-NEXT: ldp q1, q2, [sp] // 32-byte Folded Reload3855; CHECK-GI-NEXT: ldp d9, d8, [sp, #288] // 16-byte Folded Reload3856; CHECK-GI-NEXT: ldp d11, d10, [sp, #272] // 16-byte Folded Reload3857; CHECK-GI-NEXT: mov v1.h[1], v2.h[0]3858; CHECK-GI-NEXT: ldr q2, [sp, #224] // 16-byte Reload3859; CHECK-GI-NEXT: ldp d13, d12, [sp, #256] // 16-byte Folded Reload3860; CHECK-GI-NEXT: mov v3.h[2], v2.h[0]3861; CHECK-GI-NEXT: ldr q2, [sp, #32] // 16-byte Reload3862; CHECK-GI-NEXT: ldp d15, d14, [sp, #240] // 16-byte Folded Reload3863; CHECK-GI-NEXT: mov v1.h[2], v2.h[0]3864; CHECK-GI-NEXT: ldr q2, [sp, #208] // 16-byte Reload3865; CHECK-GI-NEXT: mov v3.h[3], v2.h[0]3866; CHECK-GI-NEXT: ldr q2, [sp, #48] // 16-byte Reload3867; CHECK-GI-NEXT: mov v1.h[3], v2.h[0]3868; CHECK-GI-NEXT: ldr q2, [sp, #176] // 16-byte Reload3869; CHECK-GI-NEXT: mov v3.h[4], v2.h[0]3870; CHECK-GI-NEXT: ldr q2, [sp, #64] // 16-byte Reload3871; CHECK-GI-NEXT: mov v1.h[4], v2.h[0]3872; CHECK-GI-NEXT: ldr q2, [sp, #144] // 16-byte Reload3873; CHECK-GI-NEXT: mov v3.h[5], v2.h[0]3874; CHECK-GI-NEXT: ldr q2, [sp, #96] // 16-byte Reload3875; CHECK-GI-NEXT: mov v1.h[5], v2.h[0]3876; CHECK-GI-NEXT: fcvt h2, s03877; CHECK-GI-NEXT: ldr q0, [sp, #128] // 16-byte Reload3878; CHECK-GI-NEXT: mov v3.h[6], v0.h[0]3879; CHECK-GI-NEXT: ldr q0, [sp, #160] // 16-byte Reload3880; CHECK-GI-NEXT: mov v1.h[6], v0.h[0]3881; CHECK-GI-NEXT: ldr q0, [sp, #80] // 16-byte Reload3882; CHECK-GI-NEXT: mov v3.h[7], v0.h[0]3883; CHECK-GI-NEXT: mov v1.h[7], v2.h[0]3884; CHECK-GI-NEXT: mov v0.16b, v3.16b3885; CHECK-GI-NEXT: add sp, sp, #3203886; CHECK-GI-NEXT: ret3887entry:3888 %c = call <16 x half> @llvm.log.v16f16(<16 x half> %a)3889 ret <16 x half> %c3890}3891 3892define <2 x fp128> @log_v2fp128(<2 x fp128> %a) {3893; CHECK-LABEL: log_v2fp128:3894; CHECK: // %bb.0: // %entry3895; CHECK-NEXT: sub sp, sp, #483896; CHECK-NEXT: str x30, [sp, #32] // 8-byte Spill3897; CHECK-NEXT: .cfi_def_cfa_offset 483898; CHECK-NEXT: .cfi_offset w30, -163899; CHECK-NEXT: str q1, [sp, #16] // 16-byte Spill3900; CHECK-NEXT: bl logl3901; CHECK-NEXT: str q0, [sp] // 16-byte Spill3902; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload3903; CHECK-NEXT: bl logl3904; CHECK-NEXT: mov v1.16b, v0.16b3905; CHECK-NEXT: ldr q0, [sp] // 16-byte Reload3906; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Reload3907; CHECK-NEXT: add sp, sp, #483908; CHECK-NEXT: ret3909entry:3910 %c = call <2 x fp128> @llvm.log.v2fp128(<2 x fp128> %a)3911 ret <2 x fp128> %c3912}3913 3914define double @log2_f64(double %a) {3915; CHECK-LABEL: log2_f64:3916; CHECK: // %bb.0: // %entry3917; CHECK-NEXT: b log23918entry:3919 %c = call double @llvm.log2.f64(double %a)3920 ret double %c3921}3922 3923define float @log2_f32(float %a) {3924; CHECK-LABEL: log2_f32:3925; CHECK: // %bb.0: // %entry3926; CHECK-NEXT: b log2f3927entry:3928 %c = call float @llvm.log2.f32(float %a)3929 ret float %c3930}3931 3932define half @log2_f16(half %a) {3933; CHECK-LABEL: log2_f16:3934; CHECK: // %bb.0: // %entry3935; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill3936; CHECK-NEXT: .cfi_def_cfa_offset 163937; CHECK-NEXT: .cfi_offset w30, -163938; CHECK-NEXT: fcvt s0, h03939; CHECK-NEXT: bl log2f3940; CHECK-NEXT: fcvt h0, s03941; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload3942; CHECK-NEXT: ret3943entry:3944 %c = call half @llvm.log2.f16(half %a)3945 ret half %c3946}3947 3948define fp128 @log2_fp128(fp128 %a) {3949; CHECK-LABEL: log2_fp128:3950; CHECK: // %bb.0: // %entry3951; CHECK-NEXT: b log2l3952entry:3953 %c = call fp128 @llvm.log2.fp128(fp128 %a)3954 ret fp128 %c3955}3956 3957define <1 x double> @log2_v1f64(<1 x double> %a) {3958; CHECK-LABEL: log2_v1f64:3959; CHECK: // %bb.0: // %entry3960; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill3961; CHECK-NEXT: .cfi_def_cfa_offset 163962; CHECK-NEXT: .cfi_offset w30, -163963; CHECK-NEXT: bl log23964; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload3965; CHECK-NEXT: ret3966entry:3967 %c = call <1 x double> @llvm.log2.v1f64(<1 x double> %a)3968 ret <1 x double> %c3969}3970 3971define <2 x double> @log2_v2f64(<2 x double> %a) {3972; CHECK-SD-LABEL: log2_v2f64:3973; CHECK-SD: // %bb.0: // %entry3974; CHECK-SD-NEXT: sub sp, sp, #483975; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Spill3976; CHECK-SD-NEXT: .cfi_def_cfa_offset 483977; CHECK-SD-NEXT: .cfi_offset w30, -163978; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill3979; CHECK-SD-NEXT: mov d0, v0.d[1]3980; CHECK-SD-NEXT: bl log23981; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q03982; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill3983; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload3984; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q03985; CHECK-SD-NEXT: bl log23986; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload3987; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q03988; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload3989; CHECK-SD-NEXT: mov v0.d[1], v1.d[0]3990; CHECK-SD-NEXT: add sp, sp, #483991; CHECK-SD-NEXT: ret3992;3993; CHECK-GI-LABEL: log2_v2f64:3994; CHECK-GI: // %bb.0: // %entry3995; CHECK-GI-NEXT: sub sp, sp, #323996; CHECK-GI-NEXT: str d8, [sp, #16] // 8-byte Spill3997; CHECK-GI-NEXT: str x30, [sp, #24] // 8-byte Spill3998; CHECK-GI-NEXT: .cfi_def_cfa_offset 323999; CHECK-GI-NEXT: .cfi_offset w30, -84000; CHECK-GI-NEXT: .cfi_offset b8, -164001; CHECK-GI-NEXT: mov d8, v0.d[1]4002; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q04003; CHECK-GI-NEXT: bl log24004; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q04005; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill4006; CHECK-GI-NEXT: fmov d0, d84007; CHECK-GI-NEXT: bl log24008; CHECK-GI-NEXT: ldr q1, [sp] // 16-byte Reload4009; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q04010; CHECK-GI-NEXT: ldr x30, [sp, #24] // 8-byte Reload4011; CHECK-GI-NEXT: ldr d8, [sp, #16] // 8-byte Reload4012; CHECK-GI-NEXT: mov v1.d[1], v0.d[0]4013; CHECK-GI-NEXT: mov v0.16b, v1.16b4014; CHECK-GI-NEXT: add sp, sp, #324015; CHECK-GI-NEXT: ret4016entry:4017 %c = call <2 x double> @llvm.log2.v2f64(<2 x double> %a)4018 ret <2 x double> %c4019}4020 4021define <3 x double> @log2_v3f64(<3 x double> %a) {4022; CHECK-SD-LABEL: log2_v3f64:4023; CHECK-SD: // %bb.0: // %entry4024; CHECK-SD-NEXT: str d10, [sp, #-32]! // 8-byte Folded Spill4025; CHECK-SD-NEXT: stp d9, d8, [sp, #8] // 16-byte Folded Spill4026; CHECK-SD-NEXT: str x30, [sp, #24] // 8-byte Spill4027; CHECK-SD-NEXT: .cfi_def_cfa_offset 324028; CHECK-SD-NEXT: .cfi_offset w30, -84029; CHECK-SD-NEXT: .cfi_offset b8, -164030; CHECK-SD-NEXT: .cfi_offset b9, -244031; CHECK-SD-NEXT: .cfi_offset b10, -324032; CHECK-SD-NEXT: fmov d8, d24033; CHECK-SD-NEXT: fmov d9, d14034; CHECK-SD-NEXT: bl log24035; CHECK-SD-NEXT: fmov d10, d04036; CHECK-SD-NEXT: fmov d0, d94037; CHECK-SD-NEXT: bl log24038; CHECK-SD-NEXT: fmov d9, d04039; CHECK-SD-NEXT: fmov d0, d84040; CHECK-SD-NEXT: bl log24041; CHECK-SD-NEXT: fmov d1, d94042; CHECK-SD-NEXT: ldp d9, d8, [sp, #8] // 16-byte Folded Reload4043; CHECK-SD-NEXT: ldr x30, [sp, #24] // 8-byte Reload4044; CHECK-SD-NEXT: fmov d2, d04045; CHECK-SD-NEXT: fmov d0, d104046; CHECK-SD-NEXT: ldr d10, [sp], #32 // 8-byte Folded Reload4047; CHECK-SD-NEXT: ret4048;4049; CHECK-GI-LABEL: log2_v3f64:4050; CHECK-GI: // %bb.0: // %entry4051; CHECK-GI-NEXT: str d10, [sp, #-32]! // 8-byte Folded Spill4052; CHECK-GI-NEXT: stp d9, d8, [sp, #8] // 16-byte Folded Spill4053; CHECK-GI-NEXT: str x30, [sp, #24] // 8-byte Spill4054; CHECK-GI-NEXT: .cfi_def_cfa_offset 324055; CHECK-GI-NEXT: .cfi_offset w30, -84056; CHECK-GI-NEXT: .cfi_offset b8, -164057; CHECK-GI-NEXT: .cfi_offset b9, -244058; CHECK-GI-NEXT: .cfi_offset b10, -324059; CHECK-GI-NEXT: fmov d8, d14060; CHECK-GI-NEXT: fmov d9, d24061; CHECK-GI-NEXT: bl log24062; CHECK-GI-NEXT: fmov d10, d04063; CHECK-GI-NEXT: fmov d0, d84064; CHECK-GI-NEXT: bl log24065; CHECK-GI-NEXT: fmov d8, d04066; CHECK-GI-NEXT: fmov d0, d94067; CHECK-GI-NEXT: bl log24068; CHECK-GI-NEXT: fmov d1, d84069; CHECK-GI-NEXT: ldp d9, d8, [sp, #8] // 16-byte Folded Reload4070; CHECK-GI-NEXT: ldr x30, [sp, #24] // 8-byte Reload4071; CHECK-GI-NEXT: fmov d2, d04072; CHECK-GI-NEXT: fmov d0, d104073; CHECK-GI-NEXT: ldr d10, [sp], #32 // 8-byte Folded Reload4074; CHECK-GI-NEXT: ret4075entry:4076 %c = call <3 x double> @llvm.log2.v3f64(<3 x double> %a)4077 ret <3 x double> %c4078}4079 4080define <4 x double> @log2_v4f64(<4 x double> %a) {4081; CHECK-SD-LABEL: log2_v4f64:4082; CHECK-SD: // %bb.0: // %entry4083; CHECK-SD-NEXT: sub sp, sp, #644084; CHECK-SD-NEXT: str x30, [sp, #48] // 8-byte Spill4085; CHECK-SD-NEXT: .cfi_def_cfa_offset 644086; CHECK-SD-NEXT: .cfi_offset w30, -164087; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill4088; CHECK-SD-NEXT: mov d0, v0.d[1]4089; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill4090; CHECK-SD-NEXT: bl log24091; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q04092; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill4093; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload4094; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q04095; CHECK-SD-NEXT: bl log24096; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload4097; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q04098; CHECK-SD-NEXT: mov v0.d[1], v1.d[0]4099; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill4100; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Reload4101; CHECK-SD-NEXT: mov d0, v0.d[1]4102; CHECK-SD-NEXT: bl log24103; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q04104; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill4105; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Reload4106; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q04107; CHECK-SD-NEXT: bl log24108; CHECK-SD-NEXT: fmov d1, d04109; CHECK-SD-NEXT: ldp q2, q0, [sp] // 32-byte Folded Reload4110; CHECK-SD-NEXT: ldr x30, [sp, #48] // 8-byte Reload4111; CHECK-SD-NEXT: mov v1.d[1], v2.d[0]4112; CHECK-SD-NEXT: add sp, sp, #644113; CHECK-SD-NEXT: ret4114;4115; CHECK-GI-LABEL: log2_v4f64:4116; CHECK-GI: // %bb.0: // %entry4117; CHECK-GI-NEXT: sub sp, sp, #804118; CHECK-GI-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill4119; CHECK-GI-NEXT: str x30, [sp, #64] // 8-byte Spill4120; CHECK-GI-NEXT: .cfi_def_cfa_offset 804121; CHECK-GI-NEXT: .cfi_offset w30, -164122; CHECK-GI-NEXT: .cfi_offset b8, -244123; CHECK-GI-NEXT: .cfi_offset b9, -324124; CHECK-GI-NEXT: str q1, [sp] // 16-byte Spill4125; CHECK-GI-NEXT: mov d8, v0.d[1]4126; CHECK-GI-NEXT: mov d9, v1.d[1]4127; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q04128; CHECK-GI-NEXT: bl log24129; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q04130; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill4131; CHECK-GI-NEXT: fmov d0, d84132; CHECK-GI-NEXT: bl log24133; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q04134; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill4135; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Reload4136; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q04137; CHECK-GI-NEXT: bl log24138; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q04139; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill4140; CHECK-GI-NEXT: fmov d0, d94141; CHECK-GI-NEXT: bl log24142; CHECK-GI-NEXT: ldp q1, q2, [sp, #16] // 32-byte Folded Reload4143; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q04144; CHECK-GI-NEXT: ldr x30, [sp, #64] // 8-byte Reload4145; CHECK-GI-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload4146; CHECK-GI-NEXT: mov v2.d[1], v1.d[0]4147; CHECK-GI-NEXT: ldr q1, [sp] // 16-byte Reload4148; CHECK-GI-NEXT: mov v1.d[1], v0.d[0]4149; CHECK-GI-NEXT: mov v0.16b, v2.16b4150; CHECK-GI-NEXT: add sp, sp, #804151; CHECK-GI-NEXT: ret4152entry:4153 %c = call <4 x double> @llvm.log2.v4f64(<4 x double> %a)4154 ret <4 x double> %c4155}4156 4157define <2 x float> @log2_v2f32(<2 x float> %a) {4158; CHECK-SD-LABEL: log2_v2f32:4159; CHECK-SD: // %bb.0: // %entry4160; CHECK-SD-NEXT: sub sp, sp, #484161; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Spill4162; CHECK-SD-NEXT: .cfi_def_cfa_offset 484163; CHECK-SD-NEXT: .cfi_offset w30, -164164; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q04165; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill4166; CHECK-SD-NEXT: mov s0, v0.s[1]4167; CHECK-SD-NEXT: bl log2f4168; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q04169; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill4170; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload4171; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q04172; CHECK-SD-NEXT: bl log2f4173; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload4174; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q04175; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload4176; CHECK-SD-NEXT: mov v0.s[1], v1.s[0]4177; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q04178; CHECK-SD-NEXT: add sp, sp, #484179; CHECK-SD-NEXT: ret4180;4181; CHECK-GI-LABEL: log2_v2f32:4182; CHECK-GI: // %bb.0: // %entry4183; CHECK-GI-NEXT: sub sp, sp, #324184; CHECK-GI-NEXT: str d8, [sp, #16] // 8-byte Spill4185; CHECK-GI-NEXT: str x30, [sp, #24] // 8-byte Spill4186; CHECK-GI-NEXT: .cfi_def_cfa_offset 324187; CHECK-GI-NEXT: .cfi_offset w30, -84188; CHECK-GI-NEXT: .cfi_offset b8, -164189; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q04190; CHECK-GI-NEXT: mov s8, v0.s[1]4191; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q04192; CHECK-GI-NEXT: bl log2f4193; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q04194; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill4195; CHECK-GI-NEXT: fmov s0, s84196; CHECK-GI-NEXT: bl log2f4197; CHECK-GI-NEXT: ldr q1, [sp] // 16-byte Reload4198; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q04199; CHECK-GI-NEXT: ldr x30, [sp, #24] // 8-byte Reload4200; CHECK-GI-NEXT: ldr d8, [sp, #16] // 8-byte Reload4201; CHECK-GI-NEXT: mov v1.s[1], v0.s[0]4202; CHECK-GI-NEXT: fmov d0, d14203; CHECK-GI-NEXT: add sp, sp, #324204; CHECK-GI-NEXT: ret4205entry:4206 %c = call <2 x float> @llvm.log2.v2f32(<2 x float> %a)4207 ret <2 x float> %c4208}4209 4210define <3 x float> @log2_v3f32(<3 x float> %a) {4211; CHECK-SD-LABEL: log2_v3f32:4212; CHECK-SD: // %bb.0: // %entry4213; CHECK-SD-NEXT: sub sp, sp, #484214; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Spill4215; CHECK-SD-NEXT: .cfi_def_cfa_offset 484216; CHECK-SD-NEXT: .cfi_offset w30, -164217; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill4218; CHECK-SD-NEXT: mov s0, v0.s[1]4219; CHECK-SD-NEXT: bl log2f4220; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q04221; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill4222; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload4223; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q04224; CHECK-SD-NEXT: bl log2f4225; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload4226; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q04227; CHECK-SD-NEXT: mov v0.s[1], v1.s[0]4228; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill4229; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload4230; CHECK-SD-NEXT: mov s0, v0.s[2]4231; CHECK-SD-NEXT: bl log2f4232; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload4233; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q04234; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload4235; CHECK-SD-NEXT: mov v1.s[2], v0.s[0]4236; CHECK-SD-NEXT: mov v0.16b, v1.16b4237; CHECK-SD-NEXT: add sp, sp, #484238; CHECK-SD-NEXT: ret4239;4240; CHECK-GI-LABEL: log2_v3f32:4241; CHECK-GI: // %bb.0: // %entry4242; CHECK-GI-NEXT: sub sp, sp, #644243; CHECK-GI-NEXT: stp d9, d8, [sp, #32] // 16-byte Folded Spill4244; CHECK-GI-NEXT: str x30, [sp, #48] // 8-byte Spill4245; CHECK-GI-NEXT: .cfi_def_cfa_offset 644246; CHECK-GI-NEXT: .cfi_offset w30, -164247; CHECK-GI-NEXT: .cfi_offset b8, -244248; CHECK-GI-NEXT: .cfi_offset b9, -324249; CHECK-GI-NEXT: mov s8, v0.s[1]4250; CHECK-GI-NEXT: mov s9, v0.s[2]4251; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q04252; CHECK-GI-NEXT: bl log2f4253; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q04254; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill4255; CHECK-GI-NEXT: fmov s0, s84256; CHECK-GI-NEXT: bl log2f4257; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q04258; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill4259; CHECK-GI-NEXT: fmov s0, s94260; CHECK-GI-NEXT: bl log2f4261; CHECK-GI-NEXT: ldp q2, q1, [sp] // 32-byte Folded Reload4262; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q04263; CHECK-GI-NEXT: ldr x30, [sp, #48] // 8-byte Reload4264; CHECK-GI-NEXT: ldp d9, d8, [sp, #32] // 16-byte Folded Reload4265; CHECK-GI-NEXT: mov v1.s[1], v2.s[0]4266; CHECK-GI-NEXT: mov v1.s[2], v0.s[0]4267; CHECK-GI-NEXT: mov v0.16b, v1.16b4268; CHECK-GI-NEXT: add sp, sp, #644269; CHECK-GI-NEXT: ret4270entry:4271 %c = call <3 x float> @llvm.log2.v3f32(<3 x float> %a)4272 ret <3 x float> %c4273}4274 4275define <4 x float> @log2_v4f32(<4 x float> %a) {4276; CHECK-SD-LABEL: log2_v4f32:4277; CHECK-SD: // %bb.0: // %entry4278; CHECK-SD-NEXT: sub sp, sp, #484279; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Spill4280; CHECK-SD-NEXT: .cfi_def_cfa_offset 484281; CHECK-SD-NEXT: .cfi_offset w30, -164282; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill4283; CHECK-SD-NEXT: mov s0, v0.s[1]4284; CHECK-SD-NEXT: bl log2f4285; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q04286; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill4287; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload4288; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q04289; CHECK-SD-NEXT: bl log2f4290; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload4291; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q04292; CHECK-SD-NEXT: mov v0.s[1], v1.s[0]4293; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill4294; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload4295; CHECK-SD-NEXT: mov s0, v0.s[2]4296; CHECK-SD-NEXT: bl log2f4297; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload4298; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q04299; CHECK-SD-NEXT: mov v1.s[2], v0.s[0]4300; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload4301; CHECK-SD-NEXT: mov s0, v0.s[3]4302; CHECK-SD-NEXT: str q1, [sp] // 16-byte Spill4303; CHECK-SD-NEXT: bl log2f4304; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload4305; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q04306; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload4307; CHECK-SD-NEXT: mov v1.s[3], v0.s[0]4308; CHECK-SD-NEXT: mov v0.16b, v1.16b4309; CHECK-SD-NEXT: add sp, sp, #484310; CHECK-SD-NEXT: ret4311;4312; CHECK-GI-LABEL: log2_v4f32:4313; CHECK-GI: // %bb.0: // %entry4314; CHECK-GI-NEXT: sub sp, sp, #804315; CHECK-GI-NEXT: str d10, [sp, #48] // 8-byte Spill4316; CHECK-GI-NEXT: stp d9, d8, [sp, #56] // 16-byte Folded Spill4317; CHECK-GI-NEXT: str x30, [sp, #72] // 8-byte Spill4318; CHECK-GI-NEXT: .cfi_def_cfa_offset 804319; CHECK-GI-NEXT: .cfi_offset w30, -84320; CHECK-GI-NEXT: .cfi_offset b8, -164321; CHECK-GI-NEXT: .cfi_offset b9, -244322; CHECK-GI-NEXT: .cfi_offset b10, -324323; CHECK-GI-NEXT: mov s8, v0.s[1]4324; CHECK-GI-NEXT: mov s9, v0.s[2]4325; CHECK-GI-NEXT: mov s10, v0.s[3]4326; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q04327; CHECK-GI-NEXT: bl log2f4328; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q04329; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill4330; CHECK-GI-NEXT: fmov s0, s84331; CHECK-GI-NEXT: bl log2f4332; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q04333; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill4334; CHECK-GI-NEXT: fmov s0, s94335; CHECK-GI-NEXT: bl log2f4336; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q04337; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill4338; CHECK-GI-NEXT: fmov s0, s104339; CHECK-GI-NEXT: bl log2f4340; CHECK-GI-NEXT: ldp q2, q1, [sp, #16] // 32-byte Folded Reload4341; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q04342; CHECK-GI-NEXT: ldr x30, [sp, #72] // 8-byte Reload4343; CHECK-GI-NEXT: ldp d9, d8, [sp, #56] // 16-byte Folded Reload4344; CHECK-GI-NEXT: ldr d10, [sp, #48] // 8-byte Reload4345; CHECK-GI-NEXT: mov v1.s[1], v2.s[0]4346; CHECK-GI-NEXT: ldr q2, [sp] // 16-byte Reload4347; CHECK-GI-NEXT: mov v1.s[2], v2.s[0]4348; CHECK-GI-NEXT: mov v1.s[3], v0.s[0]4349; CHECK-GI-NEXT: mov v0.16b, v1.16b4350; CHECK-GI-NEXT: add sp, sp, #804351; CHECK-GI-NEXT: ret4352entry:4353 %c = call <4 x float> @llvm.log2.v4f32(<4 x float> %a)4354 ret <4 x float> %c4355}4356 4357define <8 x float> @log2_v8f32(<8 x float> %a) {4358; CHECK-SD-LABEL: log2_v8f32:4359; CHECK-SD: // %bb.0: // %entry4360; CHECK-SD-NEXT: sub sp, sp, #644361; CHECK-SD-NEXT: str x30, [sp, #48] // 8-byte Spill4362; CHECK-SD-NEXT: .cfi_def_cfa_offset 644363; CHECK-SD-NEXT: .cfi_offset w30, -164364; CHECK-SD-NEXT: stp q0, q1, [sp] // 32-byte Folded Spill4365; CHECK-SD-NEXT: mov s0, v0.s[1]4366; CHECK-SD-NEXT: bl log2f4367; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q04368; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Spill4369; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload4370; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q04371; CHECK-SD-NEXT: bl log2f4372; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload4373; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q04374; CHECK-SD-NEXT: mov v0.s[1], v1.s[0]4375; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Spill4376; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload4377; CHECK-SD-NEXT: mov s0, v0.s[2]4378; CHECK-SD-NEXT: bl log2f4379; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload4380; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q04381; CHECK-SD-NEXT: mov v1.s[2], v0.s[0]4382; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload4383; CHECK-SD-NEXT: mov s0, v0.s[3]4384; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill4385; CHECK-SD-NEXT: bl log2f4386; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload4387; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q04388; CHECK-SD-NEXT: mov v1.s[3], v0.s[0]4389; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload4390; CHECK-SD-NEXT: mov s0, v0.s[1]4391; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill4392; CHECK-SD-NEXT: bl log2f4393; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q04394; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill4395; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload4396; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q04397; CHECK-SD-NEXT: bl log2f4398; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload4399; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q04400; CHECK-SD-NEXT: mov v0.s[1], v1.s[0]4401; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill4402; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload4403; CHECK-SD-NEXT: mov s0, v0.s[2]4404; CHECK-SD-NEXT: bl log2f4405; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload4406; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q04407; CHECK-SD-NEXT: mov v1.s[2], v0.s[0]4408; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload4409; CHECK-SD-NEXT: mov s0, v0.s[3]4410; CHECK-SD-NEXT: str q1, [sp] // 16-byte Spill4411; CHECK-SD-NEXT: bl log2f4412; CHECK-SD-NEXT: fmov s2, s04413; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload4414; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Reload4415; CHECK-SD-NEXT: ldr x30, [sp, #48] // 8-byte Reload4416; CHECK-SD-NEXT: mov v1.s[3], v2.s[0]4417; CHECK-SD-NEXT: add sp, sp, #644418; CHECK-SD-NEXT: ret4419;4420; CHECK-GI-LABEL: log2_v8f32:4421; CHECK-GI: // %bb.0: // %entry4422; CHECK-GI-NEXT: sub sp, sp, #1764423; CHECK-GI-NEXT: stp d13, d12, [sp, #112] // 16-byte Folded Spill4424; CHECK-GI-NEXT: stp d11, d10, [sp, #128] // 16-byte Folded Spill4425; CHECK-GI-NEXT: stp d9, d8, [sp, #144] // 16-byte Folded Spill4426; CHECK-GI-NEXT: str x30, [sp, #160] // 8-byte Spill4427; CHECK-GI-NEXT: .cfi_def_cfa_offset 1764428; CHECK-GI-NEXT: .cfi_offset w30, -164429; CHECK-GI-NEXT: .cfi_offset b8, -244430; CHECK-GI-NEXT: .cfi_offset b9, -324431; CHECK-GI-NEXT: .cfi_offset b10, -404432; CHECK-GI-NEXT: .cfi_offset b11, -484433; CHECK-GI-NEXT: .cfi_offset b12, -564434; CHECK-GI-NEXT: .cfi_offset b13, -644435; CHECK-GI-NEXT: str q1, [sp, #32] // 16-byte Spill4436; CHECK-GI-NEXT: mov s8, v0.s[1]4437; CHECK-GI-NEXT: mov s9, v0.s[2]4438; CHECK-GI-NEXT: mov s10, v0.s[3]4439; CHECK-GI-NEXT: mov s11, v1.s[1]4440; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q04441; CHECK-GI-NEXT: mov s12, v1.s[2]4442; CHECK-GI-NEXT: mov s13, v1.s[3]4443; CHECK-GI-NEXT: bl log2f4444; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q04445; CHECK-GI-NEXT: str q0, [sp, #64] // 16-byte Spill4446; CHECK-GI-NEXT: fmov s0, s84447; CHECK-GI-NEXT: bl log2f4448; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q04449; CHECK-GI-NEXT: str q0, [sp, #48] // 16-byte Spill4450; CHECK-GI-NEXT: fmov s0, s94451; CHECK-GI-NEXT: bl log2f4452; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q04453; CHECK-GI-NEXT: str q0, [sp, #96] // 16-byte Spill4454; CHECK-GI-NEXT: fmov s0, s104455; CHECK-GI-NEXT: bl log2f4456; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q04457; CHECK-GI-NEXT: str q0, [sp, #80] // 16-byte Spill4458; CHECK-GI-NEXT: ldr q0, [sp, #32] // 16-byte Reload4459; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q04460; CHECK-GI-NEXT: bl log2f4461; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q04462; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill4463; CHECK-GI-NEXT: fmov s0, s114464; CHECK-GI-NEXT: bl log2f4465; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q04466; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill4467; CHECK-GI-NEXT: fmov s0, s124468; CHECK-GI-NEXT: bl log2f4469; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q04470; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill4471; CHECK-GI-NEXT: fmov s0, s134472; CHECK-GI-NEXT: bl log2f4473; CHECK-GI-NEXT: ldp q2, q1, [sp, #48] // 32-byte Folded Reload4474; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q04475; CHECK-GI-NEXT: ldr x30, [sp, #160] // 8-byte Reload4476; CHECK-GI-NEXT: ldp d9, d8, [sp, #144] // 16-byte Folded Reload4477; CHECK-GI-NEXT: ldp d11, d10, [sp, #128] // 16-byte Folded Reload4478; CHECK-GI-NEXT: mov v1.s[1], v2.s[0]4479; CHECK-GI-NEXT: ldp q2, q3, [sp, #16] // 32-byte Folded Reload4480; CHECK-GI-NEXT: ldp d13, d12, [sp, #112] // 16-byte Folded Reload4481; CHECK-GI-NEXT: mov v3.s[1], v2.s[0]4482; CHECK-GI-NEXT: ldr q2, [sp, #96] // 16-byte Reload4483; CHECK-GI-NEXT: mov v1.s[2], v2.s[0]4484; CHECK-GI-NEXT: ldr q2, [sp] // 16-byte Reload4485; CHECK-GI-NEXT: mov v3.s[2], v2.s[0]4486; CHECK-GI-NEXT: ldr q2, [sp, #80] // 16-byte Reload4487; CHECK-GI-NEXT: mov v1.s[3], v2.s[0]4488; CHECK-GI-NEXT: mov v3.s[3], v0.s[0]4489; CHECK-GI-NEXT: mov v2.16b, v1.16b4490; CHECK-GI-NEXT: mov v1.16b, v3.16b4491; CHECK-GI-NEXT: mov v0.16b, v2.16b4492; CHECK-GI-NEXT: add sp, sp, #1764493; CHECK-GI-NEXT: ret4494entry:4495 %c = call <8 x float> @llvm.log2.v8f32(<8 x float> %a)4496 ret <8 x float> %c4497}4498 4499define <7 x half> @log2_v7f16(<7 x half> %a) {4500; CHECK-SD-LABEL: log2_v7f16:4501; CHECK-SD: // %bb.0: // %entry4502; CHECK-SD-NEXT: sub sp, sp, #484503; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Spill4504; CHECK-SD-NEXT: .cfi_def_cfa_offset 484505; CHECK-SD-NEXT: .cfi_offset w30, -164506; CHECK-SD-NEXT: mov h1, v0.h[1]4507; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill4508; CHECK-SD-NEXT: fcvt s0, h14509; CHECK-SD-NEXT: bl log2f4510; CHECK-SD-NEXT: fcvt h0, s04511; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill4512; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload4513; CHECK-SD-NEXT: fcvt s0, h04514; CHECK-SD-NEXT: bl log2f4515; CHECK-SD-NEXT: fcvt h0, s04516; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload4517; CHECK-SD-NEXT: mov v0.h[1], v1.h[0]4518; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill4519; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload4520; CHECK-SD-NEXT: mov h0, v0.h[2]4521; CHECK-SD-NEXT: fcvt s0, h04522; CHECK-SD-NEXT: bl log2f4523; CHECK-SD-NEXT: fcvt h0, s04524; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload4525; CHECK-SD-NEXT: mov v1.h[2], v0.h[0]4526; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload4527; CHECK-SD-NEXT: mov h0, v0.h[3]4528; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill4529; CHECK-SD-NEXT: fcvt s0, h04530; CHECK-SD-NEXT: bl log2f4531; CHECK-SD-NEXT: fcvt h0, s04532; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload4533; CHECK-SD-NEXT: mov v1.h[3], v0.h[0]4534; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload4535; CHECK-SD-NEXT: mov h0, v0.h[4]4536; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill4537; CHECK-SD-NEXT: fcvt s0, h04538; CHECK-SD-NEXT: bl log2f4539; CHECK-SD-NEXT: fcvt h0, s04540; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload4541; CHECK-SD-NEXT: mov v1.h[4], v0.h[0]4542; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload4543; CHECK-SD-NEXT: mov h0, v0.h[5]4544; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill4545; CHECK-SD-NEXT: fcvt s0, h04546; CHECK-SD-NEXT: bl log2f4547; CHECK-SD-NEXT: fcvt h0, s04548; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload4549; CHECK-SD-NEXT: mov v1.h[5], v0.h[0]4550; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload4551; CHECK-SD-NEXT: mov h0, v0.h[6]4552; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill4553; CHECK-SD-NEXT: fcvt s0, h04554; CHECK-SD-NEXT: bl log2f4555; CHECK-SD-NEXT: fcvt h0, s04556; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload4557; CHECK-SD-NEXT: mov v1.h[6], v0.h[0]4558; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload4559; CHECK-SD-NEXT: mov h0, v0.h[7]4560; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill4561; CHECK-SD-NEXT: fcvt s0, h04562; CHECK-SD-NEXT: bl log2f4563; CHECK-SD-NEXT: fcvt h1, s04564; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload4565; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload4566; CHECK-SD-NEXT: mov v0.h[7], v1.h[0]4567; CHECK-SD-NEXT: add sp, sp, #484568; CHECK-SD-NEXT: ret4569;4570; CHECK-GI-LABEL: log2_v7f16:4571; CHECK-GI: // %bb.0: // %entry4572; CHECK-GI-NEXT: sub sp, sp, #1604573; CHECK-GI-NEXT: stp d13, d12, [sp, #96] // 16-byte Folded Spill4574; CHECK-GI-NEXT: stp d11, d10, [sp, #112] // 16-byte Folded Spill4575; CHECK-GI-NEXT: stp d9, d8, [sp, #128] // 16-byte Folded Spill4576; CHECK-GI-NEXT: str x30, [sp, #144] // 8-byte Spill4577; CHECK-GI-NEXT: .cfi_def_cfa_offset 1604578; CHECK-GI-NEXT: .cfi_offset w30, -164579; CHECK-GI-NEXT: .cfi_offset b8, -244580; CHECK-GI-NEXT: .cfi_offset b9, -324581; CHECK-GI-NEXT: .cfi_offset b10, -404582; CHECK-GI-NEXT: .cfi_offset b11, -484583; CHECK-GI-NEXT: .cfi_offset b12, -564584; CHECK-GI-NEXT: .cfi_offset b13, -644585; CHECK-GI-NEXT: mov h8, v0.h[1]4586; CHECK-GI-NEXT: mov h9, v0.h[2]4587; CHECK-GI-NEXT: mov h10, v0.h[3]4588; CHECK-GI-NEXT: mov h11, v0.h[4]4589; CHECK-GI-NEXT: mov h12, v0.h[5]4590; CHECK-GI-NEXT: mov h13, v0.h[6]4591; CHECK-GI-NEXT: fcvt s0, h04592; CHECK-GI-NEXT: bl log2f4593; CHECK-GI-NEXT: fcvt s1, h84594; CHECK-GI-NEXT: fcvt h0, s04595; CHECK-GI-NEXT: str q0, [sp, #80] // 16-byte Spill4596; CHECK-GI-NEXT: fmov s0, s14597; CHECK-GI-NEXT: bl log2f4598; CHECK-GI-NEXT: fcvt s1, h94599; CHECK-GI-NEXT: fcvt h0, s04600; CHECK-GI-NEXT: str q0, [sp, #48] // 16-byte Spill4601; CHECK-GI-NEXT: fmov s0, s14602; CHECK-GI-NEXT: bl log2f4603; CHECK-GI-NEXT: fcvt s1, h104604; CHECK-GI-NEXT: fcvt h0, s04605; CHECK-GI-NEXT: str q0, [sp, #64] // 16-byte Spill4606; CHECK-GI-NEXT: fmov s0, s14607; CHECK-GI-NEXT: bl log2f4608; CHECK-GI-NEXT: fcvt s1, h114609; CHECK-GI-NEXT: fcvt h0, s04610; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill4611; CHECK-GI-NEXT: fmov s0, s14612; CHECK-GI-NEXT: bl log2f4613; CHECK-GI-NEXT: fcvt s1, h124614; CHECK-GI-NEXT: fcvt h0, s04615; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill4616; CHECK-GI-NEXT: fmov s0, s14617; CHECK-GI-NEXT: bl log2f4618; CHECK-GI-NEXT: fcvt s1, h134619; CHECK-GI-NEXT: fcvt h0, s04620; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill4621; CHECK-GI-NEXT: fmov s0, s14622; CHECK-GI-NEXT: bl log2f4623; CHECK-GI-NEXT: ldp q3, q2, [sp, #48] // 32-byte Folded Reload4624; CHECK-GI-NEXT: fcvt h0, s04625; CHECK-GI-NEXT: ldr q1, [sp, #80] // 16-byte Reload4626; CHECK-GI-NEXT: ldp d9, d8, [sp, #128] // 16-byte Folded Reload4627; CHECK-GI-NEXT: ldp d11, d10, [sp, #112] // 16-byte Folded Reload4628; CHECK-GI-NEXT: ldr x30, [sp, #144] // 8-byte Reload4629; CHECK-GI-NEXT: mov v1.h[1], v3.h[0]4630; CHECK-GI-NEXT: ldp d13, d12, [sp, #96] // 16-byte Folded Reload4631; CHECK-GI-NEXT: mov v1.h[2], v2.h[0]4632; CHECK-GI-NEXT: ldp q2, q3, [sp, #16] // 32-byte Folded Reload4633; CHECK-GI-NEXT: mov v1.h[3], v3.h[0]4634; CHECK-GI-NEXT: mov v1.h[4], v2.h[0]4635; CHECK-GI-NEXT: ldr q2, [sp] // 16-byte Reload4636; CHECK-GI-NEXT: mov v1.h[5], v2.h[0]4637; CHECK-GI-NEXT: mov v1.h[6], v0.h[0]4638; CHECK-GI-NEXT: mov v0.16b, v1.16b4639; CHECK-GI-NEXT: add sp, sp, #1604640; CHECK-GI-NEXT: ret4641entry:4642 %c = call <7 x half> @llvm.log2.v7f16(<7 x half> %a)4643 ret <7 x half> %c4644}4645 4646define <4 x half> @log2_v4f16(<4 x half> %a) {4647; CHECK-SD-LABEL: log2_v4f16:4648; CHECK-SD: // %bb.0: // %entry4649; CHECK-SD-NEXT: sub sp, sp, #484650; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Spill4651; CHECK-SD-NEXT: .cfi_def_cfa_offset 484652; CHECK-SD-NEXT: .cfi_offset w30, -164653; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q04654; CHECK-SD-NEXT: mov h1, v0.h[1]4655; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill4656; CHECK-SD-NEXT: fcvt s0, h14657; CHECK-SD-NEXT: bl log2f4658; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload4659; CHECK-SD-NEXT: fcvt h0, s04660; CHECK-SD-NEXT: fcvt s1, h14661; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill4662; CHECK-SD-NEXT: fmov s0, s14663; CHECK-SD-NEXT: bl log2f4664; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload4665; CHECK-SD-NEXT: fcvt h2, s04666; CHECK-SD-NEXT: mov h1, v1.h[2]4667; CHECK-SD-NEXT: fcvt s0, h14668; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload4669; CHECK-SD-NEXT: mov v2.h[1], v1.h[0]4670; CHECK-SD-NEXT: str q2, [sp] // 16-byte Spill4671; CHECK-SD-NEXT: bl log2f4672; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload4673; CHECK-SD-NEXT: fcvt h2, s04674; CHECK-SD-NEXT: mov h1, v1.h[3]4675; CHECK-SD-NEXT: fcvt s0, h14676; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload4677; CHECK-SD-NEXT: mov v1.h[2], v2.h[0]4678; CHECK-SD-NEXT: str q1, [sp] // 16-byte Spill4679; CHECK-SD-NEXT: bl log2f4680; CHECK-SD-NEXT: fcvt h1, s04681; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload4682; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload4683; CHECK-SD-NEXT: mov v0.h[3], v1.h[0]4684; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q04685; CHECK-SD-NEXT: add sp, sp, #484686; CHECK-SD-NEXT: ret4687;4688; CHECK-GI-LABEL: log2_v4f16:4689; CHECK-GI: // %bb.0: // %entry4690; CHECK-GI-NEXT: sub sp, sp, #804691; CHECK-GI-NEXT: str d10, [sp, #48] // 8-byte Spill4692; CHECK-GI-NEXT: stp d9, d8, [sp, #56] // 16-byte Folded Spill4693; CHECK-GI-NEXT: str x30, [sp, #72] // 8-byte Spill4694; CHECK-GI-NEXT: .cfi_def_cfa_offset 804695; CHECK-GI-NEXT: .cfi_offset w30, -84696; CHECK-GI-NEXT: .cfi_offset b8, -164697; CHECK-GI-NEXT: .cfi_offset b9, -244698; CHECK-GI-NEXT: .cfi_offset b10, -324699; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q04700; CHECK-GI-NEXT: mov h8, v0.h[1]4701; CHECK-GI-NEXT: mov h9, v0.h[2]4702; CHECK-GI-NEXT: mov h10, v0.h[3]4703; CHECK-GI-NEXT: fcvt s0, h04704; CHECK-GI-NEXT: bl log2f4705; CHECK-GI-NEXT: fcvt s1, h84706; CHECK-GI-NEXT: fcvt h0, s04707; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill4708; CHECK-GI-NEXT: fmov s0, s14709; CHECK-GI-NEXT: bl log2f4710; CHECK-GI-NEXT: fcvt s1, h94711; CHECK-GI-NEXT: fcvt h0, s04712; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill4713; CHECK-GI-NEXT: fmov s0, s14714; CHECK-GI-NEXT: bl log2f4715; CHECK-GI-NEXT: fcvt s1, h104716; CHECK-GI-NEXT: fcvt h0, s04717; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill4718; CHECK-GI-NEXT: fmov s0, s14719; CHECK-GI-NEXT: bl log2f4720; CHECK-GI-NEXT: ldp q3, q2, [sp] // 32-byte Folded Reload4721; CHECK-GI-NEXT: fcvt h0, s04722; CHECK-GI-NEXT: ldr q1, [sp, #32] // 16-byte Reload4723; CHECK-GI-NEXT: ldp d9, d8, [sp, #56] // 16-byte Folded Reload4724; CHECK-GI-NEXT: ldr x30, [sp, #72] // 8-byte Reload4725; CHECK-GI-NEXT: ldr d10, [sp, #48] // 8-byte Reload4726; CHECK-GI-NEXT: mov v1.h[1], v3.h[0]4727; CHECK-GI-NEXT: mov v1.h[2], v2.h[0]4728; CHECK-GI-NEXT: mov v1.h[3], v0.h[0]4729; CHECK-GI-NEXT: mov v0.16b, v1.16b4730; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q04731; CHECK-GI-NEXT: add sp, sp, #804732; CHECK-GI-NEXT: ret4733entry:4734 %c = call <4 x half> @llvm.log2.v4f16(<4 x half> %a)4735 ret <4 x half> %c4736}4737 4738define <8 x half> @log2_v8f16(<8 x half> %a) {4739; CHECK-SD-LABEL: log2_v8f16:4740; CHECK-SD: // %bb.0: // %entry4741; CHECK-SD-NEXT: sub sp, sp, #484742; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Spill4743; CHECK-SD-NEXT: .cfi_def_cfa_offset 484744; CHECK-SD-NEXT: .cfi_offset w30, -164745; CHECK-SD-NEXT: mov h1, v0.h[1]4746; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill4747; CHECK-SD-NEXT: fcvt s0, h14748; CHECK-SD-NEXT: bl log2f4749; CHECK-SD-NEXT: fcvt h0, s04750; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill4751; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload4752; CHECK-SD-NEXT: fcvt s0, h04753; CHECK-SD-NEXT: bl log2f4754; CHECK-SD-NEXT: fcvt h0, s04755; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload4756; CHECK-SD-NEXT: mov v0.h[1], v1.h[0]4757; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill4758; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload4759; CHECK-SD-NEXT: mov h0, v0.h[2]4760; CHECK-SD-NEXT: fcvt s0, h04761; CHECK-SD-NEXT: bl log2f4762; CHECK-SD-NEXT: fcvt h0, s04763; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload4764; CHECK-SD-NEXT: mov v1.h[2], v0.h[0]4765; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload4766; CHECK-SD-NEXT: mov h0, v0.h[3]4767; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill4768; CHECK-SD-NEXT: fcvt s0, h04769; CHECK-SD-NEXT: bl log2f4770; CHECK-SD-NEXT: fcvt h0, s04771; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload4772; CHECK-SD-NEXT: mov v1.h[3], v0.h[0]4773; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload4774; CHECK-SD-NEXT: mov h0, v0.h[4]4775; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill4776; CHECK-SD-NEXT: fcvt s0, h04777; CHECK-SD-NEXT: bl log2f4778; CHECK-SD-NEXT: fcvt h0, s04779; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload4780; CHECK-SD-NEXT: mov v1.h[4], v0.h[0]4781; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload4782; CHECK-SD-NEXT: mov h0, v0.h[5]4783; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill4784; CHECK-SD-NEXT: fcvt s0, h04785; CHECK-SD-NEXT: bl log2f4786; CHECK-SD-NEXT: fcvt h0, s04787; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload4788; CHECK-SD-NEXT: mov v1.h[5], v0.h[0]4789; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload4790; CHECK-SD-NEXT: mov h0, v0.h[6]4791; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill4792; CHECK-SD-NEXT: fcvt s0, h04793; CHECK-SD-NEXT: bl log2f4794; CHECK-SD-NEXT: fcvt h0, s04795; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload4796; CHECK-SD-NEXT: mov v1.h[6], v0.h[0]4797; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload4798; CHECK-SD-NEXT: mov h0, v0.h[7]4799; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill4800; CHECK-SD-NEXT: fcvt s0, h04801; CHECK-SD-NEXT: bl log2f4802; CHECK-SD-NEXT: fcvt h1, s04803; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload4804; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload4805; CHECK-SD-NEXT: mov v0.h[7], v1.h[0]4806; CHECK-SD-NEXT: add sp, sp, #484807; CHECK-SD-NEXT: ret4808;4809; CHECK-GI-LABEL: log2_v8f16:4810; CHECK-GI: // %bb.0: // %entry4811; CHECK-GI-NEXT: sub sp, sp, #1764812; CHECK-GI-NEXT: str d14, [sp, #112] // 8-byte Spill4813; CHECK-GI-NEXT: stp d13, d12, [sp, #120] // 16-byte Folded Spill4814; CHECK-GI-NEXT: stp d11, d10, [sp, #136] // 16-byte Folded Spill4815; CHECK-GI-NEXT: stp d9, d8, [sp, #152] // 16-byte Folded Spill4816; CHECK-GI-NEXT: str x30, [sp, #168] // 8-byte Spill4817; CHECK-GI-NEXT: .cfi_def_cfa_offset 1764818; CHECK-GI-NEXT: .cfi_offset w30, -84819; CHECK-GI-NEXT: .cfi_offset b8, -164820; CHECK-GI-NEXT: .cfi_offset b9, -244821; CHECK-GI-NEXT: .cfi_offset b10, -324822; CHECK-GI-NEXT: .cfi_offset b11, -404823; CHECK-GI-NEXT: .cfi_offset b12, -484824; CHECK-GI-NEXT: .cfi_offset b13, -564825; CHECK-GI-NEXT: .cfi_offset b14, -644826; CHECK-GI-NEXT: mov h8, v0.h[1]4827; CHECK-GI-NEXT: mov h9, v0.h[2]4828; CHECK-GI-NEXT: mov h10, v0.h[3]4829; CHECK-GI-NEXT: mov h11, v0.h[4]4830; CHECK-GI-NEXT: mov h12, v0.h[5]4831; CHECK-GI-NEXT: mov h13, v0.h[6]4832; CHECK-GI-NEXT: mov h14, v0.h[7]4833; CHECK-GI-NEXT: fcvt s0, h04834; CHECK-GI-NEXT: bl log2f4835; CHECK-GI-NEXT: fcvt s1, h84836; CHECK-GI-NEXT: fcvt h0, s04837; CHECK-GI-NEXT: str q0, [sp, #96] // 16-byte Spill4838; CHECK-GI-NEXT: fmov s0, s14839; CHECK-GI-NEXT: bl log2f4840; CHECK-GI-NEXT: fcvt s1, h94841; CHECK-GI-NEXT: fcvt h0, s04842; CHECK-GI-NEXT: str q0, [sp, #64] // 16-byte Spill4843; CHECK-GI-NEXT: fmov s0, s14844; CHECK-GI-NEXT: bl log2f4845; CHECK-GI-NEXT: fcvt s1, h104846; CHECK-GI-NEXT: fcvt h0, s04847; CHECK-GI-NEXT: str q0, [sp, #80] // 16-byte Spill4848; CHECK-GI-NEXT: fmov s0, s14849; CHECK-GI-NEXT: bl log2f4850; CHECK-GI-NEXT: fcvt s1, h114851; CHECK-GI-NEXT: fcvt h0, s04852; CHECK-GI-NEXT: str q0, [sp, #48] // 16-byte Spill4853; CHECK-GI-NEXT: fmov s0, s14854; CHECK-GI-NEXT: bl log2f4855; CHECK-GI-NEXT: fcvt s1, h124856; CHECK-GI-NEXT: fcvt h0, s04857; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill4858; CHECK-GI-NEXT: fmov s0, s14859; CHECK-GI-NEXT: bl log2f4860; CHECK-GI-NEXT: fcvt s1, h134861; CHECK-GI-NEXT: fcvt h0, s04862; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill4863; CHECK-GI-NEXT: fmov s0, s14864; CHECK-GI-NEXT: bl log2f4865; CHECK-GI-NEXT: fcvt s1, h144866; CHECK-GI-NEXT: fcvt h0, s04867; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill4868; CHECK-GI-NEXT: fmov s0, s14869; CHECK-GI-NEXT: bl log2f4870; CHECK-GI-NEXT: ldp q3, q2, [sp, #64] // 32-byte Folded Reload4871; CHECK-GI-NEXT: fcvt h0, s04872; CHECK-GI-NEXT: ldr q1, [sp, #96] // 16-byte Reload4873; CHECK-GI-NEXT: ldp d9, d8, [sp, #152] // 16-byte Folded Reload4874; CHECK-GI-NEXT: ldp d11, d10, [sp, #136] // 16-byte Folded Reload4875; CHECK-GI-NEXT: ldr x30, [sp, #168] // 8-byte Reload4876; CHECK-GI-NEXT: mov v1.h[1], v3.h[0]4877; CHECK-GI-NEXT: ldr d14, [sp, #112] // 8-byte Reload4878; CHECK-GI-NEXT: ldp d13, d12, [sp, #120] // 16-byte Folded Reload4879; CHECK-GI-NEXT: mov v1.h[2], v2.h[0]4880; CHECK-GI-NEXT: ldp q2, q3, [sp, #32] // 32-byte Folded Reload4881; CHECK-GI-NEXT: mov v1.h[3], v3.h[0]4882; CHECK-GI-NEXT: mov v1.h[4], v2.h[0]4883; CHECK-GI-NEXT: ldp q2, q3, [sp] // 32-byte Folded Reload4884; CHECK-GI-NEXT: mov v1.h[5], v3.h[0]4885; CHECK-GI-NEXT: mov v1.h[6], v2.h[0]4886; CHECK-GI-NEXT: mov v1.h[7], v0.h[0]4887; CHECK-GI-NEXT: mov v0.16b, v1.16b4888; CHECK-GI-NEXT: add sp, sp, #1764889; CHECK-GI-NEXT: ret4890entry:4891 %c = call <8 x half> @llvm.log2.v8f16(<8 x half> %a)4892 ret <8 x half> %c4893}4894 4895define <16 x half> @log2_v16f16(<16 x half> %a) {4896; CHECK-SD-LABEL: log2_v16f16:4897; CHECK-SD: // %bb.0: // %entry4898; CHECK-SD-NEXT: sub sp, sp, #644899; CHECK-SD-NEXT: str x30, [sp, #48] // 8-byte Spill4900; CHECK-SD-NEXT: .cfi_def_cfa_offset 644901; CHECK-SD-NEXT: .cfi_offset w30, -164902; CHECK-SD-NEXT: stp q1, q0, [sp] // 32-byte Folded Spill4903; CHECK-SD-NEXT: mov h1, v0.h[1]4904; CHECK-SD-NEXT: fcvt s0, h14905; CHECK-SD-NEXT: bl log2f4906; CHECK-SD-NEXT: fcvt h0, s04907; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Spill4908; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload4909; CHECK-SD-NEXT: fcvt s0, h04910; CHECK-SD-NEXT: bl log2f4911; CHECK-SD-NEXT: fcvt h0, s04912; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload4913; CHECK-SD-NEXT: mov v0.h[1], v1.h[0]4914; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Spill4915; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload4916; CHECK-SD-NEXT: mov h0, v0.h[2]4917; CHECK-SD-NEXT: fcvt s0, h04918; CHECK-SD-NEXT: bl log2f4919; CHECK-SD-NEXT: fcvt h0, s04920; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload4921; CHECK-SD-NEXT: mov v1.h[2], v0.h[0]4922; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload4923; CHECK-SD-NEXT: mov h0, v0.h[3]4924; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill4925; CHECK-SD-NEXT: fcvt s0, h04926; CHECK-SD-NEXT: bl log2f4927; CHECK-SD-NEXT: fcvt h0, s04928; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload4929; CHECK-SD-NEXT: mov v1.h[3], v0.h[0]4930; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload4931; CHECK-SD-NEXT: mov h0, v0.h[4]4932; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill4933; CHECK-SD-NEXT: fcvt s0, h04934; CHECK-SD-NEXT: bl log2f4935; CHECK-SD-NEXT: fcvt h0, s04936; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload4937; CHECK-SD-NEXT: mov v1.h[4], v0.h[0]4938; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload4939; CHECK-SD-NEXT: mov h0, v0.h[5]4940; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill4941; CHECK-SD-NEXT: fcvt s0, h04942; CHECK-SD-NEXT: bl log2f4943; CHECK-SD-NEXT: fcvt h0, s04944; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload4945; CHECK-SD-NEXT: mov v1.h[5], v0.h[0]4946; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload4947; CHECK-SD-NEXT: mov h0, v0.h[6]4948; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill4949; CHECK-SD-NEXT: fcvt s0, h04950; CHECK-SD-NEXT: bl log2f4951; CHECK-SD-NEXT: fcvt h0, s04952; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload4953; CHECK-SD-NEXT: mov v1.h[6], v0.h[0]4954; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload4955; CHECK-SD-NEXT: mov h0, v0.h[7]4956; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill4957; CHECK-SD-NEXT: fcvt s0, h04958; CHECK-SD-NEXT: bl log2f4959; CHECK-SD-NEXT: fcvt h0, s04960; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload4961; CHECK-SD-NEXT: mov v1.h[7], v0.h[0]4962; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload4963; CHECK-SD-NEXT: mov h0, v0.h[1]4964; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill4965; CHECK-SD-NEXT: fcvt s0, h04966; CHECK-SD-NEXT: bl log2f4967; CHECK-SD-NEXT: fcvt h0, s04968; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill4969; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload4970; CHECK-SD-NEXT: fcvt s0, h04971; CHECK-SD-NEXT: bl log2f4972; CHECK-SD-NEXT: fcvt h0, s04973; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload4974; CHECK-SD-NEXT: mov v0.h[1], v1.h[0]4975; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill4976; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload4977; CHECK-SD-NEXT: mov h0, v0.h[2]4978; CHECK-SD-NEXT: fcvt s0, h04979; CHECK-SD-NEXT: bl log2f4980; CHECK-SD-NEXT: fcvt h0, s04981; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload4982; CHECK-SD-NEXT: mov v1.h[2], v0.h[0]4983; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload4984; CHECK-SD-NEXT: mov h0, v0.h[3]4985; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill4986; CHECK-SD-NEXT: fcvt s0, h04987; CHECK-SD-NEXT: bl log2f4988; CHECK-SD-NEXT: fcvt h0, s04989; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload4990; CHECK-SD-NEXT: mov v1.h[3], v0.h[0]4991; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload4992; CHECK-SD-NEXT: mov h0, v0.h[4]4993; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill4994; CHECK-SD-NEXT: fcvt s0, h04995; CHECK-SD-NEXT: bl log2f4996; CHECK-SD-NEXT: fcvt h0, s04997; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload4998; CHECK-SD-NEXT: mov v1.h[4], v0.h[0]4999; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload5000; CHECK-SD-NEXT: mov h0, v0.h[5]5001; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill5002; CHECK-SD-NEXT: fcvt s0, h05003; CHECK-SD-NEXT: bl log2f5004; CHECK-SD-NEXT: fcvt h0, s05005; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload5006; CHECK-SD-NEXT: mov v1.h[5], v0.h[0]5007; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload5008; CHECK-SD-NEXT: mov h0, v0.h[6]5009; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill5010; CHECK-SD-NEXT: fcvt s0, h05011; CHECK-SD-NEXT: bl log2f5012; CHECK-SD-NEXT: fcvt h0, s05013; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload5014; CHECK-SD-NEXT: mov v1.h[6], v0.h[0]5015; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload5016; CHECK-SD-NEXT: mov h0, v0.h[7]5017; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill5018; CHECK-SD-NEXT: fcvt s0, h05019; CHECK-SD-NEXT: bl log2f5020; CHECK-SD-NEXT: fmov s1, s05021; CHECK-SD-NEXT: ldr x30, [sp, #48] // 8-byte Reload5022; CHECK-SD-NEXT: fcvt h2, s15023; CHECK-SD-NEXT: ldp q1, q0, [sp, #16] // 32-byte Folded Reload5024; CHECK-SD-NEXT: mov v1.h[7], v2.h[0]5025; CHECK-SD-NEXT: add sp, sp, #645026; CHECK-SD-NEXT: ret5027;5028; CHECK-GI-LABEL: log2_v16f16:5029; CHECK-GI: // %bb.0: // %entry5030; CHECK-GI-NEXT: sub sp, sp, #3205031; CHECK-GI-NEXT: stp d15, d14, [sp, #240] // 16-byte Folded Spill5032; CHECK-GI-NEXT: stp d13, d12, [sp, #256] // 16-byte Folded Spill5033; CHECK-GI-NEXT: stp d11, d10, [sp, #272] // 16-byte Folded Spill5034; CHECK-GI-NEXT: stp d9, d8, [sp, #288] // 16-byte Folded Spill5035; CHECK-GI-NEXT: stp x29, x30, [sp, #304] // 16-byte Folded Spill5036; CHECK-GI-NEXT: .cfi_def_cfa_offset 3205037; CHECK-GI-NEXT: .cfi_offset w30, -85038; CHECK-GI-NEXT: .cfi_offset w29, -165039; CHECK-GI-NEXT: .cfi_offset b8, -245040; CHECK-GI-NEXT: .cfi_offset b9, -325041; CHECK-GI-NEXT: .cfi_offset b10, -405042; CHECK-GI-NEXT: .cfi_offset b11, -485043; CHECK-GI-NEXT: .cfi_offset b12, -565044; CHECK-GI-NEXT: .cfi_offset b13, -645045; CHECK-GI-NEXT: .cfi_offset b14, -725046; CHECK-GI-NEXT: .cfi_offset b15, -805047; CHECK-GI-NEXT: mov v2.16b, v1.16b5048; CHECK-GI-NEXT: str q1, [sp, #80] // 16-byte Spill5049; CHECK-GI-NEXT: mov h14, v1.h[1]5050; CHECK-GI-NEXT: mov h1, v1.h[2]5051; CHECK-GI-NEXT: mov h15, v0.h[1]5052; CHECK-GI-NEXT: mov h8, v0.h[2]5053; CHECK-GI-NEXT: mov h9, v0.h[3]5054; CHECK-GI-NEXT: mov h10, v0.h[4]5055; CHECK-GI-NEXT: mov h11, v0.h[5]5056; CHECK-GI-NEXT: mov h12, v0.h[6]5057; CHECK-GI-NEXT: mov h13, v0.h[7]5058; CHECK-GI-NEXT: fcvt s0, h05059; CHECK-GI-NEXT: str h1, [sp, #16] // 2-byte Spill5060; CHECK-GI-NEXT: mov h1, v2.h[3]5061; CHECK-GI-NEXT: str h1, [sp, #32] // 2-byte Spill5062; CHECK-GI-NEXT: mov h1, v2.h[4]5063; CHECK-GI-NEXT: str h1, [sp, #48] // 2-byte Spill5064; CHECK-GI-NEXT: mov h1, v2.h[5]5065; CHECK-GI-NEXT: str h1, [sp, #64] // 2-byte Spill5066; CHECK-GI-NEXT: mov h1, v2.h[6]5067; CHECK-GI-NEXT: str h1, [sp, #96] // 2-byte Spill5068; CHECK-GI-NEXT: mov h1, v2.h[7]5069; CHECK-GI-NEXT: str h1, [sp, #160] // 2-byte Spill5070; CHECK-GI-NEXT: bl log2f5071; CHECK-GI-NEXT: fcvt s1, h155072; CHECK-GI-NEXT: fcvt h0, s05073; CHECK-GI-NEXT: str q0, [sp, #192] // 16-byte Spill5074; CHECK-GI-NEXT: fmov s0, s15075; CHECK-GI-NEXT: bl log2f5076; CHECK-GI-NEXT: fcvt s1, h85077; CHECK-GI-NEXT: fcvt h0, s05078; CHECK-GI-NEXT: str q0, [sp, #112] // 16-byte Spill5079; CHECK-GI-NEXT: fmov s0, s15080; CHECK-GI-NEXT: bl log2f5081; CHECK-GI-NEXT: fcvt s1, h95082; CHECK-GI-NEXT: fcvt h0, s05083; CHECK-GI-NEXT: str q0, [sp, #224] // 16-byte Spill5084; CHECK-GI-NEXT: fmov s0, s15085; CHECK-GI-NEXT: bl log2f5086; CHECK-GI-NEXT: fcvt s1, h105087; CHECK-GI-NEXT: fcvt h0, s05088; CHECK-GI-NEXT: str q0, [sp, #208] // 16-byte Spill5089; CHECK-GI-NEXT: fmov s0, s15090; CHECK-GI-NEXT: bl log2f5091; CHECK-GI-NEXT: fcvt s1, h115092; CHECK-GI-NEXT: fcvt h0, s05093; CHECK-GI-NEXT: str q0, [sp, #176] // 16-byte Spill5094; CHECK-GI-NEXT: fmov s0, s15095; CHECK-GI-NEXT: bl log2f5096; CHECK-GI-NEXT: fcvt s1, h125097; CHECK-GI-NEXT: fcvt h0, s05098; CHECK-GI-NEXT: str q0, [sp, #144] // 16-byte Spill5099; CHECK-GI-NEXT: fmov s0, s15100; CHECK-GI-NEXT: bl log2f5101; CHECK-GI-NEXT: fcvt s1, h135102; CHECK-GI-NEXT: fcvt h0, s05103; CHECK-GI-NEXT: str q0, [sp, #128] // 16-byte Spill5104; CHECK-GI-NEXT: fmov s0, s15105; CHECK-GI-NEXT: bl log2f5106; CHECK-GI-NEXT: ldr q1, [sp, #80] // 16-byte Reload5107; CHECK-GI-NEXT: fcvt h0, s05108; CHECK-GI-NEXT: fcvt s1, h15109; CHECK-GI-NEXT: str q0, [sp, #80] // 16-byte Spill5110; CHECK-GI-NEXT: fmov s0, s15111; CHECK-GI-NEXT: bl log2f5112; CHECK-GI-NEXT: fcvt s1, h145113; CHECK-GI-NEXT: fcvt h0, s05114; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill5115; CHECK-GI-NEXT: fmov s0, s15116; CHECK-GI-NEXT: bl log2f5117; CHECK-GI-NEXT: ldr h1, [sp, #16] // 2-byte Reload5118; CHECK-GI-NEXT: fcvt h0, s05119; CHECK-GI-NEXT: fcvt s1, h15120; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill5121; CHECK-GI-NEXT: fmov s0, s15122; CHECK-GI-NEXT: bl log2f5123; CHECK-GI-NEXT: ldr h1, [sp, #32] // 2-byte Reload5124; CHECK-GI-NEXT: fcvt h0, s05125; CHECK-GI-NEXT: fcvt s1, h15126; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill5127; CHECK-GI-NEXT: fmov s0, s15128; CHECK-GI-NEXT: bl log2f5129; CHECK-GI-NEXT: ldr h1, [sp, #48] // 2-byte Reload5130; CHECK-GI-NEXT: fcvt h0, s05131; CHECK-GI-NEXT: fcvt s1, h15132; CHECK-GI-NEXT: str q0, [sp, #48] // 16-byte Spill5133; CHECK-GI-NEXT: fmov s0, s15134; CHECK-GI-NEXT: bl log2f5135; CHECK-GI-NEXT: ldr h1, [sp, #64] // 2-byte Reload5136; CHECK-GI-NEXT: fcvt h0, s05137; CHECK-GI-NEXT: fcvt s1, h15138; CHECK-GI-NEXT: str q0, [sp, #64] // 16-byte Spill5139; CHECK-GI-NEXT: fmov s0, s15140; CHECK-GI-NEXT: bl log2f5141; CHECK-GI-NEXT: ldr h1, [sp, #96] // 2-byte Reload5142; CHECK-GI-NEXT: fcvt h0, s05143; CHECK-GI-NEXT: fcvt s1, h15144; CHECK-GI-NEXT: str q0, [sp, #96] // 16-byte Spill5145; CHECK-GI-NEXT: fmov s0, s15146; CHECK-GI-NEXT: bl log2f5147; CHECK-GI-NEXT: ldr h1, [sp, #160] // 2-byte Reload5148; CHECK-GI-NEXT: fcvt h0, s05149; CHECK-GI-NEXT: fcvt s1, h15150; CHECK-GI-NEXT: str q0, [sp, #160] // 16-byte Spill5151; CHECK-GI-NEXT: fmov s0, s15152; CHECK-GI-NEXT: bl log2f5153; CHECK-GI-NEXT: ldr q3, [sp, #192] // 16-byte Reload5154; CHECK-GI-NEXT: ldr q2, [sp, #112] // 16-byte Reload5155; CHECK-GI-NEXT: ldp x29, x30, [sp, #304] // 16-byte Folded Reload5156; CHECK-GI-NEXT: mov v3.h[1], v2.h[0]5157; CHECK-GI-NEXT: ldp q1, q2, [sp] // 32-byte Folded Reload5158; CHECK-GI-NEXT: ldp d9, d8, [sp, #288] // 16-byte Folded Reload5159; CHECK-GI-NEXT: ldp d11, d10, [sp, #272] // 16-byte Folded Reload5160; CHECK-GI-NEXT: mov v1.h[1], v2.h[0]5161; CHECK-GI-NEXT: ldr q2, [sp, #224] // 16-byte Reload5162; CHECK-GI-NEXT: ldp d13, d12, [sp, #256] // 16-byte Folded Reload5163; CHECK-GI-NEXT: mov v3.h[2], v2.h[0]5164; CHECK-GI-NEXT: ldr q2, [sp, #32] // 16-byte Reload5165; CHECK-GI-NEXT: ldp d15, d14, [sp, #240] // 16-byte Folded Reload5166; CHECK-GI-NEXT: mov v1.h[2], v2.h[0]5167; CHECK-GI-NEXT: ldr q2, [sp, #208] // 16-byte Reload5168; CHECK-GI-NEXT: mov v3.h[3], v2.h[0]5169; CHECK-GI-NEXT: ldr q2, [sp, #48] // 16-byte Reload5170; CHECK-GI-NEXT: mov v1.h[3], v2.h[0]5171; CHECK-GI-NEXT: ldr q2, [sp, #176] // 16-byte Reload5172; CHECK-GI-NEXT: mov v3.h[4], v2.h[0]5173; CHECK-GI-NEXT: ldr q2, [sp, #64] // 16-byte Reload5174; CHECK-GI-NEXT: mov v1.h[4], v2.h[0]5175; CHECK-GI-NEXT: ldr q2, [sp, #144] // 16-byte Reload5176; CHECK-GI-NEXT: mov v3.h[5], v2.h[0]5177; CHECK-GI-NEXT: ldr q2, [sp, #96] // 16-byte Reload5178; CHECK-GI-NEXT: mov v1.h[5], v2.h[0]5179; CHECK-GI-NEXT: fcvt h2, s05180; CHECK-GI-NEXT: ldr q0, [sp, #128] // 16-byte Reload5181; CHECK-GI-NEXT: mov v3.h[6], v0.h[0]5182; CHECK-GI-NEXT: ldr q0, [sp, #160] // 16-byte Reload5183; CHECK-GI-NEXT: mov v1.h[6], v0.h[0]5184; CHECK-GI-NEXT: ldr q0, [sp, #80] // 16-byte Reload5185; CHECK-GI-NEXT: mov v3.h[7], v0.h[0]5186; CHECK-GI-NEXT: mov v1.h[7], v2.h[0]5187; CHECK-GI-NEXT: mov v0.16b, v3.16b5188; CHECK-GI-NEXT: add sp, sp, #3205189; CHECK-GI-NEXT: ret5190entry:5191 %c = call <16 x half> @llvm.log2.v16f16(<16 x half> %a)5192 ret <16 x half> %c5193}5194 5195define <2 x fp128> @log2_v2fp128(<2 x fp128> %a) {5196; CHECK-LABEL: log2_v2fp128:5197; CHECK: // %bb.0: // %entry5198; CHECK-NEXT: sub sp, sp, #485199; CHECK-NEXT: str x30, [sp, #32] // 8-byte Spill5200; CHECK-NEXT: .cfi_def_cfa_offset 485201; CHECK-NEXT: .cfi_offset w30, -165202; CHECK-NEXT: str q1, [sp, #16] // 16-byte Spill5203; CHECK-NEXT: bl log2l5204; CHECK-NEXT: str q0, [sp] // 16-byte Spill5205; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload5206; CHECK-NEXT: bl log2l5207; CHECK-NEXT: mov v1.16b, v0.16b5208; CHECK-NEXT: ldr q0, [sp] // 16-byte Reload5209; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Reload5210; CHECK-NEXT: add sp, sp, #485211; CHECK-NEXT: ret5212entry:5213 %c = call <2 x fp128> @llvm.log2.v2fp128(<2 x fp128> %a)5214 ret <2 x fp128> %c5215}5216 5217define double @log10_f64(double %a) {5218; CHECK-LABEL: log10_f64:5219; CHECK: // %bb.0: // %entry5220; CHECK-NEXT: b log105221entry:5222 %c = call double @llvm.log10.f64(double %a)5223 ret double %c5224}5225 5226define float @log10_f32(float %a) {5227; CHECK-LABEL: log10_f32:5228; CHECK: // %bb.0: // %entry5229; CHECK-NEXT: b log10f5230entry:5231 %c = call float @llvm.log10.f32(float %a)5232 ret float %c5233}5234 5235define half @log10_f16(half %a) {5236; CHECK-LABEL: log10_f16:5237; CHECK: // %bb.0: // %entry5238; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill5239; CHECK-NEXT: .cfi_def_cfa_offset 165240; CHECK-NEXT: .cfi_offset w30, -165241; CHECK-NEXT: fcvt s0, h05242; CHECK-NEXT: bl log10f5243; CHECK-NEXT: fcvt h0, s05244; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload5245; CHECK-NEXT: ret5246entry:5247 %c = call half @llvm.log10.f16(half %a)5248 ret half %c5249}5250 5251define fp128 @log10_fp128(fp128 %a) {5252; CHECK-LABEL: log10_fp128:5253; CHECK: // %bb.0: // %entry5254; CHECK-NEXT: b log10l5255entry:5256 %c = call fp128 @llvm.log10.fp128(fp128 %a)5257 ret fp128 %c5258}5259 5260define <1 x double> @log10_v1f64(<1 x double> %a) {5261; CHECK-LABEL: log10_v1f64:5262; CHECK: // %bb.0: // %entry5263; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill5264; CHECK-NEXT: .cfi_def_cfa_offset 165265; CHECK-NEXT: .cfi_offset w30, -165266; CHECK-NEXT: bl log105267; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload5268; CHECK-NEXT: ret5269entry:5270 %c = call <1 x double> @llvm.log10.v1f64(<1 x double> %a)5271 ret <1 x double> %c5272}5273 5274define <2 x double> @log10_v2f64(<2 x double> %a) {5275; CHECK-SD-LABEL: log10_v2f64:5276; CHECK-SD: // %bb.0: // %entry5277; CHECK-SD-NEXT: sub sp, sp, #485278; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Spill5279; CHECK-SD-NEXT: .cfi_def_cfa_offset 485280; CHECK-SD-NEXT: .cfi_offset w30, -165281; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill5282; CHECK-SD-NEXT: mov d0, v0.d[1]5283; CHECK-SD-NEXT: bl log105284; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q05285; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill5286; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload5287; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q05288; CHECK-SD-NEXT: bl log105289; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload5290; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q05291; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload5292; CHECK-SD-NEXT: mov v0.d[1], v1.d[0]5293; CHECK-SD-NEXT: add sp, sp, #485294; CHECK-SD-NEXT: ret5295;5296; CHECK-GI-LABEL: log10_v2f64:5297; CHECK-GI: // %bb.0: // %entry5298; CHECK-GI-NEXT: sub sp, sp, #325299; CHECK-GI-NEXT: str d8, [sp, #16] // 8-byte Spill5300; CHECK-GI-NEXT: str x30, [sp, #24] // 8-byte Spill5301; CHECK-GI-NEXT: .cfi_def_cfa_offset 325302; CHECK-GI-NEXT: .cfi_offset w30, -85303; CHECK-GI-NEXT: .cfi_offset b8, -165304; CHECK-GI-NEXT: mov d8, v0.d[1]5305; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q05306; CHECK-GI-NEXT: bl log105307; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q05308; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill5309; CHECK-GI-NEXT: fmov d0, d85310; CHECK-GI-NEXT: bl log105311; CHECK-GI-NEXT: ldr q1, [sp] // 16-byte Reload5312; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q05313; CHECK-GI-NEXT: ldr x30, [sp, #24] // 8-byte Reload5314; CHECK-GI-NEXT: ldr d8, [sp, #16] // 8-byte Reload5315; CHECK-GI-NEXT: mov v1.d[1], v0.d[0]5316; CHECK-GI-NEXT: mov v0.16b, v1.16b5317; CHECK-GI-NEXT: add sp, sp, #325318; CHECK-GI-NEXT: ret5319entry:5320 %c = call <2 x double> @llvm.log10.v2f64(<2 x double> %a)5321 ret <2 x double> %c5322}5323 5324define <3 x double> @log10_v3f64(<3 x double> %a) {5325; CHECK-SD-LABEL: log10_v3f64:5326; CHECK-SD: // %bb.0: // %entry5327; CHECK-SD-NEXT: str d10, [sp, #-32]! // 8-byte Folded Spill5328; CHECK-SD-NEXT: stp d9, d8, [sp, #8] // 16-byte Folded Spill5329; CHECK-SD-NEXT: str x30, [sp, #24] // 8-byte Spill5330; CHECK-SD-NEXT: .cfi_def_cfa_offset 325331; CHECK-SD-NEXT: .cfi_offset w30, -85332; CHECK-SD-NEXT: .cfi_offset b8, -165333; CHECK-SD-NEXT: .cfi_offset b9, -245334; CHECK-SD-NEXT: .cfi_offset b10, -325335; CHECK-SD-NEXT: fmov d8, d25336; CHECK-SD-NEXT: fmov d9, d15337; CHECK-SD-NEXT: bl log105338; CHECK-SD-NEXT: fmov d10, d05339; CHECK-SD-NEXT: fmov d0, d95340; CHECK-SD-NEXT: bl log105341; CHECK-SD-NEXT: fmov d9, d05342; CHECK-SD-NEXT: fmov d0, d85343; CHECK-SD-NEXT: bl log105344; CHECK-SD-NEXT: fmov d1, d95345; CHECK-SD-NEXT: ldp d9, d8, [sp, #8] // 16-byte Folded Reload5346; CHECK-SD-NEXT: ldr x30, [sp, #24] // 8-byte Reload5347; CHECK-SD-NEXT: fmov d2, d05348; CHECK-SD-NEXT: fmov d0, d105349; CHECK-SD-NEXT: ldr d10, [sp], #32 // 8-byte Folded Reload5350; CHECK-SD-NEXT: ret5351;5352; CHECK-GI-LABEL: log10_v3f64:5353; CHECK-GI: // %bb.0: // %entry5354; CHECK-GI-NEXT: str d10, [sp, #-32]! // 8-byte Folded Spill5355; CHECK-GI-NEXT: stp d9, d8, [sp, #8] // 16-byte Folded Spill5356; CHECK-GI-NEXT: str x30, [sp, #24] // 8-byte Spill5357; CHECK-GI-NEXT: .cfi_def_cfa_offset 325358; CHECK-GI-NEXT: .cfi_offset w30, -85359; CHECK-GI-NEXT: .cfi_offset b8, -165360; CHECK-GI-NEXT: .cfi_offset b9, -245361; CHECK-GI-NEXT: .cfi_offset b10, -325362; CHECK-GI-NEXT: fmov d8, d15363; CHECK-GI-NEXT: fmov d9, d25364; CHECK-GI-NEXT: bl log105365; CHECK-GI-NEXT: fmov d10, d05366; CHECK-GI-NEXT: fmov d0, d85367; CHECK-GI-NEXT: bl log105368; CHECK-GI-NEXT: fmov d8, d05369; CHECK-GI-NEXT: fmov d0, d95370; CHECK-GI-NEXT: bl log105371; CHECK-GI-NEXT: fmov d1, d85372; CHECK-GI-NEXT: ldp d9, d8, [sp, #8] // 16-byte Folded Reload5373; CHECK-GI-NEXT: ldr x30, [sp, #24] // 8-byte Reload5374; CHECK-GI-NEXT: fmov d2, d05375; CHECK-GI-NEXT: fmov d0, d105376; CHECK-GI-NEXT: ldr d10, [sp], #32 // 8-byte Folded Reload5377; CHECK-GI-NEXT: ret5378entry:5379 %c = call <3 x double> @llvm.log10.v3f64(<3 x double> %a)5380 ret <3 x double> %c5381}5382 5383define <4 x double> @log10_v4f64(<4 x double> %a) {5384; CHECK-SD-LABEL: log10_v4f64:5385; CHECK-SD: // %bb.0: // %entry5386; CHECK-SD-NEXT: sub sp, sp, #645387; CHECK-SD-NEXT: str x30, [sp, #48] // 8-byte Spill5388; CHECK-SD-NEXT: .cfi_def_cfa_offset 645389; CHECK-SD-NEXT: .cfi_offset w30, -165390; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill5391; CHECK-SD-NEXT: mov d0, v0.d[1]5392; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill5393; CHECK-SD-NEXT: bl log105394; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q05395; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill5396; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload5397; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q05398; CHECK-SD-NEXT: bl log105399; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload5400; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q05401; CHECK-SD-NEXT: mov v0.d[1], v1.d[0]5402; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill5403; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Reload5404; CHECK-SD-NEXT: mov d0, v0.d[1]5405; CHECK-SD-NEXT: bl log105406; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q05407; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill5408; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Reload5409; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q05410; CHECK-SD-NEXT: bl log105411; CHECK-SD-NEXT: fmov d1, d05412; CHECK-SD-NEXT: ldp q2, q0, [sp] // 32-byte Folded Reload5413; CHECK-SD-NEXT: ldr x30, [sp, #48] // 8-byte Reload5414; CHECK-SD-NEXT: mov v1.d[1], v2.d[0]5415; CHECK-SD-NEXT: add sp, sp, #645416; CHECK-SD-NEXT: ret5417;5418; CHECK-GI-LABEL: log10_v4f64:5419; CHECK-GI: // %bb.0: // %entry5420; CHECK-GI-NEXT: sub sp, sp, #805421; CHECK-GI-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill5422; CHECK-GI-NEXT: str x30, [sp, #64] // 8-byte Spill5423; CHECK-GI-NEXT: .cfi_def_cfa_offset 805424; CHECK-GI-NEXT: .cfi_offset w30, -165425; CHECK-GI-NEXT: .cfi_offset b8, -245426; CHECK-GI-NEXT: .cfi_offset b9, -325427; CHECK-GI-NEXT: str q1, [sp] // 16-byte Spill5428; CHECK-GI-NEXT: mov d8, v0.d[1]5429; CHECK-GI-NEXT: mov d9, v1.d[1]5430; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q05431; CHECK-GI-NEXT: bl log105432; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q05433; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill5434; CHECK-GI-NEXT: fmov d0, d85435; CHECK-GI-NEXT: bl log105436; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q05437; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill5438; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Reload5439; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q05440; CHECK-GI-NEXT: bl log105441; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q05442; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill5443; CHECK-GI-NEXT: fmov d0, d95444; CHECK-GI-NEXT: bl log105445; CHECK-GI-NEXT: ldp q1, q2, [sp, #16] // 32-byte Folded Reload5446; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q05447; CHECK-GI-NEXT: ldr x30, [sp, #64] // 8-byte Reload5448; CHECK-GI-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload5449; CHECK-GI-NEXT: mov v2.d[1], v1.d[0]5450; CHECK-GI-NEXT: ldr q1, [sp] // 16-byte Reload5451; CHECK-GI-NEXT: mov v1.d[1], v0.d[0]5452; CHECK-GI-NEXT: mov v0.16b, v2.16b5453; CHECK-GI-NEXT: add sp, sp, #805454; CHECK-GI-NEXT: ret5455entry:5456 %c = call <4 x double> @llvm.log10.v4f64(<4 x double> %a)5457 ret <4 x double> %c5458}5459 5460define <2 x float> @log10_v2f32(<2 x float> %a) {5461; CHECK-SD-LABEL: log10_v2f32:5462; CHECK-SD: // %bb.0: // %entry5463; CHECK-SD-NEXT: sub sp, sp, #485464; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Spill5465; CHECK-SD-NEXT: .cfi_def_cfa_offset 485466; CHECK-SD-NEXT: .cfi_offset w30, -165467; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q05468; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill5469; CHECK-SD-NEXT: mov s0, v0.s[1]5470; CHECK-SD-NEXT: bl log10f5471; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q05472; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill5473; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload5474; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q05475; CHECK-SD-NEXT: bl log10f5476; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload5477; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q05478; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload5479; CHECK-SD-NEXT: mov v0.s[1], v1.s[0]5480; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q05481; CHECK-SD-NEXT: add sp, sp, #485482; CHECK-SD-NEXT: ret5483;5484; CHECK-GI-LABEL: log10_v2f32:5485; CHECK-GI: // %bb.0: // %entry5486; CHECK-GI-NEXT: sub sp, sp, #325487; CHECK-GI-NEXT: str d8, [sp, #16] // 8-byte Spill5488; CHECK-GI-NEXT: str x30, [sp, #24] // 8-byte Spill5489; CHECK-GI-NEXT: .cfi_def_cfa_offset 325490; CHECK-GI-NEXT: .cfi_offset w30, -85491; CHECK-GI-NEXT: .cfi_offset b8, -165492; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q05493; CHECK-GI-NEXT: mov s8, v0.s[1]5494; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q05495; CHECK-GI-NEXT: bl log10f5496; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q05497; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill5498; CHECK-GI-NEXT: fmov s0, s85499; CHECK-GI-NEXT: bl log10f5500; CHECK-GI-NEXT: ldr q1, [sp] // 16-byte Reload5501; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q05502; CHECK-GI-NEXT: ldr x30, [sp, #24] // 8-byte Reload5503; CHECK-GI-NEXT: ldr d8, [sp, #16] // 8-byte Reload5504; CHECK-GI-NEXT: mov v1.s[1], v0.s[0]5505; CHECK-GI-NEXT: fmov d0, d15506; CHECK-GI-NEXT: add sp, sp, #325507; CHECK-GI-NEXT: ret5508entry:5509 %c = call <2 x float> @llvm.log10.v2f32(<2 x float> %a)5510 ret <2 x float> %c5511}5512 5513define <3 x float> @log10_v3f32(<3 x float> %a) {5514; CHECK-SD-LABEL: log10_v3f32:5515; CHECK-SD: // %bb.0: // %entry5516; CHECK-SD-NEXT: sub sp, sp, #485517; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Spill5518; CHECK-SD-NEXT: .cfi_def_cfa_offset 485519; CHECK-SD-NEXT: .cfi_offset w30, -165520; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill5521; CHECK-SD-NEXT: mov s0, v0.s[1]5522; CHECK-SD-NEXT: bl log10f5523; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q05524; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill5525; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload5526; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q05527; CHECK-SD-NEXT: bl log10f5528; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload5529; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q05530; CHECK-SD-NEXT: mov v0.s[1], v1.s[0]5531; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill5532; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload5533; CHECK-SD-NEXT: mov s0, v0.s[2]5534; CHECK-SD-NEXT: bl log10f5535; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload5536; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q05537; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload5538; CHECK-SD-NEXT: mov v1.s[2], v0.s[0]5539; CHECK-SD-NEXT: mov v0.16b, v1.16b5540; CHECK-SD-NEXT: add sp, sp, #485541; CHECK-SD-NEXT: ret5542;5543; CHECK-GI-LABEL: log10_v3f32:5544; CHECK-GI: // %bb.0: // %entry5545; CHECK-GI-NEXT: sub sp, sp, #645546; CHECK-GI-NEXT: stp d9, d8, [sp, #32] // 16-byte Folded Spill5547; CHECK-GI-NEXT: str x30, [sp, #48] // 8-byte Spill5548; CHECK-GI-NEXT: .cfi_def_cfa_offset 645549; CHECK-GI-NEXT: .cfi_offset w30, -165550; CHECK-GI-NEXT: .cfi_offset b8, -245551; CHECK-GI-NEXT: .cfi_offset b9, -325552; CHECK-GI-NEXT: mov s8, v0.s[1]5553; CHECK-GI-NEXT: mov s9, v0.s[2]5554; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q05555; CHECK-GI-NEXT: bl log10f5556; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q05557; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill5558; CHECK-GI-NEXT: fmov s0, s85559; CHECK-GI-NEXT: bl log10f5560; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q05561; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill5562; CHECK-GI-NEXT: fmov s0, s95563; CHECK-GI-NEXT: bl log10f5564; CHECK-GI-NEXT: ldp q2, q1, [sp] // 32-byte Folded Reload5565; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q05566; CHECK-GI-NEXT: ldr x30, [sp, #48] // 8-byte Reload5567; CHECK-GI-NEXT: ldp d9, d8, [sp, #32] // 16-byte Folded Reload5568; CHECK-GI-NEXT: mov v1.s[1], v2.s[0]5569; CHECK-GI-NEXT: mov v1.s[2], v0.s[0]5570; CHECK-GI-NEXT: mov v0.16b, v1.16b5571; CHECK-GI-NEXT: add sp, sp, #645572; CHECK-GI-NEXT: ret5573entry:5574 %c = call <3 x float> @llvm.log10.v3f32(<3 x float> %a)5575 ret <3 x float> %c5576}5577 5578define <4 x float> @log10_v4f32(<4 x float> %a) {5579; CHECK-SD-LABEL: log10_v4f32:5580; CHECK-SD: // %bb.0: // %entry5581; CHECK-SD-NEXT: sub sp, sp, #485582; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Spill5583; CHECK-SD-NEXT: .cfi_def_cfa_offset 485584; CHECK-SD-NEXT: .cfi_offset w30, -165585; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill5586; CHECK-SD-NEXT: mov s0, v0.s[1]5587; CHECK-SD-NEXT: bl log10f5588; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q05589; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill5590; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload5591; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q05592; CHECK-SD-NEXT: bl log10f5593; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload5594; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q05595; CHECK-SD-NEXT: mov v0.s[1], v1.s[0]5596; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill5597; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload5598; CHECK-SD-NEXT: mov s0, v0.s[2]5599; CHECK-SD-NEXT: bl log10f5600; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload5601; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q05602; CHECK-SD-NEXT: mov v1.s[2], v0.s[0]5603; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload5604; CHECK-SD-NEXT: mov s0, v0.s[3]5605; CHECK-SD-NEXT: str q1, [sp] // 16-byte Spill5606; CHECK-SD-NEXT: bl log10f5607; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload5608; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q05609; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload5610; CHECK-SD-NEXT: mov v1.s[3], v0.s[0]5611; CHECK-SD-NEXT: mov v0.16b, v1.16b5612; CHECK-SD-NEXT: add sp, sp, #485613; CHECK-SD-NEXT: ret5614;5615; CHECK-GI-LABEL: log10_v4f32:5616; CHECK-GI: // %bb.0: // %entry5617; CHECK-GI-NEXT: sub sp, sp, #805618; CHECK-GI-NEXT: str d10, [sp, #48] // 8-byte Spill5619; CHECK-GI-NEXT: stp d9, d8, [sp, #56] // 16-byte Folded Spill5620; CHECK-GI-NEXT: str x30, [sp, #72] // 8-byte Spill5621; CHECK-GI-NEXT: .cfi_def_cfa_offset 805622; CHECK-GI-NEXT: .cfi_offset w30, -85623; CHECK-GI-NEXT: .cfi_offset b8, -165624; CHECK-GI-NEXT: .cfi_offset b9, -245625; CHECK-GI-NEXT: .cfi_offset b10, -325626; CHECK-GI-NEXT: mov s8, v0.s[1]5627; CHECK-GI-NEXT: mov s9, v0.s[2]5628; CHECK-GI-NEXT: mov s10, v0.s[3]5629; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q05630; CHECK-GI-NEXT: bl log10f5631; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q05632; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill5633; CHECK-GI-NEXT: fmov s0, s85634; CHECK-GI-NEXT: bl log10f5635; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q05636; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill5637; CHECK-GI-NEXT: fmov s0, s95638; CHECK-GI-NEXT: bl log10f5639; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q05640; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill5641; CHECK-GI-NEXT: fmov s0, s105642; CHECK-GI-NEXT: bl log10f5643; CHECK-GI-NEXT: ldp q2, q1, [sp, #16] // 32-byte Folded Reload5644; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q05645; CHECK-GI-NEXT: ldr x30, [sp, #72] // 8-byte Reload5646; CHECK-GI-NEXT: ldp d9, d8, [sp, #56] // 16-byte Folded Reload5647; CHECK-GI-NEXT: ldr d10, [sp, #48] // 8-byte Reload5648; CHECK-GI-NEXT: mov v1.s[1], v2.s[0]5649; CHECK-GI-NEXT: ldr q2, [sp] // 16-byte Reload5650; CHECK-GI-NEXT: mov v1.s[2], v2.s[0]5651; CHECK-GI-NEXT: mov v1.s[3], v0.s[0]5652; CHECK-GI-NEXT: mov v0.16b, v1.16b5653; CHECK-GI-NEXT: add sp, sp, #805654; CHECK-GI-NEXT: ret5655entry:5656 %c = call <4 x float> @llvm.log10.v4f32(<4 x float> %a)5657 ret <4 x float> %c5658}5659 5660define <8 x float> @log10_v8f32(<8 x float> %a) {5661; CHECK-SD-LABEL: log10_v8f32:5662; CHECK-SD: // %bb.0: // %entry5663; CHECK-SD-NEXT: sub sp, sp, #645664; CHECK-SD-NEXT: str x30, [sp, #48] // 8-byte Spill5665; CHECK-SD-NEXT: .cfi_def_cfa_offset 645666; CHECK-SD-NEXT: .cfi_offset w30, -165667; CHECK-SD-NEXT: stp q0, q1, [sp] // 32-byte Folded Spill5668; CHECK-SD-NEXT: mov s0, v0.s[1]5669; CHECK-SD-NEXT: bl log10f5670; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q05671; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Spill5672; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload5673; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q05674; CHECK-SD-NEXT: bl log10f5675; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload5676; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q05677; CHECK-SD-NEXT: mov v0.s[1], v1.s[0]5678; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Spill5679; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload5680; CHECK-SD-NEXT: mov s0, v0.s[2]5681; CHECK-SD-NEXT: bl log10f5682; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload5683; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q05684; CHECK-SD-NEXT: mov v1.s[2], v0.s[0]5685; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload5686; CHECK-SD-NEXT: mov s0, v0.s[3]5687; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill5688; CHECK-SD-NEXT: bl log10f5689; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload5690; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q05691; CHECK-SD-NEXT: mov v1.s[3], v0.s[0]5692; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload5693; CHECK-SD-NEXT: mov s0, v0.s[1]5694; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill5695; CHECK-SD-NEXT: bl log10f5696; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q05697; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill5698; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload5699; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q05700; CHECK-SD-NEXT: bl log10f5701; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload5702; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q05703; CHECK-SD-NEXT: mov v0.s[1], v1.s[0]5704; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill5705; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload5706; CHECK-SD-NEXT: mov s0, v0.s[2]5707; CHECK-SD-NEXT: bl log10f5708; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload5709; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q05710; CHECK-SD-NEXT: mov v1.s[2], v0.s[0]5711; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload5712; CHECK-SD-NEXT: mov s0, v0.s[3]5713; CHECK-SD-NEXT: str q1, [sp] // 16-byte Spill5714; CHECK-SD-NEXT: bl log10f5715; CHECK-SD-NEXT: fmov s2, s05716; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload5717; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Reload5718; CHECK-SD-NEXT: ldr x30, [sp, #48] // 8-byte Reload5719; CHECK-SD-NEXT: mov v1.s[3], v2.s[0]5720; CHECK-SD-NEXT: add sp, sp, #645721; CHECK-SD-NEXT: ret5722;5723; CHECK-GI-LABEL: log10_v8f32:5724; CHECK-GI: // %bb.0: // %entry5725; CHECK-GI-NEXT: sub sp, sp, #1765726; CHECK-GI-NEXT: stp d13, d12, [sp, #112] // 16-byte Folded Spill5727; CHECK-GI-NEXT: stp d11, d10, [sp, #128] // 16-byte Folded Spill5728; CHECK-GI-NEXT: stp d9, d8, [sp, #144] // 16-byte Folded Spill5729; CHECK-GI-NEXT: str x30, [sp, #160] // 8-byte Spill5730; CHECK-GI-NEXT: .cfi_def_cfa_offset 1765731; CHECK-GI-NEXT: .cfi_offset w30, -165732; CHECK-GI-NEXT: .cfi_offset b8, -245733; CHECK-GI-NEXT: .cfi_offset b9, -325734; CHECK-GI-NEXT: .cfi_offset b10, -405735; CHECK-GI-NEXT: .cfi_offset b11, -485736; CHECK-GI-NEXT: .cfi_offset b12, -565737; CHECK-GI-NEXT: .cfi_offset b13, -645738; CHECK-GI-NEXT: str q1, [sp, #32] // 16-byte Spill5739; CHECK-GI-NEXT: mov s8, v0.s[1]5740; CHECK-GI-NEXT: mov s9, v0.s[2]5741; CHECK-GI-NEXT: mov s10, v0.s[3]5742; CHECK-GI-NEXT: mov s11, v1.s[1]5743; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q05744; CHECK-GI-NEXT: mov s12, v1.s[2]5745; CHECK-GI-NEXT: mov s13, v1.s[3]5746; CHECK-GI-NEXT: bl log10f5747; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q05748; CHECK-GI-NEXT: str q0, [sp, #64] // 16-byte Spill5749; CHECK-GI-NEXT: fmov s0, s85750; CHECK-GI-NEXT: bl log10f5751; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q05752; CHECK-GI-NEXT: str q0, [sp, #48] // 16-byte Spill5753; CHECK-GI-NEXT: fmov s0, s95754; CHECK-GI-NEXT: bl log10f5755; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q05756; CHECK-GI-NEXT: str q0, [sp, #96] // 16-byte Spill5757; CHECK-GI-NEXT: fmov s0, s105758; CHECK-GI-NEXT: bl log10f5759; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q05760; CHECK-GI-NEXT: str q0, [sp, #80] // 16-byte Spill5761; CHECK-GI-NEXT: ldr q0, [sp, #32] // 16-byte Reload5762; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q05763; CHECK-GI-NEXT: bl log10f5764; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q05765; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill5766; CHECK-GI-NEXT: fmov s0, s115767; CHECK-GI-NEXT: bl log10f5768; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q05769; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill5770; CHECK-GI-NEXT: fmov s0, s125771; CHECK-GI-NEXT: bl log10f5772; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q05773; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill5774; CHECK-GI-NEXT: fmov s0, s135775; CHECK-GI-NEXT: bl log10f5776; CHECK-GI-NEXT: ldp q2, q1, [sp, #48] // 32-byte Folded Reload5777; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q05778; CHECK-GI-NEXT: ldr x30, [sp, #160] // 8-byte Reload5779; CHECK-GI-NEXT: ldp d9, d8, [sp, #144] // 16-byte Folded Reload5780; CHECK-GI-NEXT: ldp d11, d10, [sp, #128] // 16-byte Folded Reload5781; CHECK-GI-NEXT: mov v1.s[1], v2.s[0]5782; CHECK-GI-NEXT: ldp q2, q3, [sp, #16] // 32-byte Folded Reload5783; CHECK-GI-NEXT: ldp d13, d12, [sp, #112] // 16-byte Folded Reload5784; CHECK-GI-NEXT: mov v3.s[1], v2.s[0]5785; CHECK-GI-NEXT: ldr q2, [sp, #96] // 16-byte Reload5786; CHECK-GI-NEXT: mov v1.s[2], v2.s[0]5787; CHECK-GI-NEXT: ldr q2, [sp] // 16-byte Reload5788; CHECK-GI-NEXT: mov v3.s[2], v2.s[0]5789; CHECK-GI-NEXT: ldr q2, [sp, #80] // 16-byte Reload5790; CHECK-GI-NEXT: mov v1.s[3], v2.s[0]5791; CHECK-GI-NEXT: mov v3.s[3], v0.s[0]5792; CHECK-GI-NEXT: mov v2.16b, v1.16b5793; CHECK-GI-NEXT: mov v1.16b, v3.16b5794; CHECK-GI-NEXT: mov v0.16b, v2.16b5795; CHECK-GI-NEXT: add sp, sp, #1765796; CHECK-GI-NEXT: ret5797entry:5798 %c = call <8 x float> @llvm.log10.v8f32(<8 x float> %a)5799 ret <8 x float> %c5800}5801 5802define <7 x half> @log10_v7f16(<7 x half> %a) {5803; CHECK-SD-LABEL: log10_v7f16:5804; CHECK-SD: // %bb.0: // %entry5805; CHECK-SD-NEXT: sub sp, sp, #485806; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Spill5807; CHECK-SD-NEXT: .cfi_def_cfa_offset 485808; CHECK-SD-NEXT: .cfi_offset w30, -165809; CHECK-SD-NEXT: mov h1, v0.h[1]5810; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill5811; CHECK-SD-NEXT: fcvt s0, h15812; CHECK-SD-NEXT: bl log10f5813; CHECK-SD-NEXT: fcvt h0, s05814; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill5815; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload5816; CHECK-SD-NEXT: fcvt s0, h05817; CHECK-SD-NEXT: bl log10f5818; CHECK-SD-NEXT: fcvt h0, s05819; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload5820; CHECK-SD-NEXT: mov v0.h[1], v1.h[0]5821; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill5822; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload5823; CHECK-SD-NEXT: mov h0, v0.h[2]5824; CHECK-SD-NEXT: fcvt s0, h05825; CHECK-SD-NEXT: bl log10f5826; CHECK-SD-NEXT: fcvt h0, s05827; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload5828; CHECK-SD-NEXT: mov v1.h[2], v0.h[0]5829; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload5830; CHECK-SD-NEXT: mov h0, v0.h[3]5831; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill5832; CHECK-SD-NEXT: fcvt s0, h05833; CHECK-SD-NEXT: bl log10f5834; CHECK-SD-NEXT: fcvt h0, s05835; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload5836; CHECK-SD-NEXT: mov v1.h[3], v0.h[0]5837; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload5838; CHECK-SD-NEXT: mov h0, v0.h[4]5839; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill5840; CHECK-SD-NEXT: fcvt s0, h05841; CHECK-SD-NEXT: bl log10f5842; CHECK-SD-NEXT: fcvt h0, s05843; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload5844; CHECK-SD-NEXT: mov v1.h[4], v0.h[0]5845; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload5846; CHECK-SD-NEXT: mov h0, v0.h[5]5847; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill5848; CHECK-SD-NEXT: fcvt s0, h05849; CHECK-SD-NEXT: bl log10f5850; CHECK-SD-NEXT: fcvt h0, s05851; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload5852; CHECK-SD-NEXT: mov v1.h[5], v0.h[0]5853; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload5854; CHECK-SD-NEXT: mov h0, v0.h[6]5855; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill5856; CHECK-SD-NEXT: fcvt s0, h05857; CHECK-SD-NEXT: bl log10f5858; CHECK-SD-NEXT: fcvt h0, s05859; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload5860; CHECK-SD-NEXT: mov v1.h[6], v0.h[0]5861; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload5862; CHECK-SD-NEXT: mov h0, v0.h[7]5863; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill5864; CHECK-SD-NEXT: fcvt s0, h05865; CHECK-SD-NEXT: bl log10f5866; CHECK-SD-NEXT: fcvt h1, s05867; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload5868; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload5869; CHECK-SD-NEXT: mov v0.h[7], v1.h[0]5870; CHECK-SD-NEXT: add sp, sp, #485871; CHECK-SD-NEXT: ret5872;5873; CHECK-GI-LABEL: log10_v7f16:5874; CHECK-GI: // %bb.0: // %entry5875; CHECK-GI-NEXT: sub sp, sp, #1605876; CHECK-GI-NEXT: stp d13, d12, [sp, #96] // 16-byte Folded Spill5877; CHECK-GI-NEXT: stp d11, d10, [sp, #112] // 16-byte Folded Spill5878; CHECK-GI-NEXT: stp d9, d8, [sp, #128] // 16-byte Folded Spill5879; CHECK-GI-NEXT: str x30, [sp, #144] // 8-byte Spill5880; CHECK-GI-NEXT: .cfi_def_cfa_offset 1605881; CHECK-GI-NEXT: .cfi_offset w30, -165882; CHECK-GI-NEXT: .cfi_offset b8, -245883; CHECK-GI-NEXT: .cfi_offset b9, -325884; CHECK-GI-NEXT: .cfi_offset b10, -405885; CHECK-GI-NEXT: .cfi_offset b11, -485886; CHECK-GI-NEXT: .cfi_offset b12, -565887; CHECK-GI-NEXT: .cfi_offset b13, -645888; CHECK-GI-NEXT: mov h8, v0.h[1]5889; CHECK-GI-NEXT: mov h9, v0.h[2]5890; CHECK-GI-NEXT: mov h10, v0.h[3]5891; CHECK-GI-NEXT: mov h11, v0.h[4]5892; CHECK-GI-NEXT: mov h12, v0.h[5]5893; CHECK-GI-NEXT: mov h13, v0.h[6]5894; CHECK-GI-NEXT: fcvt s0, h05895; CHECK-GI-NEXT: bl log10f5896; CHECK-GI-NEXT: fcvt s1, h85897; CHECK-GI-NEXT: fcvt h0, s05898; CHECK-GI-NEXT: str q0, [sp, #80] // 16-byte Spill5899; CHECK-GI-NEXT: fmov s0, s15900; CHECK-GI-NEXT: bl log10f5901; CHECK-GI-NEXT: fcvt s1, h95902; CHECK-GI-NEXT: fcvt h0, s05903; CHECK-GI-NEXT: str q0, [sp, #48] // 16-byte Spill5904; CHECK-GI-NEXT: fmov s0, s15905; CHECK-GI-NEXT: bl log10f5906; CHECK-GI-NEXT: fcvt s1, h105907; CHECK-GI-NEXT: fcvt h0, s05908; CHECK-GI-NEXT: str q0, [sp, #64] // 16-byte Spill5909; CHECK-GI-NEXT: fmov s0, s15910; CHECK-GI-NEXT: bl log10f5911; CHECK-GI-NEXT: fcvt s1, h115912; CHECK-GI-NEXT: fcvt h0, s05913; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill5914; CHECK-GI-NEXT: fmov s0, s15915; CHECK-GI-NEXT: bl log10f5916; CHECK-GI-NEXT: fcvt s1, h125917; CHECK-GI-NEXT: fcvt h0, s05918; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill5919; CHECK-GI-NEXT: fmov s0, s15920; CHECK-GI-NEXT: bl log10f5921; CHECK-GI-NEXT: fcvt s1, h135922; CHECK-GI-NEXT: fcvt h0, s05923; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill5924; CHECK-GI-NEXT: fmov s0, s15925; CHECK-GI-NEXT: bl log10f5926; CHECK-GI-NEXT: ldp q3, q2, [sp, #48] // 32-byte Folded Reload5927; CHECK-GI-NEXT: fcvt h0, s05928; CHECK-GI-NEXT: ldr q1, [sp, #80] // 16-byte Reload5929; CHECK-GI-NEXT: ldp d9, d8, [sp, #128] // 16-byte Folded Reload5930; CHECK-GI-NEXT: ldp d11, d10, [sp, #112] // 16-byte Folded Reload5931; CHECK-GI-NEXT: ldr x30, [sp, #144] // 8-byte Reload5932; CHECK-GI-NEXT: mov v1.h[1], v3.h[0]5933; CHECK-GI-NEXT: ldp d13, d12, [sp, #96] // 16-byte Folded Reload5934; CHECK-GI-NEXT: mov v1.h[2], v2.h[0]5935; CHECK-GI-NEXT: ldp q2, q3, [sp, #16] // 32-byte Folded Reload5936; CHECK-GI-NEXT: mov v1.h[3], v3.h[0]5937; CHECK-GI-NEXT: mov v1.h[4], v2.h[0]5938; CHECK-GI-NEXT: ldr q2, [sp] // 16-byte Reload5939; CHECK-GI-NEXT: mov v1.h[5], v2.h[0]5940; CHECK-GI-NEXT: mov v1.h[6], v0.h[0]5941; CHECK-GI-NEXT: mov v0.16b, v1.16b5942; CHECK-GI-NEXT: add sp, sp, #1605943; CHECK-GI-NEXT: ret5944entry:5945 %c = call <7 x half> @llvm.log10.v7f16(<7 x half> %a)5946 ret <7 x half> %c5947}5948 5949define <4 x half> @log10_v4f16(<4 x half> %a) {5950; CHECK-SD-LABEL: log10_v4f16:5951; CHECK-SD: // %bb.0: // %entry5952; CHECK-SD-NEXT: sub sp, sp, #485953; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Spill5954; CHECK-SD-NEXT: .cfi_def_cfa_offset 485955; CHECK-SD-NEXT: .cfi_offset w30, -165956; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q05957; CHECK-SD-NEXT: mov h1, v0.h[1]5958; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill5959; CHECK-SD-NEXT: fcvt s0, h15960; CHECK-SD-NEXT: bl log10f5961; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload5962; CHECK-SD-NEXT: fcvt h0, s05963; CHECK-SD-NEXT: fcvt s1, h15964; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill5965; CHECK-SD-NEXT: fmov s0, s15966; CHECK-SD-NEXT: bl log10f5967; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload5968; CHECK-SD-NEXT: fcvt h2, s05969; CHECK-SD-NEXT: mov h1, v1.h[2]5970; CHECK-SD-NEXT: fcvt s0, h15971; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload5972; CHECK-SD-NEXT: mov v2.h[1], v1.h[0]5973; CHECK-SD-NEXT: str q2, [sp] // 16-byte Spill5974; CHECK-SD-NEXT: bl log10f5975; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload5976; CHECK-SD-NEXT: fcvt h2, s05977; CHECK-SD-NEXT: mov h1, v1.h[3]5978; CHECK-SD-NEXT: fcvt s0, h15979; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Reload5980; CHECK-SD-NEXT: mov v1.h[2], v2.h[0]5981; CHECK-SD-NEXT: str q1, [sp] // 16-byte Spill5982; CHECK-SD-NEXT: bl log10f5983; CHECK-SD-NEXT: fcvt h1, s05984; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload5985; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload5986; CHECK-SD-NEXT: mov v0.h[3], v1.h[0]5987; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q05988; CHECK-SD-NEXT: add sp, sp, #485989; CHECK-SD-NEXT: ret5990;5991; CHECK-GI-LABEL: log10_v4f16:5992; CHECK-GI: // %bb.0: // %entry5993; CHECK-GI-NEXT: sub sp, sp, #805994; CHECK-GI-NEXT: str d10, [sp, #48] // 8-byte Spill5995; CHECK-GI-NEXT: stp d9, d8, [sp, #56] // 16-byte Folded Spill5996; CHECK-GI-NEXT: str x30, [sp, #72] // 8-byte Spill5997; CHECK-GI-NEXT: .cfi_def_cfa_offset 805998; CHECK-GI-NEXT: .cfi_offset w30, -85999; CHECK-GI-NEXT: .cfi_offset b8, -166000; CHECK-GI-NEXT: .cfi_offset b9, -246001; CHECK-GI-NEXT: .cfi_offset b10, -326002; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q06003; CHECK-GI-NEXT: mov h8, v0.h[1]6004; CHECK-GI-NEXT: mov h9, v0.h[2]6005; CHECK-GI-NEXT: mov h10, v0.h[3]6006; CHECK-GI-NEXT: fcvt s0, h06007; CHECK-GI-NEXT: bl log10f6008; CHECK-GI-NEXT: fcvt s1, h86009; CHECK-GI-NEXT: fcvt h0, s06010; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill6011; CHECK-GI-NEXT: fmov s0, s16012; CHECK-GI-NEXT: bl log10f6013; CHECK-GI-NEXT: fcvt s1, h96014; CHECK-GI-NEXT: fcvt h0, s06015; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill6016; CHECK-GI-NEXT: fmov s0, s16017; CHECK-GI-NEXT: bl log10f6018; CHECK-GI-NEXT: fcvt s1, h106019; CHECK-GI-NEXT: fcvt h0, s06020; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill6021; CHECK-GI-NEXT: fmov s0, s16022; CHECK-GI-NEXT: bl log10f6023; CHECK-GI-NEXT: ldp q3, q2, [sp] // 32-byte Folded Reload6024; CHECK-GI-NEXT: fcvt h0, s06025; CHECK-GI-NEXT: ldr q1, [sp, #32] // 16-byte Reload6026; CHECK-GI-NEXT: ldp d9, d8, [sp, #56] // 16-byte Folded Reload6027; CHECK-GI-NEXT: ldr x30, [sp, #72] // 8-byte Reload6028; CHECK-GI-NEXT: ldr d10, [sp, #48] // 8-byte Reload6029; CHECK-GI-NEXT: mov v1.h[1], v3.h[0]6030; CHECK-GI-NEXT: mov v1.h[2], v2.h[0]6031; CHECK-GI-NEXT: mov v1.h[3], v0.h[0]6032; CHECK-GI-NEXT: mov v0.16b, v1.16b6033; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q06034; CHECK-GI-NEXT: add sp, sp, #806035; CHECK-GI-NEXT: ret6036entry:6037 %c = call <4 x half> @llvm.log10.v4f16(<4 x half> %a)6038 ret <4 x half> %c6039}6040 6041define <8 x half> @log10_v8f16(<8 x half> %a) {6042; CHECK-SD-LABEL: log10_v8f16:6043; CHECK-SD: // %bb.0: // %entry6044; CHECK-SD-NEXT: sub sp, sp, #486045; CHECK-SD-NEXT: str x30, [sp, #32] // 8-byte Spill6046; CHECK-SD-NEXT: .cfi_def_cfa_offset 486047; CHECK-SD-NEXT: .cfi_offset w30, -166048; CHECK-SD-NEXT: mov h1, v0.h[1]6049; CHECK-SD-NEXT: str q0, [sp] // 16-byte Spill6050; CHECK-SD-NEXT: fcvt s0, h16051; CHECK-SD-NEXT: bl log10f6052; CHECK-SD-NEXT: fcvt h0, s06053; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill6054; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload6055; CHECK-SD-NEXT: fcvt s0, h06056; CHECK-SD-NEXT: bl log10f6057; CHECK-SD-NEXT: fcvt h0, s06058; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload6059; CHECK-SD-NEXT: mov v0.h[1], v1.h[0]6060; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill6061; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload6062; CHECK-SD-NEXT: mov h0, v0.h[2]6063; CHECK-SD-NEXT: fcvt s0, h06064; CHECK-SD-NEXT: bl log10f6065; CHECK-SD-NEXT: fcvt h0, s06066; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload6067; CHECK-SD-NEXT: mov v1.h[2], v0.h[0]6068; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload6069; CHECK-SD-NEXT: mov h0, v0.h[3]6070; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill6071; CHECK-SD-NEXT: fcvt s0, h06072; CHECK-SD-NEXT: bl log10f6073; CHECK-SD-NEXT: fcvt h0, s06074; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload6075; CHECK-SD-NEXT: mov v1.h[3], v0.h[0]6076; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload6077; CHECK-SD-NEXT: mov h0, v0.h[4]6078; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill6079; CHECK-SD-NEXT: fcvt s0, h06080; CHECK-SD-NEXT: bl log10f6081; CHECK-SD-NEXT: fcvt h0, s06082; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload6083; CHECK-SD-NEXT: mov v1.h[4], v0.h[0]6084; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload6085; CHECK-SD-NEXT: mov h0, v0.h[5]6086; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill6087; CHECK-SD-NEXT: fcvt s0, h06088; CHECK-SD-NEXT: bl log10f6089; CHECK-SD-NEXT: fcvt h0, s06090; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload6091; CHECK-SD-NEXT: mov v1.h[5], v0.h[0]6092; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload6093; CHECK-SD-NEXT: mov h0, v0.h[6]6094; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill6095; CHECK-SD-NEXT: fcvt s0, h06096; CHECK-SD-NEXT: bl log10f6097; CHECK-SD-NEXT: fcvt h0, s06098; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload6099; CHECK-SD-NEXT: mov v1.h[6], v0.h[0]6100; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload6101; CHECK-SD-NEXT: mov h0, v0.h[7]6102; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill6103; CHECK-SD-NEXT: fcvt s0, h06104; CHECK-SD-NEXT: bl log10f6105; CHECK-SD-NEXT: fcvt h1, s06106; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload6107; CHECK-SD-NEXT: ldr x30, [sp, #32] // 8-byte Reload6108; CHECK-SD-NEXT: mov v0.h[7], v1.h[0]6109; CHECK-SD-NEXT: add sp, sp, #486110; CHECK-SD-NEXT: ret6111;6112; CHECK-GI-LABEL: log10_v8f16:6113; CHECK-GI: // %bb.0: // %entry6114; CHECK-GI-NEXT: sub sp, sp, #1766115; CHECK-GI-NEXT: str d14, [sp, #112] // 8-byte Spill6116; CHECK-GI-NEXT: stp d13, d12, [sp, #120] // 16-byte Folded Spill6117; CHECK-GI-NEXT: stp d11, d10, [sp, #136] // 16-byte Folded Spill6118; CHECK-GI-NEXT: stp d9, d8, [sp, #152] // 16-byte Folded Spill6119; CHECK-GI-NEXT: str x30, [sp, #168] // 8-byte Spill6120; CHECK-GI-NEXT: .cfi_def_cfa_offset 1766121; CHECK-GI-NEXT: .cfi_offset w30, -86122; CHECK-GI-NEXT: .cfi_offset b8, -166123; CHECK-GI-NEXT: .cfi_offset b9, -246124; CHECK-GI-NEXT: .cfi_offset b10, -326125; CHECK-GI-NEXT: .cfi_offset b11, -406126; CHECK-GI-NEXT: .cfi_offset b12, -486127; CHECK-GI-NEXT: .cfi_offset b13, -566128; CHECK-GI-NEXT: .cfi_offset b14, -646129; CHECK-GI-NEXT: mov h8, v0.h[1]6130; CHECK-GI-NEXT: mov h9, v0.h[2]6131; CHECK-GI-NEXT: mov h10, v0.h[3]6132; CHECK-GI-NEXT: mov h11, v0.h[4]6133; CHECK-GI-NEXT: mov h12, v0.h[5]6134; CHECK-GI-NEXT: mov h13, v0.h[6]6135; CHECK-GI-NEXT: mov h14, v0.h[7]6136; CHECK-GI-NEXT: fcvt s0, h06137; CHECK-GI-NEXT: bl log10f6138; CHECK-GI-NEXT: fcvt s1, h86139; CHECK-GI-NEXT: fcvt h0, s06140; CHECK-GI-NEXT: str q0, [sp, #96] // 16-byte Spill6141; CHECK-GI-NEXT: fmov s0, s16142; CHECK-GI-NEXT: bl log10f6143; CHECK-GI-NEXT: fcvt s1, h96144; CHECK-GI-NEXT: fcvt h0, s06145; CHECK-GI-NEXT: str q0, [sp, #64] // 16-byte Spill6146; CHECK-GI-NEXT: fmov s0, s16147; CHECK-GI-NEXT: bl log10f6148; CHECK-GI-NEXT: fcvt s1, h106149; CHECK-GI-NEXT: fcvt h0, s06150; CHECK-GI-NEXT: str q0, [sp, #80] // 16-byte Spill6151; CHECK-GI-NEXT: fmov s0, s16152; CHECK-GI-NEXT: bl log10f6153; CHECK-GI-NEXT: fcvt s1, h116154; CHECK-GI-NEXT: fcvt h0, s06155; CHECK-GI-NEXT: str q0, [sp, #48] // 16-byte Spill6156; CHECK-GI-NEXT: fmov s0, s16157; CHECK-GI-NEXT: bl log10f6158; CHECK-GI-NEXT: fcvt s1, h126159; CHECK-GI-NEXT: fcvt h0, s06160; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill6161; CHECK-GI-NEXT: fmov s0, s16162; CHECK-GI-NEXT: bl log10f6163; CHECK-GI-NEXT: fcvt s1, h136164; CHECK-GI-NEXT: fcvt h0, s06165; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill6166; CHECK-GI-NEXT: fmov s0, s16167; CHECK-GI-NEXT: bl log10f6168; CHECK-GI-NEXT: fcvt s1, h146169; CHECK-GI-NEXT: fcvt h0, s06170; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill6171; CHECK-GI-NEXT: fmov s0, s16172; CHECK-GI-NEXT: bl log10f6173; CHECK-GI-NEXT: ldp q3, q2, [sp, #64] // 32-byte Folded Reload6174; CHECK-GI-NEXT: fcvt h0, s06175; CHECK-GI-NEXT: ldr q1, [sp, #96] // 16-byte Reload6176; CHECK-GI-NEXT: ldp d9, d8, [sp, #152] // 16-byte Folded Reload6177; CHECK-GI-NEXT: ldp d11, d10, [sp, #136] // 16-byte Folded Reload6178; CHECK-GI-NEXT: ldr x30, [sp, #168] // 8-byte Reload6179; CHECK-GI-NEXT: mov v1.h[1], v3.h[0]6180; CHECK-GI-NEXT: ldr d14, [sp, #112] // 8-byte Reload6181; CHECK-GI-NEXT: ldp d13, d12, [sp, #120] // 16-byte Folded Reload6182; CHECK-GI-NEXT: mov v1.h[2], v2.h[0]6183; CHECK-GI-NEXT: ldp q2, q3, [sp, #32] // 32-byte Folded Reload6184; CHECK-GI-NEXT: mov v1.h[3], v3.h[0]6185; CHECK-GI-NEXT: mov v1.h[4], v2.h[0]6186; CHECK-GI-NEXT: ldp q2, q3, [sp] // 32-byte Folded Reload6187; CHECK-GI-NEXT: mov v1.h[5], v3.h[0]6188; CHECK-GI-NEXT: mov v1.h[6], v2.h[0]6189; CHECK-GI-NEXT: mov v1.h[7], v0.h[0]6190; CHECK-GI-NEXT: mov v0.16b, v1.16b6191; CHECK-GI-NEXT: add sp, sp, #1766192; CHECK-GI-NEXT: ret6193entry:6194 %c = call <8 x half> @llvm.log10.v8f16(<8 x half> %a)6195 ret <8 x half> %c6196}6197 6198define <16 x half> @log10_v16f16(<16 x half> %a) {6199; CHECK-SD-LABEL: log10_v16f16:6200; CHECK-SD: // %bb.0: // %entry6201; CHECK-SD-NEXT: sub sp, sp, #646202; CHECK-SD-NEXT: str x30, [sp, #48] // 8-byte Spill6203; CHECK-SD-NEXT: .cfi_def_cfa_offset 646204; CHECK-SD-NEXT: .cfi_offset w30, -166205; CHECK-SD-NEXT: stp q1, q0, [sp] // 32-byte Folded Spill6206; CHECK-SD-NEXT: mov h1, v0.h[1]6207; CHECK-SD-NEXT: fcvt s0, h16208; CHECK-SD-NEXT: bl log10f6209; CHECK-SD-NEXT: fcvt h0, s06210; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Spill6211; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload6212; CHECK-SD-NEXT: fcvt s0, h06213; CHECK-SD-NEXT: bl log10f6214; CHECK-SD-NEXT: fcvt h0, s06215; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload6216; CHECK-SD-NEXT: mov v0.h[1], v1.h[0]6217; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Spill6218; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload6219; CHECK-SD-NEXT: mov h0, v0.h[2]6220; CHECK-SD-NEXT: fcvt s0, h06221; CHECK-SD-NEXT: bl log10f6222; CHECK-SD-NEXT: fcvt h0, s06223; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload6224; CHECK-SD-NEXT: mov v1.h[2], v0.h[0]6225; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload6226; CHECK-SD-NEXT: mov h0, v0.h[3]6227; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill6228; CHECK-SD-NEXT: fcvt s0, h06229; CHECK-SD-NEXT: bl log10f6230; CHECK-SD-NEXT: fcvt h0, s06231; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload6232; CHECK-SD-NEXT: mov v1.h[3], v0.h[0]6233; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload6234; CHECK-SD-NEXT: mov h0, v0.h[4]6235; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill6236; CHECK-SD-NEXT: fcvt s0, h06237; CHECK-SD-NEXT: bl log10f6238; CHECK-SD-NEXT: fcvt h0, s06239; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload6240; CHECK-SD-NEXT: mov v1.h[4], v0.h[0]6241; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload6242; CHECK-SD-NEXT: mov h0, v0.h[5]6243; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill6244; CHECK-SD-NEXT: fcvt s0, h06245; CHECK-SD-NEXT: bl log10f6246; CHECK-SD-NEXT: fcvt h0, s06247; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload6248; CHECK-SD-NEXT: mov v1.h[5], v0.h[0]6249; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload6250; CHECK-SD-NEXT: mov h0, v0.h[6]6251; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill6252; CHECK-SD-NEXT: fcvt s0, h06253; CHECK-SD-NEXT: bl log10f6254; CHECK-SD-NEXT: fcvt h0, s06255; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload6256; CHECK-SD-NEXT: mov v1.h[6], v0.h[0]6257; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Reload6258; CHECK-SD-NEXT: mov h0, v0.h[7]6259; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill6260; CHECK-SD-NEXT: fcvt s0, h06261; CHECK-SD-NEXT: bl log10f6262; CHECK-SD-NEXT: fcvt h0, s06263; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Reload6264; CHECK-SD-NEXT: mov v1.h[7], v0.h[0]6265; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload6266; CHECK-SD-NEXT: mov h0, v0.h[1]6267; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Spill6268; CHECK-SD-NEXT: fcvt s0, h06269; CHECK-SD-NEXT: bl log10f6270; CHECK-SD-NEXT: fcvt h0, s06271; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill6272; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload6273; CHECK-SD-NEXT: fcvt s0, h06274; CHECK-SD-NEXT: bl log10f6275; CHECK-SD-NEXT: fcvt h0, s06276; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload6277; CHECK-SD-NEXT: mov v0.h[1], v1.h[0]6278; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Spill6279; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload6280; CHECK-SD-NEXT: mov h0, v0.h[2]6281; CHECK-SD-NEXT: fcvt s0, h06282; CHECK-SD-NEXT: bl log10f6283; CHECK-SD-NEXT: fcvt h0, s06284; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload6285; CHECK-SD-NEXT: mov v1.h[2], v0.h[0]6286; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload6287; CHECK-SD-NEXT: mov h0, v0.h[3]6288; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill6289; CHECK-SD-NEXT: fcvt s0, h06290; CHECK-SD-NEXT: bl log10f6291; CHECK-SD-NEXT: fcvt h0, s06292; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload6293; CHECK-SD-NEXT: mov v1.h[3], v0.h[0]6294; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload6295; CHECK-SD-NEXT: mov h0, v0.h[4]6296; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill6297; CHECK-SD-NEXT: fcvt s0, h06298; CHECK-SD-NEXT: bl log10f6299; CHECK-SD-NEXT: fcvt h0, s06300; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload6301; CHECK-SD-NEXT: mov v1.h[4], v0.h[0]6302; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload6303; CHECK-SD-NEXT: mov h0, v0.h[5]6304; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill6305; CHECK-SD-NEXT: fcvt s0, h06306; CHECK-SD-NEXT: bl log10f6307; CHECK-SD-NEXT: fcvt h0, s06308; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload6309; CHECK-SD-NEXT: mov v1.h[5], v0.h[0]6310; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload6311; CHECK-SD-NEXT: mov h0, v0.h[6]6312; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill6313; CHECK-SD-NEXT: fcvt s0, h06314; CHECK-SD-NEXT: bl log10f6315; CHECK-SD-NEXT: fcvt h0, s06316; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Reload6317; CHECK-SD-NEXT: mov v1.h[6], v0.h[0]6318; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Reload6319; CHECK-SD-NEXT: mov h0, v0.h[7]6320; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Spill6321; CHECK-SD-NEXT: fcvt s0, h06322; CHECK-SD-NEXT: bl log10f6323; CHECK-SD-NEXT: fmov s1, s06324; CHECK-SD-NEXT: ldr x30, [sp, #48] // 8-byte Reload6325; CHECK-SD-NEXT: fcvt h2, s16326; CHECK-SD-NEXT: ldp q1, q0, [sp, #16] // 32-byte Folded Reload6327; CHECK-SD-NEXT: mov v1.h[7], v2.h[0]6328; CHECK-SD-NEXT: add sp, sp, #646329; CHECK-SD-NEXT: ret6330;6331; CHECK-GI-LABEL: log10_v16f16:6332; CHECK-GI: // %bb.0: // %entry6333; CHECK-GI-NEXT: sub sp, sp, #3206334; CHECK-GI-NEXT: stp d15, d14, [sp, #240] // 16-byte Folded Spill6335; CHECK-GI-NEXT: stp d13, d12, [sp, #256] // 16-byte Folded Spill6336; CHECK-GI-NEXT: stp d11, d10, [sp, #272] // 16-byte Folded Spill6337; CHECK-GI-NEXT: stp d9, d8, [sp, #288] // 16-byte Folded Spill6338; CHECK-GI-NEXT: stp x29, x30, [sp, #304] // 16-byte Folded Spill6339; CHECK-GI-NEXT: .cfi_def_cfa_offset 3206340; CHECK-GI-NEXT: .cfi_offset w30, -86341; CHECK-GI-NEXT: .cfi_offset w29, -166342; CHECK-GI-NEXT: .cfi_offset b8, -246343; CHECK-GI-NEXT: .cfi_offset b9, -326344; CHECK-GI-NEXT: .cfi_offset b10, -406345; CHECK-GI-NEXT: .cfi_offset b11, -486346; CHECK-GI-NEXT: .cfi_offset b12, -566347; CHECK-GI-NEXT: .cfi_offset b13, -646348; CHECK-GI-NEXT: .cfi_offset b14, -726349; CHECK-GI-NEXT: .cfi_offset b15, -806350; CHECK-GI-NEXT: mov v2.16b, v1.16b6351; CHECK-GI-NEXT: str q1, [sp, #80] // 16-byte Spill6352; CHECK-GI-NEXT: mov h14, v1.h[1]6353; CHECK-GI-NEXT: mov h1, v1.h[2]6354; CHECK-GI-NEXT: mov h15, v0.h[1]6355; CHECK-GI-NEXT: mov h8, v0.h[2]6356; CHECK-GI-NEXT: mov h9, v0.h[3]6357; CHECK-GI-NEXT: mov h10, v0.h[4]6358; CHECK-GI-NEXT: mov h11, v0.h[5]6359; CHECK-GI-NEXT: mov h12, v0.h[6]6360; CHECK-GI-NEXT: mov h13, v0.h[7]6361; CHECK-GI-NEXT: fcvt s0, h06362; CHECK-GI-NEXT: str h1, [sp, #16] // 2-byte Spill6363; CHECK-GI-NEXT: mov h1, v2.h[3]6364; CHECK-GI-NEXT: str h1, [sp, #32] // 2-byte Spill6365; CHECK-GI-NEXT: mov h1, v2.h[4]6366; CHECK-GI-NEXT: str h1, [sp, #48] // 2-byte Spill6367; CHECK-GI-NEXT: mov h1, v2.h[5]6368; CHECK-GI-NEXT: str h1, [sp, #64] // 2-byte Spill6369; CHECK-GI-NEXT: mov h1, v2.h[6]6370; CHECK-GI-NEXT: str h1, [sp, #96] // 2-byte Spill6371; CHECK-GI-NEXT: mov h1, v2.h[7]6372; CHECK-GI-NEXT: str h1, [sp, #160] // 2-byte Spill6373; CHECK-GI-NEXT: bl log10f6374; CHECK-GI-NEXT: fcvt s1, h156375; CHECK-GI-NEXT: fcvt h0, s06376; CHECK-GI-NEXT: str q0, [sp, #192] // 16-byte Spill6377; CHECK-GI-NEXT: fmov s0, s16378; CHECK-GI-NEXT: bl log10f6379; CHECK-GI-NEXT: fcvt s1, h86380; CHECK-GI-NEXT: fcvt h0, s06381; CHECK-GI-NEXT: str q0, [sp, #112] // 16-byte Spill6382; CHECK-GI-NEXT: fmov s0, s16383; CHECK-GI-NEXT: bl log10f6384; CHECK-GI-NEXT: fcvt s1, h96385; CHECK-GI-NEXT: fcvt h0, s06386; CHECK-GI-NEXT: str q0, [sp, #224] // 16-byte Spill6387; CHECK-GI-NEXT: fmov s0, s16388; CHECK-GI-NEXT: bl log10f6389; CHECK-GI-NEXT: fcvt s1, h106390; CHECK-GI-NEXT: fcvt h0, s06391; CHECK-GI-NEXT: str q0, [sp, #208] // 16-byte Spill6392; CHECK-GI-NEXT: fmov s0, s16393; CHECK-GI-NEXT: bl log10f6394; CHECK-GI-NEXT: fcvt s1, h116395; CHECK-GI-NEXT: fcvt h0, s06396; CHECK-GI-NEXT: str q0, [sp, #176] // 16-byte Spill6397; CHECK-GI-NEXT: fmov s0, s16398; CHECK-GI-NEXT: bl log10f6399; CHECK-GI-NEXT: fcvt s1, h126400; CHECK-GI-NEXT: fcvt h0, s06401; CHECK-GI-NEXT: str q0, [sp, #144] // 16-byte Spill6402; CHECK-GI-NEXT: fmov s0, s16403; CHECK-GI-NEXT: bl log10f6404; CHECK-GI-NEXT: fcvt s1, h136405; CHECK-GI-NEXT: fcvt h0, s06406; CHECK-GI-NEXT: str q0, [sp, #128] // 16-byte Spill6407; CHECK-GI-NEXT: fmov s0, s16408; CHECK-GI-NEXT: bl log10f6409; CHECK-GI-NEXT: ldr q1, [sp, #80] // 16-byte Reload6410; CHECK-GI-NEXT: fcvt h0, s06411; CHECK-GI-NEXT: fcvt s1, h16412; CHECK-GI-NEXT: str q0, [sp, #80] // 16-byte Spill6413; CHECK-GI-NEXT: fmov s0, s16414; CHECK-GI-NEXT: bl log10f6415; CHECK-GI-NEXT: fcvt s1, h146416; CHECK-GI-NEXT: fcvt h0, s06417; CHECK-GI-NEXT: str q0, [sp] // 16-byte Spill6418; CHECK-GI-NEXT: fmov s0, s16419; CHECK-GI-NEXT: bl log10f6420; CHECK-GI-NEXT: ldr h1, [sp, #16] // 2-byte Reload6421; CHECK-GI-NEXT: fcvt h0, s06422; CHECK-GI-NEXT: fcvt s1, h16423; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Spill6424; CHECK-GI-NEXT: fmov s0, s16425; CHECK-GI-NEXT: bl log10f6426; CHECK-GI-NEXT: ldr h1, [sp, #32] // 2-byte Reload6427; CHECK-GI-NEXT: fcvt h0, s06428; CHECK-GI-NEXT: fcvt s1, h16429; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Spill6430; CHECK-GI-NEXT: fmov s0, s16431; CHECK-GI-NEXT: bl log10f6432; CHECK-GI-NEXT: ldr h1, [sp, #48] // 2-byte Reload6433; CHECK-GI-NEXT: fcvt h0, s06434; CHECK-GI-NEXT: fcvt s1, h16435; CHECK-GI-NEXT: str q0, [sp, #48] // 16-byte Spill6436; CHECK-GI-NEXT: fmov s0, s16437; CHECK-GI-NEXT: bl log10f6438; CHECK-GI-NEXT: ldr h1, [sp, #64] // 2-byte Reload6439; CHECK-GI-NEXT: fcvt h0, s06440; CHECK-GI-NEXT: fcvt s1, h16441; CHECK-GI-NEXT: str q0, [sp, #64] // 16-byte Spill6442; CHECK-GI-NEXT: fmov s0, s16443; CHECK-GI-NEXT: bl log10f6444; CHECK-GI-NEXT: ldr h1, [sp, #96] // 2-byte Reload6445; CHECK-GI-NEXT: fcvt h0, s06446; CHECK-GI-NEXT: fcvt s1, h16447; CHECK-GI-NEXT: str q0, [sp, #96] // 16-byte Spill6448; CHECK-GI-NEXT: fmov s0, s16449; CHECK-GI-NEXT: bl log10f6450; CHECK-GI-NEXT: ldr h1, [sp, #160] // 2-byte Reload6451; CHECK-GI-NEXT: fcvt h0, s06452; CHECK-GI-NEXT: fcvt s1, h16453; CHECK-GI-NEXT: str q0, [sp, #160] // 16-byte Spill6454; CHECK-GI-NEXT: fmov s0, s16455; CHECK-GI-NEXT: bl log10f6456; CHECK-GI-NEXT: ldr q3, [sp, #192] // 16-byte Reload6457; CHECK-GI-NEXT: ldr q2, [sp, #112] // 16-byte Reload6458; CHECK-GI-NEXT: ldp x29, x30, [sp, #304] // 16-byte Folded Reload6459; CHECK-GI-NEXT: mov v3.h[1], v2.h[0]6460; CHECK-GI-NEXT: ldp q1, q2, [sp] // 32-byte Folded Reload6461; CHECK-GI-NEXT: ldp d9, d8, [sp, #288] // 16-byte Folded Reload6462; CHECK-GI-NEXT: ldp d11, d10, [sp, #272] // 16-byte Folded Reload6463; CHECK-GI-NEXT: mov v1.h[1], v2.h[0]6464; CHECK-GI-NEXT: ldr q2, [sp, #224] // 16-byte Reload6465; CHECK-GI-NEXT: ldp d13, d12, [sp, #256] // 16-byte Folded Reload6466; CHECK-GI-NEXT: mov v3.h[2], v2.h[0]6467; CHECK-GI-NEXT: ldr q2, [sp, #32] // 16-byte Reload6468; CHECK-GI-NEXT: ldp d15, d14, [sp, #240] // 16-byte Folded Reload6469; CHECK-GI-NEXT: mov v1.h[2], v2.h[0]6470; CHECK-GI-NEXT: ldr q2, [sp, #208] // 16-byte Reload6471; CHECK-GI-NEXT: mov v3.h[3], v2.h[0]6472; CHECK-GI-NEXT: ldr q2, [sp, #48] // 16-byte Reload6473; CHECK-GI-NEXT: mov v1.h[3], v2.h[0]6474; CHECK-GI-NEXT: ldr q2, [sp, #176] // 16-byte Reload6475; CHECK-GI-NEXT: mov v3.h[4], v2.h[0]6476; CHECK-GI-NEXT: ldr q2, [sp, #64] // 16-byte Reload6477; CHECK-GI-NEXT: mov v1.h[4], v2.h[0]6478; CHECK-GI-NEXT: ldr q2, [sp, #144] // 16-byte Reload6479; CHECK-GI-NEXT: mov v3.h[5], v2.h[0]6480; CHECK-GI-NEXT: ldr q2, [sp, #96] // 16-byte Reload6481; CHECK-GI-NEXT: mov v1.h[5], v2.h[0]6482; CHECK-GI-NEXT: fcvt h2, s06483; CHECK-GI-NEXT: ldr q0, [sp, #128] // 16-byte Reload6484; CHECK-GI-NEXT: mov v3.h[6], v0.h[0]6485; CHECK-GI-NEXT: ldr q0, [sp, #160] // 16-byte Reload6486; CHECK-GI-NEXT: mov v1.h[6], v0.h[0]6487; CHECK-GI-NEXT: ldr q0, [sp, #80] // 16-byte Reload6488; CHECK-GI-NEXT: mov v3.h[7], v0.h[0]6489; CHECK-GI-NEXT: mov v1.h[7], v2.h[0]6490; CHECK-GI-NEXT: mov v0.16b, v3.16b6491; CHECK-GI-NEXT: add sp, sp, #3206492; CHECK-GI-NEXT: ret6493entry:6494 %c = call <16 x half> @llvm.log10.v16f16(<16 x half> %a)6495 ret <16 x half> %c6496}6497 6498define <2 x fp128> @log10_v2fp128(<2 x fp128> %a) {6499; CHECK-LABEL: log10_v2fp128:6500; CHECK: // %bb.0: // %entry6501; CHECK-NEXT: sub sp, sp, #486502; CHECK-NEXT: str x30, [sp, #32] // 8-byte Spill6503; CHECK-NEXT: .cfi_def_cfa_offset 486504; CHECK-NEXT: .cfi_offset w30, -166505; CHECK-NEXT: str q1, [sp, #16] // 16-byte Spill6506; CHECK-NEXT: bl log10l6507; CHECK-NEXT: str q0, [sp] // 16-byte Spill6508; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload6509; CHECK-NEXT: bl log10l6510; CHECK-NEXT: mov v1.16b, v0.16b6511; CHECK-NEXT: ldr q0, [sp] // 16-byte Reload6512; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Reload6513; CHECK-NEXT: add sp, sp, #486514; CHECK-NEXT: ret6515entry:6516 %c = call <2 x fp128> @llvm.log10.v2fp128(<2 x fp128> %a)6517 ret <2 x fp128> %c6518}6519 6520declare <1 x double> @llvm.exp.v1f64(<1 x double>)6521declare <1 x double> @llvm.exp2.v1f64(<1 x double>)6522declare <1 x double> @llvm.log.v1f64(<1 x double>)6523declare <1 x double> @llvm.log10.v1f64(<1 x double>)6524declare <1 x double> @llvm.log2.v1f64(<1 x double>)6525declare <16 x half> @llvm.exp.v16f16(<16 x half>)6526declare <16 x half> @llvm.exp2.v16f16(<16 x half>)6527declare <16 x half> @llvm.log.v16f16(<16 x half>)6528declare <16 x half> @llvm.log10.v16f16(<16 x half>)6529declare <16 x half> @llvm.log2.v16f16(<16 x half>)6530declare <2 x double> @llvm.exp.v2f64(<2 x double>)6531declare <2 x double> @llvm.exp2.v2f64(<2 x double>)6532declare <2 x double> @llvm.log.v2f64(<2 x double>)6533declare <2 x double> @llvm.log10.v2f64(<2 x double>)6534declare <2 x double> @llvm.log2.v2f64(<2 x double>)6535declare <2 x float> @llvm.exp.v2f32(<2 x float>)6536declare <2 x float> @llvm.exp2.v2f32(<2 x float>)6537declare <2 x float> @llvm.log.v2f32(<2 x float>)6538declare <2 x float> @llvm.log10.v2f32(<2 x float>)6539declare <2 x float> @llvm.log2.v2f32(<2 x float>)6540declare <2 x fp128> @llvm.exp.v2fp128(<2 x fp128>)6541declare <2 x fp128> @llvm.exp2.v2fp128(<2 x fp128>)6542declare <2 x fp128> @llvm.log.v2fp128(<2 x fp128>)6543declare <2 x fp128> @llvm.log10.v2fp128(<2 x fp128>)6544declare <2 x fp128> @llvm.log2.v2fp128(<2 x fp128>)6545declare <3 x double> @llvm.exp.v3f64(<3 x double>)6546declare <3 x double> @llvm.exp2.v3f64(<3 x double>)6547declare <3 x double> @llvm.log.v3f64(<3 x double>)6548declare <3 x double> @llvm.log10.v3f64(<3 x double>)6549declare <3 x double> @llvm.log2.v3f64(<3 x double>)6550declare <3 x float> @llvm.exp.v3f32(<3 x float>)6551declare <3 x float> @llvm.exp2.v3f32(<3 x float>)6552declare <3 x float> @llvm.log.v3f32(<3 x float>)6553declare <3 x float> @llvm.log10.v3f32(<3 x float>)6554declare <3 x float> @llvm.log2.v3f32(<3 x float>)6555declare <4 x double> @llvm.exp.v4f64(<4 x double>)6556declare <4 x double> @llvm.exp2.v4f64(<4 x double>)6557declare <4 x double> @llvm.log.v4f64(<4 x double>)6558declare <4 x double> @llvm.log10.v4f64(<4 x double>)6559declare <4 x double> @llvm.log2.v4f64(<4 x double>)6560declare <4 x float> @llvm.exp.v4f32(<4 x float>)6561declare <4 x float> @llvm.exp2.v4f32(<4 x float>)6562declare <4 x float> @llvm.log.v4f32(<4 x float>)6563declare <4 x float> @llvm.log10.v4f32(<4 x float>)6564declare <4 x float> @llvm.log2.v4f32(<4 x float>)6565declare <4 x half> @llvm.exp.v4f16(<4 x half>)6566declare <4 x half> @llvm.exp2.v4f16(<4 x half>)6567declare <4 x half> @llvm.log.v4f16(<4 x half>)6568declare <4 x half> @llvm.log10.v4f16(<4 x half>)6569declare <4 x half> @llvm.log2.v4f16(<4 x half>)6570declare <7 x half> @llvm.exp.v7f16(<7 x half>)6571declare <7 x half> @llvm.exp2.v7f16(<7 x half>)6572declare <7 x half> @llvm.log.v7f16(<7 x half>)6573declare <7 x half> @llvm.log10.v7f16(<7 x half>)6574declare <7 x half> @llvm.log2.v7f16(<7 x half>)6575declare <8 x float> @llvm.exp.v8f32(<8 x float>)6576declare <8 x float> @llvm.exp2.v8f32(<8 x float>)6577declare <8 x float> @llvm.log.v8f32(<8 x float>)6578declare <8 x float> @llvm.log10.v8f32(<8 x float>)6579declare <8 x float> @llvm.log2.v8f32(<8 x float>)6580declare <8 x half> @llvm.exp.v8f16(<8 x half>)6581declare <8 x half> @llvm.exp2.v8f16(<8 x half>)6582declare <8 x half> @llvm.log.v8f16(<8 x half>)6583declare <8 x half> @llvm.log10.v8f16(<8 x half>)6584declare <8 x half> @llvm.log2.v8f16(<8 x half>)6585declare double @llvm.exp.f64(double)6586declare double @llvm.exp2.f64(double)6587declare double @llvm.log.f64(double)6588declare double @llvm.log10.f64(double)6589declare double @llvm.log2.f64(double)6590declare float @llvm.exp.f32(float)6591declare float @llvm.exp2.f32(float)6592declare float @llvm.log.f32(float)6593declare float @llvm.log10.f32(float)6594declare float @llvm.log2.f32(float)6595declare fp128 @llvm.exp.fp128(fp128)6596declare fp128 @llvm.exp2.fp128(fp128)6597declare fp128 @llvm.log.fp128(fp128)6598declare fp128 @llvm.log10.fp128(fp128)6599declare fp128 @llvm.log2.fp128(fp128)6600declare half @llvm.exp.f16(half)6601declare half @llvm.exp2.f16(half)6602declare half @llvm.log.f16(half)6603declare half @llvm.log10.f16(half)6604declare half @llvm.log2.f16(half)6605