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.exp.v3f32(<3 x float>) 24declare <3 x float> @llvm.exp2.v3f32(<3 x float>) 25declare <3 x float> @llvm.floor.v3f32(<3 x float>) 26declare <3 x float> @llvm.log.v3f32(<3 x float>) 27declare <3 x float> @llvm.log10.v3f32(<3 x float>) 28declare <3 x float> @llvm.log2.v3f32(<3 x float>) 29declare <3 x float> @llvm.nearbyint.v3f32(<3 x float>) 30declare <3 x float> @llvm.rint.v3f32(<3 x float>) 31declare <3 x float> @llvm.round.v3f32(<3 x float>) 32declare <3 x float> @llvm.roundeven.v3f32(<3 x float>) 33declare <3 x float> @llvm.sqrt.v3f32(<3 x float>) 34declare <3 x float> @llvm.trunc.v3f32(<3 x float>) 35 36define <1 x float> @sin_v1f32(<1 x float> %x) nounwind { 37; CHECK-LABEL: sin_v1f32: 38; CHECK: // %bb.0: 39; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 40; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 41; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0 42; CHECK-NEXT: bl sinf 43; CHECK-NEXT: // kill: def $s0 killed $s0 def $d0 44; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 45; CHECK-NEXT: ret 46 %r = call <1 x float> @llvm.sin.v1f32(<1 x float> %x) 47 ret <1 x float> %r 48} 49 50define <2 x float> @sin_v2f32(<2 x float> %x) nounwind { 51; CHECK-LABEL: sin_v2f32: 52; CHECK: // %bb.0: 53; CHECK-NEXT: sub sp, sp, #48 54; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 55; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 56; CHECK-NEXT: mov s0, v0.s[1] 57; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 58; CHECK-NEXT: bl sinf 59; CHECK-NEXT: str d0, [sp, #16] // 16-byte Folded Spill 60; CHECK-NEXT: ldr q0, [sp] // 16-byte Folded Reload 61; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0 62; CHECK-NEXT: bl sinf 63; CHECK-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 64; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 65; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 66; CHECK-NEXT: mov v0.s[1], v1.s[0] 67; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0 68; CHECK-NEXT: add sp, sp, #48 69; CHECK-NEXT: ret 70 %r = call <2 x float> @llvm.sin.v2f32(<2 x float> %x) 71 ret <2 x float> %r 72} 73 74define <3 x float> @sin_v3f32(<3 x float> %x) nounwind { 75; CHECK-LABEL: sin_v3f32: 76; CHECK: // %bb.0: 77; CHECK-NEXT: sub sp, sp, #48 78; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 79; CHECK-NEXT: mov s0, v0.s[1] 80; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 81; CHECK-NEXT: bl sinf 82; CHECK-NEXT: str d0, [sp] // 16-byte Folded Spill 83; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 84; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0 85; CHECK-NEXT: bl sinf 86; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 87; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 88; CHECK-NEXT: mov v0.s[1], v1.s[0] 89; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 90; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 91; CHECK-NEXT: mov s0, v0.s[2] 92; CHECK-NEXT: bl sinf 93; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 94; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 95; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 96; CHECK-NEXT: mov v1.s[2], v0.s[0] 97; CHECK-NEXT: mov v0.16b, v1.16b 98; CHECK-NEXT: add sp, sp, #48 99; CHECK-NEXT: ret 100 %r = call <3 x float> @llvm.sin.v3f32(<3 x float> %x) 101 ret <3 x float> %r 102} 103 104define <4 x float> @sin_v4f32(<4 x float> %x) nounwind { 105; CHECK-LABEL: sin_v4f32: 106; CHECK: // %bb.0: 107; CHECK-NEXT: sub sp, sp, #48 108; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 109; CHECK-NEXT: mov s0, v0.s[1] 110; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 111; CHECK-NEXT: bl sinf 112; CHECK-NEXT: str d0, [sp] // 16-byte Folded Spill 113; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 114; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0 115; CHECK-NEXT: bl sinf 116; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 117; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 118; CHECK-NEXT: mov v0.s[1], v1.s[0] 119; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 120; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 121; CHECK-NEXT: mov s0, v0.s[2] 122; CHECK-NEXT: bl sinf 123; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 124; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 125; CHECK-NEXT: mov v1.s[2], v0.s[0] 126; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 127; CHECK-NEXT: mov s0, v0.s[3] 128; CHECK-NEXT: str q1, [sp] // 16-byte Folded Spill 129; CHECK-NEXT: bl sinf 130; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 131; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 132; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 133; CHECK-NEXT: mov v1.s[3], v0.s[0] 134; CHECK-NEXT: mov v0.16b, v1.16b 135; CHECK-NEXT: add sp, sp, #48 136; CHECK-NEXT: ret 137 %r = call <4 x float> @llvm.sin.v4f32(<4 x float> %x) 138 ret <4 x float> %r 139} 140 141define <5 x float> @sin_v5f32(<5 x float> %x) nounwind { 142; CHECK-LABEL: sin_v5f32: 143; CHECK: // %bb.0: 144; CHECK-NEXT: str d12, [sp, #-48]! // 8-byte Folded Spill 145; CHECK-NEXT: stp d11, d10, [sp, #8] // 16-byte Folded Spill 146; CHECK-NEXT: fmov s10, s2 147; CHECK-NEXT: stp d9, d8, [sp, #24] // 16-byte Folded Spill 148; CHECK-NEXT: fmov s8, s4 149; CHECK-NEXT: str x30, [sp, #40] // 8-byte Folded Spill 150; CHECK-NEXT: fmov s9, s3 151; CHECK-NEXT: fmov s11, s1 152; CHECK-NEXT: bl sinf 153; CHECK-NEXT: fmov s12, s0 154; CHECK-NEXT: fmov s0, s11 155; CHECK-NEXT: bl sinf 156; CHECK-NEXT: fmov s11, s0 157; CHECK-NEXT: fmov s0, s10 158; CHECK-NEXT: bl sinf 159; CHECK-NEXT: fmov s10, s0 160; CHECK-NEXT: fmov s0, s9 161; CHECK-NEXT: bl sinf 162; CHECK-NEXT: fmov s9, s0 163; CHECK-NEXT: fmov s0, s8 164; CHECK-NEXT: bl sinf 165; CHECK-NEXT: fmov s1, s11 166; CHECK-NEXT: fmov s2, s10 167; CHECK-NEXT: fmov s3, s9 168; CHECK-NEXT: ldr x30, [sp, #40] // 8-byte Folded Reload 169; CHECK-NEXT: ldp d9, d8, [sp, #24] // 16-byte Folded Reload 170; CHECK-NEXT: fmov s4, s0 171; CHECK-NEXT: fmov s0, s12 172; CHECK-NEXT: ldp d11, d10, [sp, #8] // 16-byte Folded Reload 173; CHECK-NEXT: ldr d12, [sp], #48 // 8-byte Folded Reload 174; CHECK-NEXT: ret 175 %r = call <5 x float> @llvm.sin.v5f32(<5 x float> %x) 176 ret <5 x float> %r 177} 178 179define <6 x float> @sin_v6f32(<6 x float> %x) nounwind { 180; CHECK-LABEL: sin_v6f32: 181; CHECK: // %bb.0: 182; CHECK-NEXT: stp d13, d12, [sp, #-64]! // 16-byte Folded Spill 183; CHECK-NEXT: stp d11, d10, [sp, #16] // 16-byte Folded Spill 184; CHECK-NEXT: fmov s10, s3 185; CHECK-NEXT: stp d9, d8, [sp, #32] // 16-byte Folded Spill 186; CHECK-NEXT: fmov s8, s5 187; CHECK-NEXT: str x30, [sp, #48] // 8-byte Folded Spill 188; CHECK-NEXT: fmov s9, s4 189; CHECK-NEXT: fmov s11, s2 190; CHECK-NEXT: fmov s12, s1 191; CHECK-NEXT: bl sinf 192; CHECK-NEXT: fmov s13, s0 193; CHECK-NEXT: fmov s0, s12 194; CHECK-NEXT: bl sinf 195; CHECK-NEXT: fmov s12, s0 196; CHECK-NEXT: fmov s0, s11 197; CHECK-NEXT: bl sinf 198; CHECK-NEXT: fmov s11, s0 199; CHECK-NEXT: fmov s0, s10 200; CHECK-NEXT: bl sinf 201; CHECK-NEXT: fmov s10, s0 202; CHECK-NEXT: fmov s0, s9 203; CHECK-NEXT: bl sinf 204; CHECK-NEXT: fmov s9, s0 205; CHECK-NEXT: fmov s0, s8 206; CHECK-NEXT: bl sinf 207; CHECK-NEXT: fmov s2, s11 208; CHECK-NEXT: fmov s3, s10 209; CHECK-NEXT: fmov s4, s9 210; CHECK-NEXT: ldr x30, [sp, #48] // 8-byte Folded Reload 211; CHECK-NEXT: ldp d9, d8, [sp, #32] // 16-byte Folded Reload 212; CHECK-NEXT: fmov s5, s0 213; CHECK-NEXT: fmov s0, s13 214; CHECK-NEXT: ldp d11, d10, [sp, #16] // 16-byte Folded Reload 215; CHECK-NEXT: fmov s1, s12 216; CHECK-NEXT: ldp d13, d12, [sp], #64 // 16-byte Folded Reload 217; CHECK-NEXT: ret 218 %r = call <6 x float> @llvm.sin.v6f32(<6 x float> %x) 219 ret <6 x float> %r 220} 221 222define <3 x double> @sin_v3f64(<3 x double> %x) nounwind { 223; CHECK-LABEL: sin_v3f64: 224; CHECK: // %bb.0: 225; CHECK-NEXT: str d10, [sp, #-32]! // 8-byte Folded Spill 226; CHECK-NEXT: stp d9, d8, [sp, #8] // 16-byte Folded Spill 227; CHECK-NEXT: fmov d8, d2 228; CHECK-NEXT: str x30, [sp, #24] // 8-byte Folded Spill 229; CHECK-NEXT: fmov d9, d1 230; CHECK-NEXT: bl sin 231; CHECK-NEXT: fmov d10, d0 232; CHECK-NEXT: fmov d0, d9 233; CHECK-NEXT: bl sin 234; CHECK-NEXT: fmov d9, d0 235; CHECK-NEXT: fmov d0, d8 236; CHECK-NEXT: bl sin 237; CHECK-NEXT: fmov d1, d9 238; CHECK-NEXT: ldr x30, [sp, #24] // 8-byte Folded Reload 239; CHECK-NEXT: ldp d9, d8, [sp, #8] // 16-byte Folded Reload 240; CHECK-NEXT: fmov d2, d0 241; CHECK-NEXT: fmov d0, d10 242; CHECK-NEXT: ldr d10, [sp], #32 // 8-byte Folded Reload 243; CHECK-NEXT: ret 244 %r = call <3 x double> @llvm.sin.v3f64(<3 x double> %x) 245 ret <3 x double> %r 246} 247 248define <3 x float> @fabs_v3f32(<3 x float> %x) nounwind { 249; CHECK-LABEL: fabs_v3f32: 250; CHECK: // %bb.0: 251; CHECK-NEXT: fabs v0.4s, v0.4s 252; CHECK-NEXT: ret 253 %r = call <3 x float> @llvm.fabs.v3f32(<3 x float> %x) 254 ret <3 x float> %r 255} 256 257define <3 x float> @ceil_v3f32(<3 x float> %x) nounwind { 258; CHECK-LABEL: ceil_v3f32: 259; CHECK: // %bb.0: 260; CHECK-NEXT: frintp v0.4s, v0.4s 261; CHECK-NEXT: ret 262 %r = call <3 x float> @llvm.ceil.v3f32(<3 x float> %x) 263 ret <3 x float> %r 264} 265 266define <3 x float> @cos_v3f32(<3 x float> %x) nounwind { 267; CHECK-LABEL: cos_v3f32: 268; CHECK: // %bb.0: 269; CHECK-NEXT: sub sp, sp, #48 270; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 271; CHECK-NEXT: mov s0, v0.s[1] 272; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 273; CHECK-NEXT: bl cosf 274; CHECK-NEXT: str d0, [sp] // 16-byte Folded Spill 275; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 276; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0 277; CHECK-NEXT: bl cosf 278; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 279; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 280; CHECK-NEXT: mov v0.s[1], v1.s[0] 281; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 282; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 283; CHECK-NEXT: mov s0, v0.s[2] 284; CHECK-NEXT: bl cosf 285; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 286; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 287; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 288; CHECK-NEXT: mov v1.s[2], v0.s[0] 289; CHECK-NEXT: mov v0.16b, v1.16b 290; CHECK-NEXT: add sp, sp, #48 291; CHECK-NEXT: ret 292 %r = call <3 x float> @llvm.cos.v3f32(<3 x float> %x) 293 ret <3 x float> %r 294} 295 296define <3 x float> @exp_v3f32(<3 x float> %x) nounwind { 297; CHECK-LABEL: exp_v3f32: 298; CHECK: // %bb.0: 299; CHECK-NEXT: sub sp, sp, #48 300; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 301; CHECK-NEXT: mov s0, v0.s[1] 302; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 303; CHECK-NEXT: bl expf 304; CHECK-NEXT: str d0, [sp] // 16-byte Folded Spill 305; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 306; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0 307; CHECK-NEXT: bl expf 308; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 309; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 310; CHECK-NEXT: mov v0.s[1], v1.s[0] 311; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 312; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 313; CHECK-NEXT: mov s0, v0.s[2] 314; CHECK-NEXT: bl expf 315; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 316; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 317; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 318; CHECK-NEXT: mov v1.s[2], v0.s[0] 319; CHECK-NEXT: mov v0.16b, v1.16b 320; CHECK-NEXT: add sp, sp, #48 321; CHECK-NEXT: ret 322 %r = call <3 x float> @llvm.exp.v3f32(<3 x float> %x) 323 ret <3 x float> %r 324} 325 326define <3 x float> @exp2_v3f32(<3 x float> %x) nounwind { 327; CHECK-LABEL: exp2_v3f32: 328; CHECK: // %bb.0: 329; CHECK-NEXT: sub sp, sp, #48 330; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 331; CHECK-NEXT: mov s0, v0.s[1] 332; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 333; CHECK-NEXT: bl exp2f 334; CHECK-NEXT: str d0, [sp] // 16-byte Folded Spill 335; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 336; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0 337; CHECK-NEXT: bl exp2f 338; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 339; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 340; CHECK-NEXT: mov v0.s[1], v1.s[0] 341; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 342; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 343; CHECK-NEXT: mov s0, v0.s[2] 344; CHECK-NEXT: bl exp2f 345; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 346; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 347; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 348; CHECK-NEXT: mov v1.s[2], v0.s[0] 349; CHECK-NEXT: mov v0.16b, v1.16b 350; CHECK-NEXT: add sp, sp, #48 351; CHECK-NEXT: ret 352 %r = call <3 x float> @llvm.exp2.v3f32(<3 x float> %x) 353 ret <3 x float> %r 354} 355 356define <3 x float> @floor_v3f32(<3 x float> %x) nounwind { 357; CHECK-LABEL: floor_v3f32: 358; CHECK: // %bb.0: 359; CHECK-NEXT: frintm v0.4s, v0.4s 360; CHECK-NEXT: ret 361 %r = call <3 x float> @llvm.floor.v3f32(<3 x float> %x) 362 ret <3 x float> %r 363} 364 365define <3 x float> @log_v3f32(<3 x float> %x) nounwind { 366; CHECK-LABEL: log_v3f32: 367; CHECK: // %bb.0: 368; CHECK-NEXT: sub sp, sp, #48 369; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 370; CHECK-NEXT: mov s0, v0.s[1] 371; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 372; CHECK-NEXT: bl logf 373; CHECK-NEXT: str d0, [sp] // 16-byte Folded Spill 374; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 375; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0 376; CHECK-NEXT: bl logf 377; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 378; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 379; CHECK-NEXT: mov v0.s[1], v1.s[0] 380; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 381; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 382; CHECK-NEXT: mov s0, v0.s[2] 383; CHECK-NEXT: bl logf 384; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 385; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 386; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 387; CHECK-NEXT: mov v1.s[2], v0.s[0] 388; CHECK-NEXT: mov v0.16b, v1.16b 389; CHECK-NEXT: add sp, sp, #48 390; CHECK-NEXT: ret 391 %r = call <3 x float> @llvm.log.v3f32(<3 x float> %x) 392 ret <3 x float> %r 393} 394 395define <3 x float> @log10_v3f32(<3 x float> %x) nounwind { 396; CHECK-LABEL: log10_v3f32: 397; CHECK: // %bb.0: 398; CHECK-NEXT: sub sp, sp, #48 399; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 400; CHECK-NEXT: mov s0, v0.s[1] 401; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 402; CHECK-NEXT: bl log10f 403; CHECK-NEXT: str d0, [sp] // 16-byte Folded Spill 404; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 405; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0 406; CHECK-NEXT: bl log10f 407; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 408; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 409; CHECK-NEXT: mov v0.s[1], v1.s[0] 410; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 411; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 412; CHECK-NEXT: mov s0, v0.s[2] 413; CHECK-NEXT: bl log10f 414; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 415; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 416; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 417; CHECK-NEXT: mov v1.s[2], v0.s[0] 418; CHECK-NEXT: mov v0.16b, v1.16b 419; CHECK-NEXT: add sp, sp, #48 420; CHECK-NEXT: ret 421 %r = call <3 x float> @llvm.log10.v3f32(<3 x float> %x) 422 ret <3 x float> %r 423} 424 425define <3 x float> @log2_v3f32(<3 x float> %x) nounwind { 426; CHECK-LABEL: log2_v3f32: 427; CHECK: // %bb.0: 428; CHECK-NEXT: sub sp, sp, #48 429; CHECK-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 430; CHECK-NEXT: mov s0, v0.s[1] 431; CHECK-NEXT: str x30, [sp, #32] // 8-byte Folded Spill 432; CHECK-NEXT: bl log2f 433; CHECK-NEXT: str d0, [sp] // 16-byte Folded Spill 434; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 435; CHECK-NEXT: // kill: def $s0 killed $s0 killed $q0 436; CHECK-NEXT: bl log2f 437; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 438; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 439; CHECK-NEXT: mov v0.s[1], v1.s[0] 440; CHECK-NEXT: str q0, [sp] // 16-byte Folded Spill 441; CHECK-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 442; CHECK-NEXT: mov s0, v0.s[2] 443; CHECK-NEXT: bl log2f 444; CHECK-NEXT: ldr q1, [sp] // 16-byte Folded Reload 445; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0 446; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload 447; CHECK-NEXT: mov v1.s[2], v0.s[0] 448; CHECK-NEXT: mov v0.16b, v1.16b 449; CHECK-NEXT: add sp, sp, #48 450; CHECK-NEXT: ret 451 %r = call <3 x float> @llvm.log2.v3f32(<3 x float> %x) 452 ret <3 x float> %r 453} 454 455define <3 x float> @nearbyint__v3f32(<3 x float> %x) nounwind { 456; CHECK-LABEL: nearbyint__v3f32: 457; CHECK: // %bb.0: 458; CHECK-NEXT: frinti v0.4s, v0.4s 459; CHECK-NEXT: ret 460 %r = call <3 x float> @llvm.nearbyint.v3f32(<3 x float> %x) 461 ret <3 x float> %r 462} 463 464define <3 x float> @rint_v3f32(<3 x float> %x) nounwind { 465; CHECK-LABEL: rint_v3f32: 466; CHECK: // %bb.0: 467; CHECK-NEXT: frintx v0.4s, v0.4s 468; CHECK-NEXT: ret 469 %r = call <3 x float> @llvm.rint.v3f32(<3 x float> %x) 470 ret <3 x float> %r 471} 472 473define <3 x float> @round_v3f32(<3 x float> %x) nounwind { 474; CHECK-LABEL: round_v3f32: 475; CHECK: // %bb.0: 476; CHECK-NEXT: frinta v0.4s, v0.4s 477; CHECK-NEXT: ret 478 %r = call <3 x float> @llvm.round.v3f32(<3 x float> %x) 479 ret <3 x float> %r 480} 481 482define <3 x float> @roundeven_v3f32(<3 x float> %x) nounwind { 483; CHECK-LABEL: roundeven_v3f32: 484; CHECK: // %bb.0: 485; CHECK-NEXT: frintn v0.4s, v0.4s 486; CHECK-NEXT: ret 487 %r = call <3 x float> @llvm.roundeven.v3f32(<3 x float> %x) 488 ret <3 x float> %r 489} 490 491define <3 x float> @sqrt_v3f32(<3 x float> %x) nounwind { 492; CHECK-LABEL: sqrt_v3f32: 493; CHECK: // %bb.0: 494; CHECK-NEXT: fsqrt v0.4s, v0.4s 495; CHECK-NEXT: ret 496 %r = call <3 x float> @llvm.sqrt.v3f32(<3 x float> %x) 497 ret <3 x float> %r 498} 499 500define <3 x float> @trunc_v3f32(<3 x float> %x) nounwind { 501; CHECK-LABEL: trunc_v3f32: 502; CHECK: // %bb.0: 503; CHECK-NEXT: frintz v0.4s, v0.4s 504; CHECK-NEXT: ret 505 %r = call <3 x float> @llvm.trunc.v3f32(<3 x float> %x) 506 ret <3 x float> %r 507} 508 509