brintos

brintos / llvm-project-archived public Read only

0
0
Text · 28.4 KiB · 0b7690e Raw
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