776 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=aarch64-- | FileCheck %s3 4; PR38527 - https://bugs.llvm.org/show_bug.cgi?id=385275 6; Use fsin as the representative test for various data types.7 8declare <1 x float> @llvm.sin.v1f32(<1 x float>)9declare <2 x float> @llvm.sin.v2f32(<2 x float>)10declare <3 x float> @llvm.sin.v3f32(<3 x float>)11declare <4 x float> @llvm.sin.v4f32(<4 x float>)12declare <5 x float> @llvm.sin.v5f32(<5 x float>)13declare <6 x float> @llvm.sin.v6f32(<6 x float>)14declare <3 x double> @llvm.sin.v3f64(<3 x double>)15 16; Verify that all of the potential libcall candidates are handled.17; Some of these have custom lowering, so those cases won't have18; libcalls.19 20declare <3 x float> @llvm.fabs.v3f32(<3 x float>)21declare <3 x float> @llvm.ceil.v3f32(<3 x float>)22declare <3 x float> @llvm.cos.v3f32(<3 x float>)23declare <3 x float> @llvm.tan.v3f32(<3 x float>)24declare <3 x float> @llvm.asin.v3f32(<3 x float>)25declare <3 x float> @llvm.acos.v3f32(<3 x float>)26declare <3 x float> @llvm.atan.v3f32(<3 x float>)27declare <3 x float> @llvm.atan2.v3f32(<3 x float>, <3 x float>)28declare <3 x float> @llvm.sinh.v3f32(<3 x float>)29declare <3 x float> @llvm.cosh.v3f32(<3 x float>)30declare <3 x float> @llvm.tanh.v3f32(<3 x float>)31declare <3 x float> @llvm.exp.v3f32(<3 x float>)32declare <3 x float> @llvm.exp2.v3f32(<3 x float>)33declare <3 x float> @llvm.floor.v3f32(<3 x float>)34declare <3 x float> @llvm.log.v3f32(<3 x float>)35declare <3 x float> @llvm.log10.v3f32(<3 x float>)36declare <3 x float> @llvm.log2.v3f32(<3 x float>)37declare <3 x float> @llvm.nearbyint.v3f32(<3 x float>)38declare <3 x float> @llvm.rint.v3f32(<3 x float>)39declare <3 x float> @llvm.round.v3f32(<3 x float>)40declare <3 x float> @llvm.roundeven.v3f32(<3 x float>)41declare <3 x float> @llvm.sqrt.v3f32(<3 x float>)42declare <3 x float> @llvm.trunc.v3f32(<3 x float>)43 44define <1 x float> @sin_v1f32(<1 x float> %x) nounwind {45; CHECK-LABEL: sin_v1f32:46; CHECK: // %bb.0:47; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill48; CHECK-NEXT: // kill: def $d0 killed $d0 def $q049; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q050; CHECK-NEXT: bl sinf51; CHECK-NEXT: // kill: def $s0 killed $s0 def $d052; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload53; CHECK-NEXT: ret54 %r = call <1 x float> @llvm.sin.v1f32(<1 x float> %x)55 ret <1 x float> %r56}57 58define <2 x float> @sin_v2f32(<2 x float> %x) nounwind {59; CHECK-LABEL: sin_v2f32:60; CHECK: // %bb.0:61; CHECK-NEXT: sub sp, sp, #4862; CHECK-NEXT: // kill: def $d0 killed $d0 def $q063; CHECK-NEXT: str q0, [sp] // 16-byte Spill64; CHECK-NEXT: mov s0, v0.s[1]65; CHECK-NEXT: str x30, [sp, #32] // 8-byte Spill66; CHECK-NEXT: bl sinf67; CHECK-NEXT: // kill: def $s0 killed $s0 def $q068; CHECK-NEXT: str q0, [sp, #16] // 16-byte Spill69; CHECK-NEXT: ldr q0, [sp] // 16-byte Reload70; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q071; CHECK-NEXT: bl sinf72; CHECK-NEXT: ldr q1, [sp, #16] // 16-byte Reload73; CHECK-NEXT: // kill: def $s0 killed $s0 def $q074; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Reload75; CHECK-NEXT: mov v0.s[1], v1.s[0]76; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q077; CHECK-NEXT: add sp, sp, #4878; CHECK-NEXT: ret79 %r = call <2 x float> @llvm.sin.v2f32(<2 x float> %x)80 ret <2 x float> %r81}82 83define <3 x float> @sin_v3f32(<3 x float> %x) nounwind {84; CHECK-LABEL: sin_v3f32:85; CHECK: // %bb.0:86; CHECK-NEXT: sub sp, sp, #4887; CHECK-NEXT: str q0, [sp, #16] // 16-byte Spill88; CHECK-NEXT: mov s0, v0.s[1]89; CHECK-NEXT: str x30, [sp, #32] // 8-byte Spill90; CHECK-NEXT: bl sinf91; CHECK-NEXT: // kill: def $s0 killed $s0 def $q092; CHECK-NEXT: str q0, [sp] // 16-byte Spill93; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload94; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q095; CHECK-NEXT: bl sinf96; CHECK-NEXT: ldr q1, [sp] // 16-byte Reload97; CHECK-NEXT: // kill: def $s0 killed $s0 def $q098; CHECK-NEXT: mov v0.s[1], v1.s[0]99; CHECK-NEXT: str q0, [sp] // 16-byte Spill100; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload101; CHECK-NEXT: mov s0, v0.s[2]102; CHECK-NEXT: bl sinf103; CHECK-NEXT: ldr q1, [sp] // 16-byte Reload104; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0105; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Reload106; CHECK-NEXT: mov v1.s[2], v0.s[0]107; CHECK-NEXT: mov v0.16b, v1.16b108; CHECK-NEXT: add sp, sp, #48109; CHECK-NEXT: ret110 %r = call <3 x float> @llvm.sin.v3f32(<3 x float> %x)111 ret <3 x float> %r112}113 114define <4 x float> @sin_v4f32(<4 x float> %x) nounwind {115; CHECK-LABEL: sin_v4f32:116; CHECK: // %bb.0:117; CHECK-NEXT: sub sp, sp, #48118; CHECK-NEXT: str q0, [sp, #16] // 16-byte Spill119; CHECK-NEXT: mov s0, v0.s[1]120; CHECK-NEXT: str x30, [sp, #32] // 8-byte Spill121; CHECK-NEXT: bl sinf122; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0123; CHECK-NEXT: str q0, [sp] // 16-byte Spill124; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload125; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0126; CHECK-NEXT: bl sinf127; CHECK-NEXT: ldr q1, [sp] // 16-byte Reload128; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0129; CHECK-NEXT: mov v0.s[1], v1.s[0]130; CHECK-NEXT: str q0, [sp] // 16-byte Spill131; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload132; CHECK-NEXT: mov s0, v0.s[2]133; CHECK-NEXT: bl sinf134; CHECK-NEXT: ldr q1, [sp] // 16-byte Reload135; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0136; CHECK-NEXT: mov v1.s[2], v0.s[0]137; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload138; CHECK-NEXT: mov s0, v0.s[3]139; CHECK-NEXT: str q1, [sp] // 16-byte Spill140; CHECK-NEXT: bl sinf141; CHECK-NEXT: ldr q1, [sp] // 16-byte Reload142; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0143; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Reload144; CHECK-NEXT: mov v1.s[3], v0.s[0]145; CHECK-NEXT: mov v0.16b, v1.16b146; CHECK-NEXT: add sp, sp, #48147; CHECK-NEXT: ret148 %r = call <4 x float> @llvm.sin.v4f32(<4 x float> %x)149 ret <4 x float> %r150}151 152define <5 x float> @sin_v5f32(<5 x float> %x) nounwind {153; CHECK-LABEL: sin_v5f32:154; CHECK: // %bb.0:155; CHECK-NEXT: str d12, [sp, #-48]! // 8-byte Folded Spill156; CHECK-NEXT: stp d11, d10, [sp, #8] // 16-byte Folded Spill157; CHECK-NEXT: fmov s10, s2158; CHECK-NEXT: fmov s11, s1159; CHECK-NEXT: stp d9, d8, [sp, #24] // 16-byte Folded Spill160; CHECK-NEXT: fmov s8, s4161; CHECK-NEXT: fmov s9, s3162; CHECK-NEXT: str x30, [sp, #40] // 8-byte Spill163; CHECK-NEXT: bl sinf164; CHECK-NEXT: fmov s12, s0165; CHECK-NEXT: fmov s0, s11166; CHECK-NEXT: bl sinf167; CHECK-NEXT: fmov s11, s0168; CHECK-NEXT: fmov s0, s10169; CHECK-NEXT: bl sinf170; CHECK-NEXT: fmov s10, s0171; CHECK-NEXT: fmov s0, s9172; CHECK-NEXT: bl sinf173; CHECK-NEXT: fmov s9, s0174; CHECK-NEXT: fmov s0, s8175; CHECK-NEXT: bl sinf176; CHECK-NEXT: fmov s1, s11177; CHECK-NEXT: fmov s2, s10178; CHECK-NEXT: ldr x30, [sp, #40] // 8-byte Reload179; CHECK-NEXT: fmov s3, s9180; CHECK-NEXT: ldp d9, d8, [sp, #24] // 16-byte Folded Reload181; CHECK-NEXT: ldp d11, d10, [sp, #8] // 16-byte Folded Reload182; CHECK-NEXT: fmov s4, s0183; CHECK-NEXT: fmov s0, s12184; CHECK-NEXT: ldr d12, [sp], #48 // 8-byte Folded Reload185; CHECK-NEXT: ret186 %r = call <5 x float> @llvm.sin.v5f32(<5 x float> %x)187 ret <5 x float> %r188}189 190define <6 x float> @sin_v6f32(<6 x float> %x) nounwind {191; CHECK-LABEL: sin_v6f32:192; CHECK: // %bb.0:193; CHECK-NEXT: stp d13, d12, [sp, #-64]! // 16-byte Folded Spill194; CHECK-NEXT: stp d11, d10, [sp, #16] // 16-byte Folded Spill195; CHECK-NEXT: fmov s10, s3196; CHECK-NEXT: fmov s11, s2197; CHECK-NEXT: stp d9, d8, [sp, #32] // 16-byte Folded Spill198; CHECK-NEXT: fmov s8, s5199; CHECK-NEXT: fmov s9, s4200; CHECK-NEXT: str x30, [sp, #48] // 8-byte Spill201; CHECK-NEXT: fmov s12, s1202; CHECK-NEXT: bl sinf203; CHECK-NEXT: fmov s13, s0204; CHECK-NEXT: fmov s0, s12205; CHECK-NEXT: bl sinf206; CHECK-NEXT: fmov s12, s0207; CHECK-NEXT: fmov s0, s11208; CHECK-NEXT: bl sinf209; CHECK-NEXT: fmov s11, s0210; CHECK-NEXT: fmov s0, s10211; CHECK-NEXT: bl sinf212; CHECK-NEXT: fmov s10, s0213; CHECK-NEXT: fmov s0, s9214; CHECK-NEXT: bl sinf215; CHECK-NEXT: fmov s9, s0216; CHECK-NEXT: fmov s0, s8217; CHECK-NEXT: bl sinf218; CHECK-NEXT: fmov s2, s11219; CHECK-NEXT: fmov s3, s10220; CHECK-NEXT: ldr x30, [sp, #48] // 8-byte Reload221; CHECK-NEXT: fmov s4, s9222; CHECK-NEXT: ldp d9, d8, [sp, #32] // 16-byte Folded Reload223; CHECK-NEXT: ldp d11, d10, [sp, #16] // 16-byte Folded Reload224; CHECK-NEXT: fmov s5, s0225; CHECK-NEXT: fmov s0, s13226; CHECK-NEXT: fmov s1, s12227; CHECK-NEXT: ldp d13, d12, [sp], #64 // 16-byte Folded Reload228; CHECK-NEXT: ret229 %r = call <6 x float> @llvm.sin.v6f32(<6 x float> %x)230 ret <6 x float> %r231}232 233define <3 x double> @sin_v3f64(<3 x double> %x) nounwind {234; CHECK-LABEL: sin_v3f64:235; CHECK: // %bb.0:236; CHECK-NEXT: str d10, [sp, #-32]! // 8-byte Folded Spill237; CHECK-NEXT: stp d9, d8, [sp, #8] // 16-byte Folded Spill238; CHECK-NEXT: fmov d8, d2239; CHECK-NEXT: fmov d9, d1240; CHECK-NEXT: str x30, [sp, #24] // 8-byte Spill241; CHECK-NEXT: bl sin242; CHECK-NEXT: fmov d10, d0243; CHECK-NEXT: fmov d0, d9244; CHECK-NEXT: bl sin245; CHECK-NEXT: fmov d9, d0246; CHECK-NEXT: fmov d0, d8247; CHECK-NEXT: bl sin248; CHECK-NEXT: fmov d1, d9249; CHECK-NEXT: ldp d9, d8, [sp, #8] // 16-byte Folded Reload250; CHECK-NEXT: ldr x30, [sp, #24] // 8-byte Reload251; CHECK-NEXT: fmov d2, d0252; CHECK-NEXT: fmov d0, d10253; CHECK-NEXT: ldr d10, [sp], #32 // 8-byte Folded Reload254; CHECK-NEXT: ret255 %r = call <3 x double> @llvm.sin.v3f64(<3 x double> %x)256 ret <3 x double> %r257}258 259define <3 x float> @fabs_v3f32(<3 x float> %x) nounwind {260; CHECK-LABEL: fabs_v3f32:261; CHECK: // %bb.0:262; CHECK-NEXT: fabs v0.4s, v0.4s263; CHECK-NEXT: ret264 %r = call <3 x float> @llvm.fabs.v3f32(<3 x float> %x)265 ret <3 x float> %r266}267 268define <3 x float> @ceil_v3f32(<3 x float> %x) nounwind {269; CHECK-LABEL: ceil_v3f32:270; CHECK: // %bb.0:271; CHECK-NEXT: frintp v0.4s, v0.4s272; CHECK-NEXT: ret273 %r = call <3 x float> @llvm.ceil.v3f32(<3 x float> %x)274 ret <3 x float> %r275}276 277define <3 x float> @cos_v3f32(<3 x float> %x) nounwind {278; CHECK-LABEL: cos_v3f32:279; CHECK: // %bb.0:280; CHECK-NEXT: sub sp, sp, #48281; CHECK-NEXT: str q0, [sp, #16] // 16-byte Spill282; CHECK-NEXT: mov s0, v0.s[1]283; CHECK-NEXT: str x30, [sp, #32] // 8-byte Spill284; CHECK-NEXT: bl cosf285; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0286; CHECK-NEXT: str q0, [sp] // 16-byte Spill287; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload288; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0289; CHECK-NEXT: bl cosf290; CHECK-NEXT: ldr q1, [sp] // 16-byte Reload291; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0292; CHECK-NEXT: mov v0.s[1], v1.s[0]293; CHECK-NEXT: str q0, [sp] // 16-byte Spill294; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload295; CHECK-NEXT: mov s0, v0.s[2]296; CHECK-NEXT: bl cosf297; CHECK-NEXT: ldr q1, [sp] // 16-byte Reload298; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0299; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Reload300; CHECK-NEXT: mov v1.s[2], v0.s[0]301; CHECK-NEXT: mov v0.16b, v1.16b302; CHECK-NEXT: add sp, sp, #48303; CHECK-NEXT: ret304 %r = call <3 x float> @llvm.cos.v3f32(<3 x float> %x)305 ret <3 x float> %r306}307 308define <3 x float> @tan_v3f32(<3 x float> %x) nounwind {309; CHECK-LABEL: tan_v3f32:310; CHECK: // %bb.0:311; CHECK-NEXT: sub sp, sp, #48312; CHECK-NEXT: str q0, [sp, #16] // 16-byte Spill313; CHECK-NEXT: mov s0, v0.s[1]314; CHECK-NEXT: str x30, [sp, #32] // 8-byte Spill315; CHECK-NEXT: bl tanf316; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0317; CHECK-NEXT: str q0, [sp] // 16-byte Spill318; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload319; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0320; CHECK-NEXT: bl tanf321; CHECK-NEXT: ldr q1, [sp] // 16-byte Reload322; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0323; CHECK-NEXT: mov v0.s[1], v1.s[0]324; CHECK-NEXT: str q0, [sp] // 16-byte Spill325; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload326; CHECK-NEXT: mov s0, v0.s[2]327; CHECK-NEXT: bl tanf328; CHECK-NEXT: ldr q1, [sp] // 16-byte Reload329; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0330; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Reload331; CHECK-NEXT: mov v1.s[2], v0.s[0]332; CHECK-NEXT: mov v0.16b, v1.16b333; CHECK-NEXT: add sp, sp, #48334; CHECK-NEXT: ret335 %r = call <3 x float> @llvm.tan.v3f32(<3 x float> %x)336 ret <3 x float> %r337}338 339define <3 x float> @asin_v3f32(<3 x float> %x) nounwind {340; CHECK-LABEL: asin_v3f32:341; CHECK: // %bb.0:342; CHECK-NEXT: sub sp, sp, #48343; CHECK-NEXT: str q0, [sp, #16] // 16-byte Spill344; CHECK-NEXT: mov s0, v0.s[1]345; CHECK-NEXT: str x30, [sp, #32] // 8-byte Spill346; CHECK-NEXT: bl asinf347; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0348; CHECK-NEXT: str q0, [sp] // 16-byte Spill349; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload350; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0351; CHECK-NEXT: bl asinf352; CHECK-NEXT: ldr q1, [sp] // 16-byte Reload353; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0354; CHECK-NEXT: mov v0.s[1], v1.s[0]355; CHECK-NEXT: str q0, [sp] // 16-byte Spill356; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload357; CHECK-NEXT: mov s0, v0.s[2]358; CHECK-NEXT: bl asinf359; CHECK-NEXT: ldr q1, [sp] // 16-byte Reload360; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0361; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Reload362; CHECK-NEXT: mov v1.s[2], v0.s[0]363; CHECK-NEXT: mov v0.16b, v1.16b364; CHECK-NEXT: add sp, sp, #48365; CHECK-NEXT: ret366 %r = call <3 x float> @llvm.asin.v3f32(<3 x float> %x)367 ret <3 x float> %r368}369 370define <3 x float> @acos_v3f32(<3 x float> %x) nounwind {371; CHECK-LABEL: acos_v3f32:372; CHECK: // %bb.0:373; CHECK-NEXT: sub sp, sp, #48374; CHECK-NEXT: str q0, [sp, #16] // 16-byte Spill375; CHECK-NEXT: mov s0, v0.s[1]376; CHECK-NEXT: str x30, [sp, #32] // 8-byte Spill377; CHECK-NEXT: bl acosf378; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0379; CHECK-NEXT: str q0, [sp] // 16-byte Spill380; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload381; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0382; CHECK-NEXT: bl acosf383; CHECK-NEXT: ldr q1, [sp] // 16-byte Reload384; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0385; CHECK-NEXT: mov v0.s[1], v1.s[0]386; CHECK-NEXT: str q0, [sp] // 16-byte Spill387; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload388; CHECK-NEXT: mov s0, v0.s[2]389; CHECK-NEXT: bl acosf390; CHECK-NEXT: ldr q1, [sp] // 16-byte Reload391; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0392; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Reload393; CHECK-NEXT: mov v1.s[2], v0.s[0]394; CHECK-NEXT: mov v0.16b, v1.16b395; CHECK-NEXT: add sp, sp, #48396; CHECK-NEXT: ret397 %r = call <3 x float> @llvm.acos.v3f32(<3 x float> %x)398 ret <3 x float> %r399}400 401define <3 x float> @atan_v3f32(<3 x float> %x) nounwind {402; CHECK-LABEL: atan_v3f32:403; CHECK: // %bb.0:404; CHECK-NEXT: sub sp, sp, #48405; CHECK-NEXT: str q0, [sp, #16] // 16-byte Spill406; CHECK-NEXT: mov s0, v0.s[1]407; CHECK-NEXT: str x30, [sp, #32] // 8-byte Spill408; CHECK-NEXT: bl atanf409; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0410; CHECK-NEXT: str q0, [sp] // 16-byte Spill411; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload412; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0413; CHECK-NEXT: bl atanf414; CHECK-NEXT: ldr q1, [sp] // 16-byte Reload415; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0416; CHECK-NEXT: mov v0.s[1], v1.s[0]417; CHECK-NEXT: str q0, [sp] // 16-byte Spill418; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload419; CHECK-NEXT: mov s0, v0.s[2]420; CHECK-NEXT: bl atanf421; CHECK-NEXT: ldr q1, [sp] // 16-byte Reload422; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0423; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Reload424; CHECK-NEXT: mov v1.s[2], v0.s[0]425; CHECK-NEXT: mov v0.16b, v1.16b426; CHECK-NEXT: add sp, sp, #48427; CHECK-NEXT: ret428 %r = call <3 x float> @llvm.atan.v3f32(<3 x float> %x)429 ret <3 x float> %r430}431 432define <3 x float> @atan2_v3f32(<3 x float> %x, <3 x float> %y) nounwind {433; CHECK-LABEL: atan2_v3f32:434; CHECK: // %bb.0:435; CHECK-NEXT: sub sp, sp, #64436; CHECK-NEXT: stp q0, q1, [sp, #16] // 32-byte Folded Spill437; CHECK-NEXT: mov s0, v0.s[1]438; CHECK-NEXT: mov s1, v1.s[1]439; CHECK-NEXT: str x30, [sp, #48] // 8-byte Spill440; CHECK-NEXT: bl atan2f441; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0442; CHECK-NEXT: str q0, [sp] // 16-byte Spill443; CHECK-NEXT: ldp q0, q1, [sp, #16] // 32-byte Folded Reload444; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0445; CHECK-NEXT: // kill: def $s1 killed $s1 killed $q1446; CHECK-NEXT: bl atan2f447; CHECK-NEXT: ldr q1, [sp] // 16-byte Reload448; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0449; CHECK-NEXT: mov v0.s[1], v1.s[0]450; CHECK-NEXT: str q0, [sp] // 16-byte Spill451; CHECK-NEXT: ldp q0, q1, [sp, #16] // 32-byte Folded Reload452; CHECK-NEXT: mov s0, v0.s[2]453; CHECK-NEXT: mov s1, v1.s[2]454; CHECK-NEXT: bl atan2f455; CHECK-NEXT: ldr q1, [sp] // 16-byte Reload456; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0457; CHECK-NEXT: ldr x30, [sp, #48] // 8-byte Reload458; CHECK-NEXT: mov v1.s[2], v0.s[0]459; CHECK-NEXT: mov v0.16b, v1.16b460; CHECK-NEXT: add sp, sp, #64461; CHECK-NEXT: ret462 %r = call <3 x float> @llvm.atan2.v3f32(<3 x float> %x, <3 x float> %y)463 ret <3 x float> %r464}465 466define <3 x float> @sinh_v3f32(<3 x float> %x) nounwind {467; CHECK-LABEL: sinh_v3f32:468; CHECK: // %bb.0:469; CHECK-NEXT: sub sp, sp, #48470; CHECK-NEXT: str q0, [sp, #16] // 16-byte Spill471; CHECK-NEXT: mov s0, v0.s[1]472; CHECK-NEXT: str x30, [sp, #32] // 8-byte Spill473; CHECK-NEXT: bl sinhf474; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0475; CHECK-NEXT: str q0, [sp] // 16-byte Spill476; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload477; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0478; CHECK-NEXT: bl sinhf479; CHECK-NEXT: ldr q1, [sp] // 16-byte Reload480; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0481; CHECK-NEXT: mov v0.s[1], v1.s[0]482; CHECK-NEXT: str q0, [sp] // 16-byte Spill483; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload484; CHECK-NEXT: mov s0, v0.s[2]485; CHECK-NEXT: bl sinhf486; CHECK-NEXT: ldr q1, [sp] // 16-byte Reload487; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0488; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Reload489; CHECK-NEXT: mov v1.s[2], v0.s[0]490; CHECK-NEXT: mov v0.16b, v1.16b491; CHECK-NEXT: add sp, sp, #48492; CHECK-NEXT: ret493 %r = call <3 x float> @llvm.sinh.v3f32(<3 x float> %x)494 ret <3 x float> %r495}496define <3 x float> @cosh_v3f32(<3 x float> %x) nounwind {497; CHECK-LABEL: cosh_v3f32:498; CHECK: // %bb.0:499; CHECK-NEXT: sub sp, sp, #48500; CHECK-NEXT: str q0, [sp, #16] // 16-byte Spill501; CHECK-NEXT: mov s0, v0.s[1]502; CHECK-NEXT: str x30, [sp, #32] // 8-byte Spill503; CHECK-NEXT: bl coshf504; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0505; CHECK-NEXT: str q0, [sp] // 16-byte Spill506; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload507; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0508; CHECK-NEXT: bl coshf509; CHECK-NEXT: ldr q1, [sp] // 16-byte Reload510; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0511; CHECK-NEXT: mov v0.s[1], v1.s[0]512; CHECK-NEXT: str q0, [sp] // 16-byte Spill513; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload514; CHECK-NEXT: mov s0, v0.s[2]515; CHECK-NEXT: bl coshf516; CHECK-NEXT: ldr q1, [sp] // 16-byte Reload517; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0518; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Reload519; CHECK-NEXT: mov v1.s[2], v0.s[0]520; CHECK-NEXT: mov v0.16b, v1.16b521; CHECK-NEXT: add sp, sp, #48522; CHECK-NEXT: ret523 %r = call <3 x float> @llvm.cosh.v3f32(<3 x float> %x)524 ret <3 x float> %r525}526 527define <3 x float> @tanh_v3f32(<3 x float> %x) nounwind {528; CHECK-LABEL: tanh_v3f32:529; CHECK: // %bb.0:530; CHECK-NEXT: sub sp, sp, #48531; CHECK-NEXT: str q0, [sp, #16] // 16-byte Spill532; CHECK-NEXT: mov s0, v0.s[1]533; CHECK-NEXT: str x30, [sp, #32] // 8-byte Spill534; CHECK-NEXT: bl tanhf535; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0536; CHECK-NEXT: str q0, [sp] // 16-byte Spill537; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload538; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0539; CHECK-NEXT: bl tanhf540; CHECK-NEXT: ldr q1, [sp] // 16-byte Reload541; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0542; CHECK-NEXT: mov v0.s[1], v1.s[0]543; CHECK-NEXT: str q0, [sp] // 16-byte Spill544; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload545; CHECK-NEXT: mov s0, v0.s[2]546; CHECK-NEXT: bl tanhf547; CHECK-NEXT: ldr q1, [sp] // 16-byte Reload548; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0549; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Reload550; CHECK-NEXT: mov v1.s[2], v0.s[0]551; CHECK-NEXT: mov v0.16b, v1.16b552; CHECK-NEXT: add sp, sp, #48553; CHECK-NEXT: ret554 %r = call <3 x float> @llvm.tanh.v3f32(<3 x float> %x)555 ret <3 x float> %r556}557 558define <3 x float> @exp_v3f32(<3 x float> %x) nounwind {559; CHECK-LABEL: exp_v3f32:560; CHECK: // %bb.0:561; CHECK-NEXT: sub sp, sp, #48562; CHECK-NEXT: str q0, [sp, #16] // 16-byte Spill563; CHECK-NEXT: mov s0, v0.s[1]564; CHECK-NEXT: str x30, [sp, #32] // 8-byte Spill565; CHECK-NEXT: bl expf566; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0567; CHECK-NEXT: str q0, [sp] // 16-byte Spill568; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload569; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0570; CHECK-NEXT: bl expf571; CHECK-NEXT: ldr q1, [sp] // 16-byte Reload572; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0573; CHECK-NEXT: mov v0.s[1], v1.s[0]574; CHECK-NEXT: str q0, [sp] // 16-byte Spill575; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload576; CHECK-NEXT: mov s0, v0.s[2]577; CHECK-NEXT: bl expf578; CHECK-NEXT: ldr q1, [sp] // 16-byte Reload579; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0580; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Reload581; CHECK-NEXT: mov v1.s[2], v0.s[0]582; CHECK-NEXT: mov v0.16b, v1.16b583; CHECK-NEXT: add sp, sp, #48584; CHECK-NEXT: ret585 %r = call <3 x float> @llvm.exp.v3f32(<3 x float> %x)586 ret <3 x float> %r587}588 589define <3 x float> @exp2_v3f32(<3 x float> %x) nounwind {590; CHECK-LABEL: exp2_v3f32:591; CHECK: // %bb.0:592; CHECK-NEXT: sub sp, sp, #48593; CHECK-NEXT: str q0, [sp, #16] // 16-byte Spill594; CHECK-NEXT: mov s0, v0.s[1]595; CHECK-NEXT: str x30, [sp, #32] // 8-byte Spill596; CHECK-NEXT: bl exp2f597; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0598; CHECK-NEXT: str q0, [sp] // 16-byte Spill599; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload600; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0601; CHECK-NEXT: bl exp2f602; CHECK-NEXT: ldr q1, [sp] // 16-byte Reload603; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0604; CHECK-NEXT: mov v0.s[1], v1.s[0]605; CHECK-NEXT: str q0, [sp] // 16-byte Spill606; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload607; CHECK-NEXT: mov s0, v0.s[2]608; CHECK-NEXT: bl exp2f609; CHECK-NEXT: ldr q1, [sp] // 16-byte Reload610; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0611; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Reload612; CHECK-NEXT: mov v1.s[2], v0.s[0]613; CHECK-NEXT: mov v0.16b, v1.16b614; CHECK-NEXT: add sp, sp, #48615; CHECK-NEXT: ret616 %r = call <3 x float> @llvm.exp2.v3f32(<3 x float> %x)617 ret <3 x float> %r618}619 620define <3 x float> @floor_v3f32(<3 x float> %x) nounwind {621; CHECK-LABEL: floor_v3f32:622; CHECK: // %bb.0:623; CHECK-NEXT: frintm v0.4s, v0.4s624; CHECK-NEXT: ret625 %r = call <3 x float> @llvm.floor.v3f32(<3 x float> %x)626 ret <3 x float> %r627}628 629define <3 x float> @log_v3f32(<3 x float> %x) nounwind {630; CHECK-LABEL: log_v3f32:631; CHECK: // %bb.0:632; CHECK-NEXT: sub sp, sp, #48633; CHECK-NEXT: str q0, [sp, #16] // 16-byte Spill634; CHECK-NEXT: mov s0, v0.s[1]635; CHECK-NEXT: str x30, [sp, #32] // 8-byte Spill636; CHECK-NEXT: bl logf637; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0638; CHECK-NEXT: str q0, [sp] // 16-byte Spill639; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload640; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0641; CHECK-NEXT: bl logf642; CHECK-NEXT: ldr q1, [sp] // 16-byte Reload643; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0644; CHECK-NEXT: mov v0.s[1], v1.s[0]645; CHECK-NEXT: str q0, [sp] // 16-byte Spill646; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload647; CHECK-NEXT: mov s0, v0.s[2]648; CHECK-NEXT: bl logf649; CHECK-NEXT: ldr q1, [sp] // 16-byte Reload650; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0651; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Reload652; CHECK-NEXT: mov v1.s[2], v0.s[0]653; CHECK-NEXT: mov v0.16b, v1.16b654; CHECK-NEXT: add sp, sp, #48655; CHECK-NEXT: ret656 %r = call <3 x float> @llvm.log.v3f32(<3 x float> %x)657 ret <3 x float> %r658}659 660define <3 x float> @log10_v3f32(<3 x float> %x) nounwind {661; CHECK-LABEL: log10_v3f32:662; CHECK: // %bb.0:663; CHECK-NEXT: sub sp, sp, #48664; CHECK-NEXT: str q0, [sp, #16] // 16-byte Spill665; CHECK-NEXT: mov s0, v0.s[1]666; CHECK-NEXT: str x30, [sp, #32] // 8-byte Spill667; CHECK-NEXT: bl log10f668; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0669; CHECK-NEXT: str q0, [sp] // 16-byte Spill670; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload671; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0672; CHECK-NEXT: bl log10f673; CHECK-NEXT: ldr q1, [sp] // 16-byte Reload674; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0675; CHECK-NEXT: mov v0.s[1], v1.s[0]676; CHECK-NEXT: str q0, [sp] // 16-byte Spill677; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload678; CHECK-NEXT: mov s0, v0.s[2]679; CHECK-NEXT: bl log10f680; CHECK-NEXT: ldr q1, [sp] // 16-byte Reload681; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0682; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Reload683; CHECK-NEXT: mov v1.s[2], v0.s[0]684; CHECK-NEXT: mov v0.16b, v1.16b685; CHECK-NEXT: add sp, sp, #48686; CHECK-NEXT: ret687 %r = call <3 x float> @llvm.log10.v3f32(<3 x float> %x)688 ret <3 x float> %r689}690 691define <3 x float> @log2_v3f32(<3 x float> %x) nounwind {692; CHECK-LABEL: log2_v3f32:693; CHECK: // %bb.0:694; CHECK-NEXT: sub sp, sp, #48695; CHECK-NEXT: str q0, [sp, #16] // 16-byte Spill696; CHECK-NEXT: mov s0, v0.s[1]697; CHECK-NEXT: str x30, [sp, #32] // 8-byte Spill698; CHECK-NEXT: bl log2f699; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0700; CHECK-NEXT: str q0, [sp] // 16-byte Spill701; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload702; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0703; CHECK-NEXT: bl log2f704; CHECK-NEXT: ldr q1, [sp] // 16-byte Reload705; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0706; CHECK-NEXT: mov v0.s[1], v1.s[0]707; CHECK-NEXT: str q0, [sp] // 16-byte Spill708; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Reload709; CHECK-NEXT: mov s0, v0.s[2]710; CHECK-NEXT: bl log2f711; CHECK-NEXT: ldr q1, [sp] // 16-byte Reload712; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0713; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Reload714; CHECK-NEXT: mov v1.s[2], v0.s[0]715; CHECK-NEXT: mov v0.16b, v1.16b716; CHECK-NEXT: add sp, sp, #48717; CHECK-NEXT: ret718 %r = call <3 x float> @llvm.log2.v3f32(<3 x float> %x)719 ret <3 x float> %r720}721 722define <3 x float> @nearbyint__v3f32(<3 x float> %x) nounwind {723; CHECK-LABEL: nearbyint__v3f32:724; CHECK: // %bb.0:725; CHECK-NEXT: frinti v0.4s, v0.4s726; CHECK-NEXT: ret727 %r = call <3 x float> @llvm.nearbyint.v3f32(<3 x float> %x)728 ret <3 x float> %r729}730 731define <3 x float> @rint_v3f32(<3 x float> %x) nounwind {732; CHECK-LABEL: rint_v3f32:733; CHECK: // %bb.0:734; CHECK-NEXT: frintx v0.4s, v0.4s735; CHECK-NEXT: ret736 %r = call <3 x float> @llvm.rint.v3f32(<3 x float> %x)737 ret <3 x float> %r738}739 740define <3 x float> @round_v3f32(<3 x float> %x) nounwind {741; CHECK-LABEL: round_v3f32:742; CHECK: // %bb.0:743; CHECK-NEXT: frinta v0.4s, v0.4s744; CHECK-NEXT: ret745 %r = call <3 x float> @llvm.round.v3f32(<3 x float> %x)746 ret <3 x float> %r747}748 749define <3 x float> @roundeven_v3f32(<3 x float> %x) nounwind {750; CHECK-LABEL: roundeven_v3f32:751; CHECK: // %bb.0:752; CHECK-NEXT: frintn v0.4s, v0.4s753; CHECK-NEXT: ret754 %r = call <3 x float> @llvm.roundeven.v3f32(<3 x float> %x)755 ret <3 x float> %r756}757 758define <3 x float> @sqrt_v3f32(<3 x float> %x) nounwind {759; CHECK-LABEL: sqrt_v3f32:760; CHECK: // %bb.0:761; CHECK-NEXT: fsqrt v0.4s, v0.4s762; CHECK-NEXT: ret763 %r = call <3 x float> @llvm.sqrt.v3f32(<3 x float> %x)764 ret <3 x float> %r765}766 767define <3 x float> @trunc_v3f32(<3 x float> %x) nounwind {768; CHECK-LABEL: trunc_v3f32:769; CHECK: // %bb.0:770; CHECK-NEXT: frintz v0.4s, v0.4s771; CHECK-NEXT: ret772 %r = call <3 x float> @llvm.trunc.v3f32(<3 x float> %x)773 ret <3 x float> %r774}775 776