1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=aarch64-- | FileCheck %s 3 4; PR38527 - https://bugs.llvm.org/show_bug.cgi?id=38527 5 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 have 18; 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 Spill 48; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 49; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0 50; CHECK-NEXT: bl sinf 51; CHECK-NEXT: // kill: def $s0 killed $s0 def $d0 52; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 53; CHECK-NEXT: ret 54 %r = call <1 x float> @llvm.sin.v1f32(<1 x float> %x) 55 ret <1 x float> %r 56} 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, #48 62; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 63; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 64; CHECK-NEXT: mov s0, v0.s[1] 65; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 66; CHECK-NEXT: bl sinf 67; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 68; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 69; CHECK-NEXT: ldr q0, [sp] // 16-byte Folded Reload 70; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0 71; CHECK-NEXT: bl sinf 72; CHECK-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 73; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 74; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 75; CHECK-NEXT: mov v0.s[1], v1.s[0] 76; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0 77; CHECK-NEXT: add sp, sp, #48 78; CHECK-NEXT: ret 79 %r = call <2 x float> @llvm.sin.v2f32(<2 x float> %x) 80 ret <2 x float> %r 81} 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, #48 87; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 88; CHECK-NEXT: mov s0, v0.s[1] 89; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 90; CHECK-NEXT: bl sinf 91; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 92; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 93; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 94; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0 95; CHECK-NEXT: bl sinf 96; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 97; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 98; CHECK-NEXT: mov v0.s[1], v1.s[0] 99; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 100; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 101; CHECK-NEXT: mov s0, v0.s[2] 102; CHECK-NEXT: bl sinf 103; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 104; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 105; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 106; CHECK-NEXT: mov v1.s[2], v0.s[0] 107; CHECK-NEXT: mov v0.16b, v1.16b 108; CHECK-NEXT: add sp, sp, #48 109; CHECK-NEXT: ret 110 %r = call <3 x float> @llvm.sin.v3f32(<3 x float> %x) 111 ret <3 x float> %r 112} 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, #48 118; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 119; CHECK-NEXT: mov s0, v0.s[1] 120; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 121; CHECK-NEXT: bl sinf 122; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 123; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 124; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 125; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0 126; CHECK-NEXT: bl sinf 127; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 128; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 129; CHECK-NEXT: mov v0.s[1], v1.s[0] 130; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 131; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 132; CHECK-NEXT: mov s0, v0.s[2] 133; CHECK-NEXT: bl sinf 134; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 135; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 136; CHECK-NEXT: mov v1.s[2], v0.s[0] 137; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 138; CHECK-NEXT: mov s0, v0.s[3] 139; CHECK-NEXT: str q1, [sp] // 16-byte Folded Spill 140; CHECK-NEXT: bl sinf 141; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 142; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 143; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 144; CHECK-NEXT: mov v1.s[3], v0.s[0] 145; CHECK-NEXT: mov v0.16b, v1.16b 146; CHECK-NEXT: add sp, sp, #48 147; CHECK-NEXT: ret 148 %r = call <4 x float> @llvm.sin.v4f32(<4 x float> %x) 149 ret <4 x float> %r 150} 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 Spill 156; CHECK-NEXT: stp d11, d10, [sp, #8] // 16-byte Folded Spill 157; CHECK-NEXT: fmov s10, s2 158; CHECK-NEXT: fmov s11, s1 159; CHECK-NEXT: stp d9, d8, [sp, #24] // 16-byte Folded Spill 160; CHECK-NEXT: fmov s8, s4 161; CHECK-NEXT: fmov s9, s3 162; CHECK-NEXT: str x30, [sp, #40] // 8-byte Folded Spill 163; CHECK-NEXT: bl sinf 164; CHECK-NEXT: fmov s12, s0 165; CHECK-NEXT: fmov s0, s11 166; CHECK-NEXT: bl sinf 167; CHECK-NEXT: fmov s11, s0 168; CHECK-NEXT: fmov s0, s10 169; CHECK-NEXT: bl sinf 170; CHECK-NEXT: fmov s10, s0 171; CHECK-NEXT: fmov s0, s9 172; CHECK-NEXT: bl sinf 173; CHECK-NEXT: fmov s9, s0 174; CHECK-NEXT: fmov s0, s8 175; CHECK-NEXT: bl sinf 176; CHECK-NEXT: fmov s1, s11 177; CHECK-NEXT: fmov s2, s10 178; CHECK-NEXT: ldr x30, [sp, #40] // 8-byte Folded Reload 179; CHECK-NEXT: fmov s3, s9 180; CHECK-NEXT: ldp d9, d8, [sp, #24] // 16-byte Folded Reload 181; CHECK-NEXT: ldp d11, d10, [sp, #8] // 16-byte Folded Reload 182; CHECK-NEXT: fmov s4, s0 183; CHECK-NEXT: fmov s0, s12 184; CHECK-NEXT: ldr d12, [sp], #48 // 8-byte Folded Reload 185; CHECK-NEXT: ret 186 %r = call <5 x float> @llvm.sin.v5f32(<5 x float> %x) 187 ret <5 x float> %r 188} 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 Spill 194; CHECK-NEXT: stp d11, d10, [sp, #16] // 16-byte Folded Spill 195; CHECK-NEXT: fmov s10, s3 196; CHECK-NEXT: fmov s11, s2 197; CHECK-NEXT: stp d9, d8, [sp, #32] // 16-byte Folded Spill 198; CHECK-NEXT: fmov s8, s5 199; CHECK-NEXT: fmov s9, s4 200; CHECK-NEXT: str x30, [sp, #48] // 8-byte Folded Spill 201; CHECK-NEXT: fmov s12, s1 202; CHECK-NEXT: bl sinf 203; CHECK-NEXT: fmov s13, s0 204; CHECK-NEXT: fmov s0, s12 205; CHECK-NEXT: bl sinf 206; CHECK-NEXT: fmov s12, s0 207; CHECK-NEXT: fmov s0, s11 208; CHECK-NEXT: bl sinf 209; CHECK-NEXT: fmov s11, s0 210; CHECK-NEXT: fmov s0, s10 211; CHECK-NEXT: bl sinf 212; CHECK-NEXT: fmov s10, s0 213; CHECK-NEXT: fmov s0, s9 214; CHECK-NEXT: bl sinf 215; CHECK-NEXT: fmov s9, s0 216; CHECK-NEXT: fmov s0, s8 217; CHECK-NEXT: bl sinf 218; CHECK-NEXT: fmov s2, s11 219; CHECK-NEXT: fmov s3, s10 220; CHECK-NEXT: ldr x30, [sp, #48] // 8-byte Folded Reload 221; CHECK-NEXT: fmov s4, s9 222; CHECK-NEXT: ldp d9, d8, [sp, #32] // 16-byte Folded Reload 223; CHECK-NEXT: ldp d11, d10, [sp, #16] // 16-byte Folded Reload 224; CHECK-NEXT: fmov s5, s0 225; CHECK-NEXT: fmov s0, s13 226; CHECK-NEXT: fmov s1, s12 227; CHECK-NEXT: ldp d13, d12, [sp], #64 // 16-byte Folded Reload 228; CHECK-NEXT: ret 229 %r = call <6 x float> @llvm.sin.v6f32(<6 x float> %x) 230 ret <6 x float> %r 231} 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 Spill 237; CHECK-NEXT: stp d9, d8, [sp, #8] // 16-byte Folded Spill 238; CHECK-NEXT: fmov d8, d2 239; CHECK-NEXT: fmov d9, d1 240; CHECK-NEXT: str x30, [sp, #24] // 8-byte Folded Spill 241; CHECK-NEXT: bl sin 242; CHECK-NEXT: fmov d10, d0 243; CHECK-NEXT: fmov d0, d9 244; CHECK-NEXT: bl sin 245; CHECK-NEXT: fmov d9, d0 246; CHECK-NEXT: fmov d0, d8 247; CHECK-NEXT: bl sin 248; CHECK-NEXT: fmov d1, d9 249; CHECK-NEXT: ldp d9, d8, [sp, #8] // 16-byte Folded Reload 250; CHECK-NEXT: ldr x30, [sp, #24] // 8-byte Folded Reload 251; CHECK-NEXT: fmov d2, d0 252; CHECK-NEXT: fmov d0, d10 253; CHECK-NEXT: ldr d10, [sp], #32 // 8-byte Folded Reload 254; CHECK-NEXT: ret 255 %r = call <3 x double> @llvm.sin.v3f64(<3 x double> %x) 256 ret <3 x double> %r 257} 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.4s 263; CHECK-NEXT: ret 264 %r = call <3 x float> @llvm.fabs.v3f32(<3 x float> %x) 265 ret <3 x float> %r 266} 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.4s 272; CHECK-NEXT: ret 273 %r = call <3 x float> @llvm.ceil.v3f32(<3 x float> %x) 274 ret <3 x float> %r 275} 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, #48 281; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 282; CHECK-NEXT: mov s0, v0.s[1] 283; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 284; CHECK-NEXT: bl cosf 285; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 286; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 287; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 288; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0 289; CHECK-NEXT: bl cosf 290; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 291; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 292; CHECK-NEXT: mov v0.s[1], v1.s[0] 293; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 294; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 295; CHECK-NEXT: mov s0, v0.s[2] 296; CHECK-NEXT: bl cosf 297; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 298; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 299; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 300; CHECK-NEXT: mov v1.s[2], v0.s[0] 301; CHECK-NEXT: mov v0.16b, v1.16b 302; CHECK-NEXT: add sp, sp, #48 303; CHECK-NEXT: ret 304 %r = call <3 x float> @llvm.cos.v3f32(<3 x float> %x) 305 ret <3 x float> %r 306} 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, #48 312; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 313; CHECK-NEXT: mov s0, v0.s[1] 314; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 315; CHECK-NEXT: bl tanf 316; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 317; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 318; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 319; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0 320; CHECK-NEXT: bl tanf 321; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 322; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 323; CHECK-NEXT: mov v0.s[1], v1.s[0] 324; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 325; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 326; CHECK-NEXT: mov s0, v0.s[2] 327; CHECK-NEXT: bl tanf 328; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 329; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 330; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 331; CHECK-NEXT: mov v1.s[2], v0.s[0] 332; CHECK-NEXT: mov v0.16b, v1.16b 333; CHECK-NEXT: add sp, sp, #48 334; CHECK-NEXT: ret 335 %r = call <3 x float> @llvm.tan.v3f32(<3 x float> %x) 336 ret <3 x float> %r 337} 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, #48 343; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 344; CHECK-NEXT: mov s0, v0.s[1] 345; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 346; CHECK-NEXT: bl asinf 347; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 348; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 349; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 350; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0 351; CHECK-NEXT: bl asinf 352; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 353; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 354; CHECK-NEXT: mov v0.s[1], v1.s[0] 355; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 356; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 357; CHECK-NEXT: mov s0, v0.s[2] 358; CHECK-NEXT: bl asinf 359; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 360; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 361; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 362; CHECK-NEXT: mov v1.s[2], v0.s[0] 363; CHECK-NEXT: mov v0.16b, v1.16b 364; CHECK-NEXT: add sp, sp, #48 365; CHECK-NEXT: ret 366 %r = call <3 x float> @llvm.asin.v3f32(<3 x float> %x) 367 ret <3 x float> %r 368} 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, #48 374; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 375; CHECK-NEXT: mov s0, v0.s[1] 376; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 377; CHECK-NEXT: bl acosf 378; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 379; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 380; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 381; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0 382; CHECK-NEXT: bl acosf 383; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 384; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 385; CHECK-NEXT: mov v0.s[1], v1.s[0] 386; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 387; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 388; CHECK-NEXT: mov s0, v0.s[2] 389; CHECK-NEXT: bl acosf 390; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 391; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 392; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 393; CHECK-NEXT: mov v1.s[2], v0.s[0] 394; CHECK-NEXT: mov v0.16b, v1.16b 395; CHECK-NEXT: add sp, sp, #48 396; CHECK-NEXT: ret 397 %r = call <3 x float> @llvm.acos.v3f32(<3 x float> %x) 398 ret <3 x float> %r 399} 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, #48 405; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 406; CHECK-NEXT: mov s0, v0.s[1] 407; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 408; CHECK-NEXT: bl atanf 409; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 410; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 411; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 412; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0 413; CHECK-NEXT: bl atanf 414; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 415; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 416; CHECK-NEXT: mov v0.s[1], v1.s[0] 417; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 418; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 419; CHECK-NEXT: mov s0, v0.s[2] 420; CHECK-NEXT: bl atanf 421; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 422; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 423; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 424; CHECK-NEXT: mov v1.s[2], v0.s[0] 425; CHECK-NEXT: mov v0.16b, v1.16b 426; CHECK-NEXT: add sp, sp, #48 427; CHECK-NEXT: ret 428 %r = call <3 x float> @llvm.atan.v3f32(<3 x float> %x) 429 ret <3 x float> %r 430} 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, #64 436; CHECK-NEXT: stp q0, q1, [sp, #16] // 32-byte Folded Spill 437; CHECK-NEXT: mov s0, v0.s[1] 438; CHECK-NEXT: mov s1, v1.s[1] 439; CHECK-NEXT: str x30, [sp, #48] // 8-byte Folded Spill 440; CHECK-NEXT: bl atan2f 441; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 442; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 443; CHECK-NEXT: ldp q0, q1, [sp, #16] // 32-byte Folded Reload 444; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0 445; CHECK-NEXT: // kill: def $s1 killed $s1 killed $q1 446; CHECK-NEXT: bl atan2f 447; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 448; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 449; CHECK-NEXT: mov v0.s[1], v1.s[0] 450; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 451; CHECK-NEXT: ldp q0, q1, [sp, #16] // 32-byte Folded Reload 452; CHECK-NEXT: mov s0, v0.s[2] 453; CHECK-NEXT: mov s1, v1.s[2] 454; CHECK-NEXT: bl atan2f 455; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 456; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 457; CHECK-NEXT: ldr x30, [sp, #48] // 8-byte Folded Reload 458; CHECK-NEXT: mov v1.s[2], v0.s[0] 459; CHECK-NEXT: mov v0.16b, v1.16b 460; CHECK-NEXT: add sp, sp, #64 461; CHECK-NEXT: ret 462 %r = call <3 x float> @llvm.atan2.v3f32(<3 x float> %x, <3 x float> %y) 463 ret <3 x float> %r 464} 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, #48 470; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 471; CHECK-NEXT: mov s0, v0.s[1] 472; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 473; CHECK-NEXT: bl sinhf 474; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 475; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 476; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 477; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0 478; CHECK-NEXT: bl sinhf 479; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 480; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 481; CHECK-NEXT: mov v0.s[1], v1.s[0] 482; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 483; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 484; CHECK-NEXT: mov s0, v0.s[2] 485; CHECK-NEXT: bl sinhf 486; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 487; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 488; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 489; CHECK-NEXT: mov v1.s[2], v0.s[0] 490; CHECK-NEXT: mov v0.16b, v1.16b 491; CHECK-NEXT: add sp, sp, #48 492; CHECK-NEXT: ret 493 %r = call <3 x float> @llvm.sinh.v3f32(<3 x float> %x) 494 ret <3 x float> %r 495} 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, #48 500; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 501; CHECK-NEXT: mov s0, v0.s[1] 502; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 503; CHECK-NEXT: bl coshf 504; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 505; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 506; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 507; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0 508; CHECK-NEXT: bl coshf 509; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 510; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 511; CHECK-NEXT: mov v0.s[1], v1.s[0] 512; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 513; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 514; CHECK-NEXT: mov s0, v0.s[2] 515; CHECK-NEXT: bl coshf 516; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 517; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 518; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 519; CHECK-NEXT: mov v1.s[2], v0.s[0] 520; CHECK-NEXT: mov v0.16b, v1.16b 521; CHECK-NEXT: add sp, sp, #48 522; CHECK-NEXT: ret 523 %r = call <3 x float> @llvm.cosh.v3f32(<3 x float> %x) 524 ret <3 x float> %r 525} 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, #48 531; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 532; CHECK-NEXT: mov s0, v0.s[1] 533; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 534; CHECK-NEXT: bl tanhf 535; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 536; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 537; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 538; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0 539; CHECK-NEXT: bl tanhf 540; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 541; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 542; CHECK-NEXT: mov v0.s[1], v1.s[0] 543; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 544; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 545; CHECK-NEXT: mov s0, v0.s[2] 546; CHECK-NEXT: bl tanhf 547; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 548; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 549; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 550; CHECK-NEXT: mov v1.s[2], v0.s[0] 551; CHECK-NEXT: mov v0.16b, v1.16b 552; CHECK-NEXT: add sp, sp, #48 553; CHECK-NEXT: ret 554 %r = call <3 x float> @llvm.tanh.v3f32(<3 x float> %x) 555 ret <3 x float> %r 556} 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, #48 562; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 563; CHECK-NEXT: mov s0, v0.s[1] 564; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 565; CHECK-NEXT: bl expf 566; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 567; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 568; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 569; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0 570; CHECK-NEXT: bl expf 571; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 572; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 573; CHECK-NEXT: mov v0.s[1], v1.s[0] 574; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 575; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 576; CHECK-NEXT: mov s0, v0.s[2] 577; CHECK-NEXT: bl expf 578; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 579; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 580; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 581; CHECK-NEXT: mov v1.s[2], v0.s[0] 582; CHECK-NEXT: mov v0.16b, v1.16b 583; CHECK-NEXT: add sp, sp, #48 584; CHECK-NEXT: ret 585 %r = call <3 x float> @llvm.exp.v3f32(<3 x float> %x) 586 ret <3 x float> %r 587} 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, #48 593; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 594; CHECK-NEXT: mov s0, v0.s[1] 595; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 596; CHECK-NEXT: bl exp2f 597; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 598; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 599; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 600; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0 601; CHECK-NEXT: bl exp2f 602; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 603; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 604; CHECK-NEXT: mov v0.s[1], v1.s[0] 605; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 606; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 607; CHECK-NEXT: mov s0, v0.s[2] 608; CHECK-NEXT: bl exp2f 609; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 610; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 611; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 612; CHECK-NEXT: mov v1.s[2], v0.s[0] 613; CHECK-NEXT: mov v0.16b, v1.16b 614; CHECK-NEXT: add sp, sp, #48 615; CHECK-NEXT: ret 616 %r = call <3 x float> @llvm.exp2.v3f32(<3 x float> %x) 617 ret <3 x float> %r 618} 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.4s 624; CHECK-NEXT: ret 625 %r = call <3 x float> @llvm.floor.v3f32(<3 x float> %x) 626 ret <3 x float> %r 627} 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, #48 633; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 634; CHECK-NEXT: mov s0, v0.s[1] 635; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 636; CHECK-NEXT: bl logf 637; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 638; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 639; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 640; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0 641; CHECK-NEXT: bl logf 642; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 643; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 644; CHECK-NEXT: mov v0.s[1], v1.s[0] 645; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 646; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 647; CHECK-NEXT: mov s0, v0.s[2] 648; CHECK-NEXT: bl logf 649; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 650; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 651; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 652; CHECK-NEXT: mov v1.s[2], v0.s[0] 653; CHECK-NEXT: mov v0.16b, v1.16b 654; CHECK-NEXT: add sp, sp, #48 655; CHECK-NEXT: ret 656 %r = call <3 x float> @llvm.log.v3f32(<3 x float> %x) 657 ret <3 x float> %r 658} 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, #48 664; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 665; CHECK-NEXT: mov s0, v0.s[1] 666; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 667; CHECK-NEXT: bl log10f 668; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 669; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 670; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 671; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0 672; CHECK-NEXT: bl log10f 673; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 674; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 675; CHECK-NEXT: mov v0.s[1], v1.s[0] 676; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 677; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 678; CHECK-NEXT: mov s0, v0.s[2] 679; CHECK-NEXT: bl log10f 680; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 681; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 682; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 683; CHECK-NEXT: mov v1.s[2], v0.s[0] 684; CHECK-NEXT: mov v0.16b, v1.16b 685; CHECK-NEXT: add sp, sp, #48 686; CHECK-NEXT: ret 687 %r = call <3 x float> @llvm.log10.v3f32(<3 x float> %x) 688 ret <3 x float> %r 689} 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, #48 695; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 696; CHECK-NEXT: mov s0, v0.s[1] 697; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 698; CHECK-NEXT: bl log2f 699; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 700; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 701; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 702; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0 703; CHECK-NEXT: bl log2f 704; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 705; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 706; CHECK-NEXT: mov v0.s[1], v1.s[0] 707; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 708; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 709; CHECK-NEXT: mov s0, v0.s[2] 710; CHECK-NEXT: bl log2f 711; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 712; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 713; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 714; CHECK-NEXT: mov v1.s[2], v0.s[0] 715; CHECK-NEXT: mov v0.16b, v1.16b 716; CHECK-NEXT: add sp, sp, #48 717; CHECK-NEXT: ret 718 %r = call <3 x float> @llvm.log2.v3f32(<3 x float> %x) 719 ret <3 x float> %r 720} 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.4s 726; CHECK-NEXT: ret 727 %r = call <3 x float> @llvm.nearbyint.v3f32(<3 x float> %x) 728 ret <3 x float> %r 729} 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.4s 735; CHECK-NEXT: ret 736 %r = call <3 x float> @llvm.rint.v3f32(<3 x float> %x) 737 ret <3 x float> %r 738} 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.4s 744; CHECK-NEXT: ret 745 %r = call <3 x float> @llvm.round.v3f32(<3 x float> %x) 746 ret <3 x float> %r 747} 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.4s 753; CHECK-NEXT: ret 754 %r = call <3 x float> @llvm.roundeven.v3f32(<3 x float> %x) 755 ret <3 x float> %r 756} 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.4s 762; CHECK-NEXT: ret 763 %r = call <3 x float> @llvm.sqrt.v3f32(<3 x float> %x) 764 ret <3 x float> %r 765} 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.4s 771; CHECK-NEXT: ret 772 %r = call <3 x float> @llvm.trunc.v3f32(<3 x float> %x) 773 ret <3 x float> %r 774} 775 776