1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3 2; RUN: llc -mtriple=aarch64 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD 3; RUN: llc -mtriple=aarch64 -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI 4 5define double @powi_f64(double %a, i32 %b) { 6; CHECK-LABEL: powi_f64: 7; CHECK: // %bb.0: // %entry 8; CHECK-NEXT: b __powidf2 9entry: 10 %c = call double @llvm.powi.f64.i32(double %a, i32 %b) 11 ret double %c 12} 13 14define float @powi_f32(float %a, i32 %b) { 15; CHECK-LABEL: powi_f32: 16; CHECK: // %bb.0: // %entry 17; CHECK-NEXT: b __powisf2 18entry: 19 %c = call float @llvm.powi.f32.i32(float %a, i32 %b) 20 ret float %c 21} 22 23define half @powi_f16(half %a, i32 %b) { 24; CHECK-LABEL: powi_f16: 25; CHECK: // %bb.0: // %entry 26; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 27; CHECK-NEXT: .cfi_def_cfa_offset 16 28; CHECK-NEXT: .cfi_offset w30, -16 29; CHECK-NEXT: fcvt s0, h0 30; CHECK-NEXT: bl __powisf2 31; CHECK-NEXT: fcvt h0, s0 32; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 33; CHECK-NEXT: ret 34entry: 35 %c = call half @llvm.powi.f16.i32(half %a, i32 %b) 36 ret half %c 37} 38 39define fp128 @powi_fp128(fp128 %a, i32 %b) { 40; CHECK-LABEL: powi_fp128: 41; CHECK: // %bb.0: // %entry 42; CHECK-NEXT: b __powitf2 43entry: 44 %c = call fp128 @llvm.powi.fp128.i32(fp128 %a, i32 %b) 45 ret fp128 %c 46} 47 48define <1 x double> @powi_v1f64(<1 x double> %a, i32 %b) { 49; CHECK-LABEL: powi_v1f64: 50; CHECK: // %bb.0: // %entry 51; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill 52; CHECK-NEXT: .cfi_def_cfa_offset 16 53; CHECK-NEXT: .cfi_offset w30, -16 54; CHECK-NEXT: bl __powidf2 55; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload 56; CHECK-NEXT: ret 57entry: 58 %c = call <1 x double> @llvm.powi.v1f64.i32(<1 x double> %a, i32 %b) 59 ret <1 x double> %c 60} 61 62define <2 x double> @powi_v2f64(<2 x double> %a, i32 %b) { 63; CHECK-SD-LABEL: powi_v2f64: 64; CHECK-SD: // %bb.0: // %entry 65; CHECK-SD-NEXT: sub sp, sp, #48 66; CHECK-SD-NEXT: stp x30, x19, [sp, #32] // 16-byte Folded Spill 67; CHECK-SD-NEXT: .cfi_def_cfa_offset 48 68; CHECK-SD-NEXT: .cfi_offset w19, -8 69; CHECK-SD-NEXT: .cfi_offset w30, -16 70; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 71; CHECK-SD-NEXT: mov d0, v0.d[1] 72; CHECK-SD-NEXT: mov w19, w0 73; CHECK-SD-NEXT: bl __powidf2 74; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 75; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 76; CHECK-SD-NEXT: mov w0, w19 77; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 78; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 79; CHECK-SD-NEXT: bl __powidf2 80; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 81; CHECK-SD-NEXT: ldp x30, x19, [sp, #32] // 16-byte Folded Reload 82; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 83; CHECK-SD-NEXT: mov v0.d[1], v1.d[0] 84; CHECK-SD-NEXT: add sp, sp, #48 85; CHECK-SD-NEXT: ret 86; 87; CHECK-GI-LABEL: powi_v2f64: 88; CHECK-GI: // %bb.0: // %entry 89; CHECK-GI-NEXT: sub sp, sp, #48 90; CHECK-GI-NEXT: str d8, [sp, #16] // 8-byte Folded Spill 91; CHECK-GI-NEXT: stp x30, x19, [sp, #32] // 16-byte Folded Spill 92; CHECK-GI-NEXT: .cfi_def_cfa_offset 48 93; CHECK-GI-NEXT: .cfi_offset w19, -8 94; CHECK-GI-NEXT: .cfi_offset w30, -16 95; CHECK-GI-NEXT: .cfi_offset b8, -32 96; CHECK-GI-NEXT: mov d8, v0.d[1] 97; CHECK-GI-NEXT: mov w19, w0 98; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 99; CHECK-GI-NEXT: bl __powidf2 100; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 101; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 102; CHECK-GI-NEXT: mov w0, w19 103; CHECK-GI-NEXT: fmov d0, d8 104; CHECK-GI-NEXT: bl __powidf2 105; CHECK-GI-NEXT: ldr q1, [sp] // 16-byte Folded Reload 106; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 107; CHECK-GI-NEXT: ldp x30, x19, [sp, #32] // 16-byte Folded Reload 108; CHECK-GI-NEXT: ldr d8, [sp, #16] // 8-byte Folded Reload 109; CHECK-GI-NEXT: mov v1.d[1], v0.d[0] 110; CHECK-GI-NEXT: mov v0.16b, v1.16b 111; CHECK-GI-NEXT: add sp, sp, #48 112; CHECK-GI-NEXT: ret 113entry: 114 %c = call <2 x double> @llvm.powi.v2f64.i32(<2 x double> %a, i32 %b) 115 ret <2 x double> %c 116} 117 118define <3 x double> @powi_v3f64(<3 x double> %a, i32 %b) { 119; CHECK-SD-LABEL: powi_v3f64: 120; CHECK-SD: // %bb.0: // %entry 121; CHECK-SD-NEXT: str d10, [sp, #-48]! // 8-byte Folded Spill 122; CHECK-SD-NEXT: stp d9, d8, [sp, #16] // 16-byte Folded Spill 123; CHECK-SD-NEXT: stp x30, x19, [sp, #32] // 16-byte Folded Spill 124; CHECK-SD-NEXT: .cfi_def_cfa_offset 48 125; CHECK-SD-NEXT: .cfi_offset w19, -8 126; CHECK-SD-NEXT: .cfi_offset w30, -16 127; CHECK-SD-NEXT: .cfi_offset b8, -24 128; CHECK-SD-NEXT: .cfi_offset b9, -32 129; CHECK-SD-NEXT: .cfi_offset b10, -48 130; CHECK-SD-NEXT: mov w19, w0 131; CHECK-SD-NEXT: fmov d8, d2 132; CHECK-SD-NEXT: fmov d9, d1 133; CHECK-SD-NEXT: bl __powidf2 134; CHECK-SD-NEXT: fmov d10, d0 135; CHECK-SD-NEXT: fmov d0, d9 136; CHECK-SD-NEXT: mov w0, w19 137; CHECK-SD-NEXT: bl __powidf2 138; CHECK-SD-NEXT: fmov d9, d0 139; CHECK-SD-NEXT: fmov d0, d8 140; CHECK-SD-NEXT: mov w0, w19 141; CHECK-SD-NEXT: bl __powidf2 142; CHECK-SD-NEXT: fmov d1, d9 143; CHECK-SD-NEXT: ldp x30, x19, [sp, #32] // 16-byte Folded Reload 144; CHECK-SD-NEXT: ldp d9, d8, [sp, #16] // 16-byte Folded Reload 145; CHECK-SD-NEXT: fmov d2, d0 146; CHECK-SD-NEXT: fmov d0, d10 147; CHECK-SD-NEXT: ldr d10, [sp], #48 // 8-byte Folded Reload 148; CHECK-SD-NEXT: ret 149; 150; CHECK-GI-LABEL: powi_v3f64: 151; CHECK-GI: // %bb.0: // %entry 152; CHECK-GI-NEXT: str d10, [sp, #-48]! // 8-byte Folded Spill 153; CHECK-GI-NEXT: stp d9, d8, [sp, #16] // 16-byte Folded Spill 154; CHECK-GI-NEXT: stp x30, x19, [sp, #32] // 16-byte Folded Spill 155; CHECK-GI-NEXT: .cfi_def_cfa_offset 48 156; CHECK-GI-NEXT: .cfi_offset w19, -8 157; CHECK-GI-NEXT: .cfi_offset w30, -16 158; CHECK-GI-NEXT: .cfi_offset b8, -24 159; CHECK-GI-NEXT: .cfi_offset b9, -32 160; CHECK-GI-NEXT: .cfi_offset b10, -48 161; CHECK-GI-NEXT: fmov d8, d1 162; CHECK-GI-NEXT: fmov d9, d2 163; CHECK-GI-NEXT: mov w19, w0 164; CHECK-GI-NEXT: bl __powidf2 165; CHECK-GI-NEXT: fmov d10, d0 166; CHECK-GI-NEXT: fmov d0, d8 167; CHECK-GI-NEXT: mov w0, w19 168; CHECK-GI-NEXT: bl __powidf2 169; CHECK-GI-NEXT: fmov d8, d0 170; CHECK-GI-NEXT: fmov d0, d9 171; CHECK-GI-NEXT: mov w0, w19 172; CHECK-GI-NEXT: bl __powidf2 173; CHECK-GI-NEXT: fmov d1, d8 174; CHECK-GI-NEXT: ldp x30, x19, [sp, #32] // 16-byte Folded Reload 175; CHECK-GI-NEXT: ldp d9, d8, [sp, #16] // 16-byte Folded Reload 176; CHECK-GI-NEXT: fmov d2, d0 177; CHECK-GI-NEXT: fmov d0, d10 178; CHECK-GI-NEXT: ldr d10, [sp], #48 // 8-byte Folded Reload 179; CHECK-GI-NEXT: ret 180entry: 181 %c = call <3 x double> @llvm.powi.v3f64.i32(<3 x double> %a, i32 %b) 182 ret <3 x double> %c 183} 184 185define <4 x double> @powi_v4f64(<4 x double> %a, i32 %b) { 186; CHECK-SD-LABEL: powi_v4f64: 187; CHECK-SD: // %bb.0: // %entry 188; CHECK-SD-NEXT: sub sp, sp, #64 189; CHECK-SD-NEXT: stp x30, x19, [sp, #48] // 16-byte Folded Spill 190; CHECK-SD-NEXT: .cfi_def_cfa_offset 64 191; CHECK-SD-NEXT: .cfi_offset w19, -8 192; CHECK-SD-NEXT: .cfi_offset w30, -16 193; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 194; CHECK-SD-NEXT: mov d0, v0.d[1] 195; CHECK-SD-NEXT: mov w19, w0 196; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Folded Spill 197; CHECK-SD-NEXT: bl __powidf2 198; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 199; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 200; CHECK-SD-NEXT: mov w0, w19 201; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 202; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 203; CHECK-SD-NEXT: bl __powidf2 204; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 205; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 206; CHECK-SD-NEXT: mov w0, w19 207; CHECK-SD-NEXT: mov v0.d[1], v1.d[0] 208; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 209; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload 210; CHECK-SD-NEXT: mov d0, v0.d[1] 211; CHECK-SD-NEXT: bl __powidf2 212; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 213; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 214; CHECK-SD-NEXT: mov w0, w19 215; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload 216; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 217; CHECK-SD-NEXT: bl __powidf2 218; CHECK-SD-NEXT: fmov d1, d0 219; CHECK-SD-NEXT: ldp q2, q0, [sp] // 32-byte Folded Reload 220; CHECK-SD-NEXT: ldp x30, x19, [sp, #48] // 16-byte Folded Reload 221; CHECK-SD-NEXT: mov v1.d[1], v2.d[0] 222; CHECK-SD-NEXT: add sp, sp, #64 223; CHECK-SD-NEXT: ret 224; 225; CHECK-GI-LABEL: powi_v4f64: 226; CHECK-GI: // %bb.0: // %entry 227; CHECK-GI-NEXT: sub sp, sp, #80 228; CHECK-GI-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill 229; CHECK-GI-NEXT: stp x30, x19, [sp, #64] // 16-byte Folded Spill 230; CHECK-GI-NEXT: .cfi_def_cfa_offset 80 231; CHECK-GI-NEXT: .cfi_offset w19, -8 232; CHECK-GI-NEXT: .cfi_offset w30, -16 233; CHECK-GI-NEXT: .cfi_offset b8, -24 234; CHECK-GI-NEXT: .cfi_offset b9, -32 235; CHECK-GI-NEXT: str q1, [sp] // 16-byte Folded Spill 236; CHECK-GI-NEXT: mov d8, v0.d[1] 237; CHECK-GI-NEXT: mov d9, v1.d[1] 238; CHECK-GI-NEXT: mov w19, w0 239; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 240; CHECK-GI-NEXT: bl __powidf2 241; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 242; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 243; CHECK-GI-NEXT: mov w0, w19 244; CHECK-GI-NEXT: fmov d0, d8 245; CHECK-GI-NEXT: bl __powidf2 246; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 247; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 248; CHECK-GI-NEXT: mov w0, w19 249; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Folded Reload 250; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 251; CHECK-GI-NEXT: bl __powidf2 252; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 253; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 254; CHECK-GI-NEXT: mov w0, w19 255; CHECK-GI-NEXT: fmov d0, d9 256; CHECK-GI-NEXT: bl __powidf2 257; CHECK-GI-NEXT: ldp q1, q2, [sp, #16] // 32-byte Folded Reload 258; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 259; CHECK-GI-NEXT: ldp x30, x19, [sp, #64] // 16-byte Folded Reload 260; CHECK-GI-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload 261; CHECK-GI-NEXT: mov v2.d[1], v1.d[0] 262; CHECK-GI-NEXT: ldr q1, [sp] // 16-byte Folded Reload 263; CHECK-GI-NEXT: mov v1.d[1], v0.d[0] 264; CHECK-GI-NEXT: mov v0.16b, v2.16b 265; CHECK-GI-NEXT: add sp, sp, #80 266; CHECK-GI-NEXT: ret 267entry: 268 %c = call <4 x double> @llvm.powi.v4f64.i32(<4 x double> %a, i32 %b) 269 ret <4 x double> %c 270} 271 272define <2 x float> @powi_v2f32(<2 x float> %a, i32 %b) { 273; CHECK-SD-LABEL: powi_v2f32: 274; CHECK-SD: // %bb.0: // %entry 275; CHECK-SD-NEXT: sub sp, sp, #48 276; CHECK-SD-NEXT: stp x30, x19, [sp, #32] // 16-byte Folded Spill 277; CHECK-SD-NEXT: .cfi_def_cfa_offset 48 278; CHECK-SD-NEXT: .cfi_offset w19, -8 279; CHECK-SD-NEXT: .cfi_offset w30, -16 280; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 281; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 282; CHECK-SD-NEXT: mov w19, w0 283; CHECK-SD-NEXT: mov s0, v0.s[1] 284; CHECK-SD-NEXT: bl __powisf2 285; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 286; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 287; CHECK-SD-NEXT: mov w0, w19 288; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 289; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q0 290; CHECK-SD-NEXT: bl __powisf2 291; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 292; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 293; CHECK-SD-NEXT: ldp x30, x19, [sp, #32] // 16-byte Folded Reload 294; CHECK-SD-NEXT: mov v0.s[1], v1.s[0] 295; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 296; CHECK-SD-NEXT: add sp, sp, #48 297; CHECK-SD-NEXT: ret 298; 299; CHECK-GI-LABEL: powi_v2f32: 300; CHECK-GI: // %bb.0: // %entry 301; CHECK-GI-NEXT: sub sp, sp, #48 302; CHECK-GI-NEXT: str d8, [sp, #16] // 8-byte Folded Spill 303; CHECK-GI-NEXT: stp x30, x19, [sp, #32] // 16-byte Folded Spill 304; CHECK-GI-NEXT: .cfi_def_cfa_offset 48 305; CHECK-GI-NEXT: .cfi_offset w19, -8 306; CHECK-GI-NEXT: .cfi_offset w30, -16 307; CHECK-GI-NEXT: .cfi_offset b8, -32 308; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 309; CHECK-GI-NEXT: mov s8, v0.s[1] 310; CHECK-GI-NEXT: mov w19, w0 311; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q0 312; CHECK-GI-NEXT: bl __powisf2 313; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 314; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 315; CHECK-GI-NEXT: mov w0, w19 316; CHECK-GI-NEXT: fmov s0, s8 317; CHECK-GI-NEXT: bl __powisf2 318; CHECK-GI-NEXT: ldr q1, [sp] // 16-byte Folded Reload 319; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 320; CHECK-GI-NEXT: ldp x30, x19, [sp, #32] // 16-byte Folded Reload 321; CHECK-GI-NEXT: ldr d8, [sp, #16] // 8-byte Folded Reload 322; CHECK-GI-NEXT: mov v1.s[1], v0.s[0] 323; CHECK-GI-NEXT: fmov d0, d1 324; CHECK-GI-NEXT: add sp, sp, #48 325; CHECK-GI-NEXT: ret 326entry: 327 %c = call <2 x float> @llvm.powi.v2f32.i32(<2 x float> %a, i32 %b) 328 ret <2 x float> %c 329} 330 331define <3 x float> @powi_v3f32(<3 x float> %a, i32 %b) { 332; CHECK-SD-LABEL: powi_v3f32: 333; CHECK-SD: // %bb.0: // %entry 334; CHECK-SD-NEXT: sub sp, sp, #48 335; CHECK-SD-NEXT: stp x30, x19, [sp, #32] // 16-byte Folded Spill 336; CHECK-SD-NEXT: .cfi_def_cfa_offset 48 337; CHECK-SD-NEXT: .cfi_offset w19, -8 338; CHECK-SD-NEXT: .cfi_offset w30, -16 339; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 340; CHECK-SD-NEXT: mov s0, v0.s[1] 341; CHECK-SD-NEXT: mov w19, w0 342; CHECK-SD-NEXT: bl __powisf2 343; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 344; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 345; CHECK-SD-NEXT: mov w0, w19 346; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 347; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q0 348; CHECK-SD-NEXT: bl __powisf2 349; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload 350; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 351; CHECK-SD-NEXT: mov w0, w19 352; CHECK-SD-NEXT: mov v0.s[1], v1.s[0] 353; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 354; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 355; CHECK-SD-NEXT: mov s0, v0.s[2] 356; CHECK-SD-NEXT: bl __powisf2 357; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload 358; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 359; CHECK-SD-NEXT: ldp x30, x19, [sp, #32] // 16-byte Folded Reload 360; CHECK-SD-NEXT: mov v1.s[2], v0.s[0] 361; CHECK-SD-NEXT: mov v0.16b, v1.16b 362; CHECK-SD-NEXT: add sp, sp, #48 363; CHECK-SD-NEXT: ret 364; 365; CHECK-GI-LABEL: powi_v3f32: 366; CHECK-GI: // %bb.0: // %entry 367; CHECK-GI-NEXT: sub sp, sp, #64 368; CHECK-GI-NEXT: stp d9, d8, [sp, #32] // 16-byte Folded Spill 369; CHECK-GI-NEXT: stp x30, x19, [sp, #48] // 16-byte Folded Spill 370; CHECK-GI-NEXT: .cfi_def_cfa_offset 64 371; CHECK-GI-NEXT: .cfi_offset w19, -8 372; CHECK-GI-NEXT: .cfi_offset w30, -16 373; CHECK-GI-NEXT: .cfi_offset b8, -24 374; CHECK-GI-NEXT: .cfi_offset b9, -32 375; CHECK-GI-NEXT: mov s8, v0.s[1] 376; CHECK-GI-NEXT: mov s9, v0.s[2] 377; CHECK-GI-NEXT: mov w19, w0 378; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q0 379; CHECK-GI-NEXT: bl __powisf2 380; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 381; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 382; CHECK-GI-NEXT: mov w0, w19 383; CHECK-GI-NEXT: fmov s0, s8 384; CHECK-GI-NEXT: bl __powisf2 385; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 386; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 387; CHECK-GI-NEXT: mov w0, w19 388; CHECK-GI-NEXT: fmov s0, s9 389; CHECK-GI-NEXT: bl __powisf2 390; CHECK-GI-NEXT: ldp q2, q1, [sp] // 32-byte Folded Reload 391; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 392; CHECK-GI-NEXT: ldp x30, x19, [sp, #48] // 16-byte Folded Reload 393; CHECK-GI-NEXT: ldp d9, d8, [sp, #32] // 16-byte Folded Reload 394; CHECK-GI-NEXT: mov v1.s[1], v2.s[0] 395; CHECK-GI-NEXT: mov v1.s[2], v0.s[0] 396; CHECK-GI-NEXT: mov v0.16b, v1.16b 397; CHECK-GI-NEXT: add sp, sp, #64 398; CHECK-GI-NEXT: ret 399entry: 400 %c = call <3 x float> @llvm.powi.v3f32.i32(<3 x float> %a, i32 %b) 401 ret <3 x float> %c 402} 403 404define <4 x float> @powi_v4f32(<4 x float> %a, i32 %b) { 405; CHECK-SD-LABEL: powi_v4f32: 406; CHECK-SD: // %bb.0: // %entry 407; CHECK-SD-NEXT: sub sp, sp, #48 408; CHECK-SD-NEXT: stp x30, x19, [sp, #32] // 16-byte Folded Spill 409; CHECK-SD-NEXT: .cfi_def_cfa_offset 48 410; CHECK-SD-NEXT: .cfi_offset w19, -8 411; CHECK-SD-NEXT: .cfi_offset w30, -16 412; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 413; CHECK-SD-NEXT: mov s0, v0.s[1] 414; CHECK-SD-NEXT: mov w19, w0 415; CHECK-SD-NEXT: bl __powisf2 416; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 417; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 418; CHECK-SD-NEXT: mov w0, w19 419; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 420; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q0 421; CHECK-SD-NEXT: bl __powisf2 422; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload 423; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 424; CHECK-SD-NEXT: mov w0, w19 425; CHECK-SD-NEXT: mov v0.s[1], v1.s[0] 426; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 427; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 428; CHECK-SD-NEXT: mov s0, v0.s[2] 429; CHECK-SD-NEXT: bl __powisf2 430; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload 431; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 432; CHECK-SD-NEXT: mov w0, w19 433; CHECK-SD-NEXT: mov v1.s[2], v0.s[0] 434; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 435; CHECK-SD-NEXT: mov s0, v0.s[3] 436; CHECK-SD-NEXT: str q1, [sp] // 16-byte Folded Spill 437; CHECK-SD-NEXT: bl __powisf2 438; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload 439; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 440; CHECK-SD-NEXT: ldp x30, x19, [sp, #32] // 16-byte Folded Reload 441; CHECK-SD-NEXT: mov v1.s[3], v0.s[0] 442; CHECK-SD-NEXT: mov v0.16b, v1.16b 443; CHECK-SD-NEXT: add sp, sp, #48 444; CHECK-SD-NEXT: ret 445; 446; CHECK-GI-LABEL: powi_v4f32: 447; CHECK-GI: // %bb.0: // %entry 448; CHECK-GI-NEXT: sub sp, sp, #96 449; CHECK-GI-NEXT: str d10, [sp, #48] // 8-byte Folded Spill 450; CHECK-GI-NEXT: stp d9, d8, [sp, #64] // 16-byte Folded Spill 451; CHECK-GI-NEXT: stp x30, x19, [sp, #80] // 16-byte Folded Spill 452; CHECK-GI-NEXT: .cfi_def_cfa_offset 96 453; CHECK-GI-NEXT: .cfi_offset w19, -8 454; CHECK-GI-NEXT: .cfi_offset w30, -16 455; CHECK-GI-NEXT: .cfi_offset b8, -24 456; CHECK-GI-NEXT: .cfi_offset b9, -32 457; CHECK-GI-NEXT: .cfi_offset b10, -48 458; CHECK-GI-NEXT: mov s8, v0.s[1] 459; CHECK-GI-NEXT: mov s9, v0.s[2] 460; CHECK-GI-NEXT: mov w19, w0 461; CHECK-GI-NEXT: mov s10, v0.s[3] 462; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q0 463; CHECK-GI-NEXT: bl __powisf2 464; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 465; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 466; CHECK-GI-NEXT: mov w0, w19 467; CHECK-GI-NEXT: fmov s0, s8 468; CHECK-GI-NEXT: bl __powisf2 469; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 470; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 471; CHECK-GI-NEXT: mov w0, w19 472; CHECK-GI-NEXT: fmov s0, s9 473; CHECK-GI-NEXT: bl __powisf2 474; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 475; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 476; CHECK-GI-NEXT: mov w0, w19 477; CHECK-GI-NEXT: fmov s0, s10 478; CHECK-GI-NEXT: bl __powisf2 479; CHECK-GI-NEXT: ldp q2, q1, [sp, #16] // 32-byte Folded Reload 480; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 481; CHECK-GI-NEXT: ldr d10, [sp, #48] // 8-byte Folded Reload 482; CHECK-GI-NEXT: ldp x30, x19, [sp, #80] // 16-byte Folded Reload 483; CHECK-GI-NEXT: ldp d9, d8, [sp, #64] // 16-byte Folded Reload 484; CHECK-GI-NEXT: mov v1.s[1], v2.s[0] 485; CHECK-GI-NEXT: ldr q2, [sp] // 16-byte Folded Reload 486; CHECK-GI-NEXT: mov v1.s[2], v2.s[0] 487; CHECK-GI-NEXT: mov v1.s[3], v0.s[0] 488; CHECK-GI-NEXT: mov v0.16b, v1.16b 489; CHECK-GI-NEXT: add sp, sp, #96 490; CHECK-GI-NEXT: ret 491entry: 492 %c = call <4 x float> @llvm.powi.v4f32.i32(<4 x float> %a, i32 %b) 493 ret <4 x float> %c 494} 495 496define <8 x float> @powi_v8f32(<8 x float> %a, i32 %b) { 497; CHECK-SD-LABEL: powi_v8f32: 498; CHECK-SD: // %bb.0: // %entry 499; CHECK-SD-NEXT: sub sp, sp, #64 500; CHECK-SD-NEXT: stp x30, x19, [sp, #48] // 16-byte Folded Spill 501; CHECK-SD-NEXT: .cfi_def_cfa_offset 64 502; CHECK-SD-NEXT: .cfi_offset w19, -8 503; CHECK-SD-NEXT: .cfi_offset w30, -16 504; CHECK-SD-NEXT: stp q0, q1, [sp] // 32-byte Folded Spill 505; CHECK-SD-NEXT: mov s0, v0.s[1] 506; CHECK-SD-NEXT: mov w19, w0 507; CHECK-SD-NEXT: bl __powisf2 508; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 509; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 510; CHECK-SD-NEXT: mov w0, w19 511; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 512; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q0 513; CHECK-SD-NEXT: bl __powisf2 514; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Folded Reload 515; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 516; CHECK-SD-NEXT: mov w0, w19 517; CHECK-SD-NEXT: mov v0.s[1], v1.s[0] 518; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 519; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 520; CHECK-SD-NEXT: mov s0, v0.s[2] 521; CHECK-SD-NEXT: bl __powisf2 522; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Folded Reload 523; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 524; CHECK-SD-NEXT: mov w0, w19 525; CHECK-SD-NEXT: mov v1.s[2], v0.s[0] 526; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 527; CHECK-SD-NEXT: mov s0, v0.s[3] 528; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Folded Spill 529; CHECK-SD-NEXT: bl __powisf2 530; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Folded Reload 531; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 532; CHECK-SD-NEXT: mov w0, w19 533; CHECK-SD-NEXT: mov v1.s[3], v0.s[0] 534; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 535; CHECK-SD-NEXT: mov s0, v0.s[1] 536; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Folded Spill 537; CHECK-SD-NEXT: bl __powisf2 538; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 539; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 540; CHECK-SD-NEXT: mov w0, w19 541; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 542; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q0 543; CHECK-SD-NEXT: bl __powisf2 544; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload 545; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 546; CHECK-SD-NEXT: mov w0, w19 547; CHECK-SD-NEXT: mov v0.s[1], v1.s[0] 548; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 549; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 550; CHECK-SD-NEXT: mov s0, v0.s[2] 551; CHECK-SD-NEXT: bl __powisf2 552; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload 553; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 554; CHECK-SD-NEXT: mov w0, w19 555; CHECK-SD-NEXT: mov v1.s[2], v0.s[0] 556; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 557; CHECK-SD-NEXT: mov s0, v0.s[3] 558; CHECK-SD-NEXT: str q1, [sp] // 16-byte Folded Spill 559; CHECK-SD-NEXT: bl __powisf2 560; CHECK-SD-NEXT: fmov s2, s0 561; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload 562; CHECK-SD-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload 563; CHECK-SD-NEXT: ldp x30, x19, [sp, #48] // 16-byte Folded Reload 564; CHECK-SD-NEXT: mov v1.s[3], v2.s[0] 565; CHECK-SD-NEXT: add sp, sp, #64 566; CHECK-SD-NEXT: ret 567; 568; CHECK-GI-LABEL: powi_v8f32: 569; CHECK-GI: // %bb.0: // %entry 570; CHECK-GI-NEXT: sub sp, sp, #176 571; CHECK-GI-NEXT: stp d13, d12, [sp, #112] // 16-byte Folded Spill 572; CHECK-GI-NEXT: stp d11, d10, [sp, #128] // 16-byte Folded Spill 573; CHECK-GI-NEXT: stp d9, d8, [sp, #144] // 16-byte Folded Spill 574; CHECK-GI-NEXT: stp x30, x19, [sp, #160] // 16-byte Folded Spill 575; CHECK-GI-NEXT: .cfi_def_cfa_offset 176 576; CHECK-GI-NEXT: .cfi_offset w19, -8 577; CHECK-GI-NEXT: .cfi_offset w30, -16 578; CHECK-GI-NEXT: .cfi_offset b8, -24 579; CHECK-GI-NEXT: .cfi_offset b9, -32 580; CHECK-GI-NEXT: .cfi_offset b10, -40 581; CHECK-GI-NEXT: .cfi_offset b11, -48 582; CHECK-GI-NEXT: .cfi_offset b12, -56 583; CHECK-GI-NEXT: .cfi_offset b13, -64 584; CHECK-GI-NEXT: str q1, [sp, #32] // 16-byte Folded Spill 585; CHECK-GI-NEXT: mov s8, v0.s[1] 586; CHECK-GI-NEXT: mov s9, v0.s[2] 587; CHECK-GI-NEXT: mov s10, v0.s[3] 588; CHECK-GI-NEXT: mov s11, v1.s[1] 589; CHECK-GI-NEXT: mov w19, w0 590; CHECK-GI-NEXT: mov s12, v1.s[2] 591; CHECK-GI-NEXT: mov s13, v1.s[3] 592; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q0 593; CHECK-GI-NEXT: bl __powisf2 594; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 595; CHECK-GI-NEXT: str q0, [sp, #96] // 16-byte Folded Spill 596; CHECK-GI-NEXT: mov w0, w19 597; CHECK-GI-NEXT: fmov s0, s8 598; CHECK-GI-NEXT: bl __powisf2 599; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 600; CHECK-GI-NEXT: str q0, [sp, #48] // 16-byte Folded Spill 601; CHECK-GI-NEXT: mov w0, w19 602; CHECK-GI-NEXT: fmov s0, s9 603; CHECK-GI-NEXT: bl __powisf2 604; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 605; CHECK-GI-NEXT: str q0, [sp, #80] // 16-byte Folded Spill 606; CHECK-GI-NEXT: mov w0, w19 607; CHECK-GI-NEXT: fmov s0, s10 608; CHECK-GI-NEXT: bl __powisf2 609; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 610; CHECK-GI-NEXT: str q0, [sp, #64] // 16-byte Folded Spill 611; CHECK-GI-NEXT: mov w0, w19 612; CHECK-GI-NEXT: ldr q0, [sp, #32] // 16-byte Folded Reload 613; CHECK-GI-NEXT: // kill: def $s0 killed $s0 killed $q0 614; CHECK-GI-NEXT: bl __powisf2 615; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 616; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 617; CHECK-GI-NEXT: mov w0, w19 618; CHECK-GI-NEXT: fmov s0, s11 619; CHECK-GI-NEXT: bl __powisf2 620; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 621; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 622; CHECK-GI-NEXT: mov w0, w19 623; CHECK-GI-NEXT: fmov s0, s12 624; CHECK-GI-NEXT: bl __powisf2 625; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 626; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 627; CHECK-GI-NEXT: mov w0, w19 628; CHECK-GI-NEXT: fmov s0, s13 629; CHECK-GI-NEXT: bl __powisf2 630; CHECK-GI-NEXT: ldp q3, q2, [sp, #32] // 32-byte Folded Reload 631; CHECK-GI-NEXT: // kill: def $s0 killed $s0 def $q0 632; CHECK-GI-NEXT: ldr q1, [sp, #96] // 16-byte Folded Reload 633; CHECK-GI-NEXT: ldp x30, x19, [sp, #160] // 16-byte Folded Reload 634; CHECK-GI-NEXT: ldp d9, d8, [sp, #144] // 16-byte Folded Reload 635; CHECK-GI-NEXT: mov v1.s[1], v2.s[0] 636; CHECK-GI-NEXT: ldr q2, [sp, #16] // 16-byte Folded Reload 637; CHECK-GI-NEXT: ldp d11, d10, [sp, #128] // 16-byte Folded Reload 638; CHECK-GI-NEXT: mov v3.s[1], v2.s[0] 639; CHECK-GI-NEXT: ldr q2, [sp, #80] // 16-byte Folded Reload 640; CHECK-GI-NEXT: ldp d13, d12, [sp, #112] // 16-byte Folded Reload 641; CHECK-GI-NEXT: mov v1.s[2], v2.s[0] 642; CHECK-GI-NEXT: ldr q2, [sp] // 16-byte Folded Reload 643; CHECK-GI-NEXT: mov v3.s[2], v2.s[0] 644; CHECK-GI-NEXT: ldr q2, [sp, #64] // 16-byte Folded Reload 645; CHECK-GI-NEXT: mov v1.s[3], v2.s[0] 646; CHECK-GI-NEXT: mov v3.s[3], v0.s[0] 647; CHECK-GI-NEXT: mov v2.16b, v1.16b 648; CHECK-GI-NEXT: mov v1.16b, v3.16b 649; CHECK-GI-NEXT: mov v0.16b, v2.16b 650; CHECK-GI-NEXT: add sp, sp, #176 651; CHECK-GI-NEXT: ret 652entry: 653 %c = call <8 x float> @llvm.powi.v8f32.i32(<8 x float> %a, i32 %b) 654 ret <8 x float> %c 655} 656 657define <7 x half> @powi_v7f16(<7 x half> %a, i32 %b) { 658; CHECK-SD-LABEL: powi_v7f16: 659; CHECK-SD: // %bb.0: // %entry 660; CHECK-SD-NEXT: sub sp, sp, #48 661; CHECK-SD-NEXT: stp x30, x19, [sp, #32] // 16-byte Folded Spill 662; CHECK-SD-NEXT: .cfi_def_cfa_offset 48 663; CHECK-SD-NEXT: .cfi_offset w19, -8 664; CHECK-SD-NEXT: .cfi_offset w30, -16 665; CHECK-SD-NEXT: mov h1, v0.h[1] 666; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 667; CHECK-SD-NEXT: mov w19, w0 668; CHECK-SD-NEXT: fcvt s0, h1 669; CHECK-SD-NEXT: bl __powisf2 670; CHECK-SD-NEXT: fcvt h0, s0 671; CHECK-SD-NEXT: mov w0, w19 672; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 673; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 674; CHECK-SD-NEXT: fcvt s0, h0 675; CHECK-SD-NEXT: bl __powisf2 676; CHECK-SD-NEXT: fcvt h0, s0 677; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 678; CHECK-SD-NEXT: mov w0, w19 679; CHECK-SD-NEXT: mov v0.h[1], v1.h[0] 680; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 681; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 682; CHECK-SD-NEXT: mov h0, v0.h[2] 683; CHECK-SD-NEXT: fcvt s0, h0 684; CHECK-SD-NEXT: bl __powisf2 685; CHECK-SD-NEXT: fcvt h0, s0 686; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 687; CHECK-SD-NEXT: mov w0, w19 688; CHECK-SD-NEXT: mov v1.h[2], v0.h[0] 689; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 690; CHECK-SD-NEXT: mov h0, v0.h[3] 691; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Folded Spill 692; CHECK-SD-NEXT: fcvt s0, h0 693; CHECK-SD-NEXT: bl __powisf2 694; CHECK-SD-NEXT: fcvt h0, s0 695; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 696; CHECK-SD-NEXT: mov w0, w19 697; CHECK-SD-NEXT: mov v1.h[3], v0.h[0] 698; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 699; CHECK-SD-NEXT: mov h0, v0.h[4] 700; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Folded Spill 701; CHECK-SD-NEXT: fcvt s0, h0 702; CHECK-SD-NEXT: bl __powisf2 703; CHECK-SD-NEXT: fcvt h0, s0 704; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 705; CHECK-SD-NEXT: mov w0, w19 706; CHECK-SD-NEXT: mov v1.h[4], v0.h[0] 707; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 708; CHECK-SD-NEXT: mov h0, v0.h[5] 709; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Folded Spill 710; CHECK-SD-NEXT: fcvt s0, h0 711; CHECK-SD-NEXT: bl __powisf2 712; CHECK-SD-NEXT: fcvt h0, s0 713; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 714; CHECK-SD-NEXT: mov w0, w19 715; CHECK-SD-NEXT: mov v1.h[5], v0.h[0] 716; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 717; CHECK-SD-NEXT: mov h0, v0.h[6] 718; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Folded Spill 719; CHECK-SD-NEXT: fcvt s0, h0 720; CHECK-SD-NEXT: bl __powisf2 721; CHECK-SD-NEXT: fcvt h0, s0 722; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 723; CHECK-SD-NEXT: mov w0, w19 724; CHECK-SD-NEXT: mov v1.h[6], v0.h[0] 725; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 726; CHECK-SD-NEXT: mov h0, v0.h[7] 727; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Folded Spill 728; CHECK-SD-NEXT: fcvt s0, h0 729; CHECK-SD-NEXT: bl __powisf2 730; CHECK-SD-NEXT: fcvt h1, s0 731; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 732; CHECK-SD-NEXT: ldp x30, x19, [sp, #32] // 16-byte Folded Reload 733; CHECK-SD-NEXT: mov v0.h[7], v1.h[0] 734; CHECK-SD-NEXT: add sp, sp, #48 735; CHECK-SD-NEXT: ret 736; 737; CHECK-GI-LABEL: powi_v7f16: 738; CHECK-GI: // %bb.0: // %entry 739; CHECK-GI-NEXT: sub sp, sp, #160 740; CHECK-GI-NEXT: stp d13, d12, [sp, #96] // 16-byte Folded Spill 741; CHECK-GI-NEXT: stp d11, d10, [sp, #112] // 16-byte Folded Spill 742; CHECK-GI-NEXT: stp d9, d8, [sp, #128] // 16-byte Folded Spill 743; CHECK-GI-NEXT: stp x30, x19, [sp, #144] // 16-byte Folded Spill 744; CHECK-GI-NEXT: .cfi_def_cfa_offset 160 745; CHECK-GI-NEXT: .cfi_offset w19, -8 746; CHECK-GI-NEXT: .cfi_offset w30, -16 747; CHECK-GI-NEXT: .cfi_offset b8, -24 748; CHECK-GI-NEXT: .cfi_offset b9, -32 749; CHECK-GI-NEXT: .cfi_offset b10, -40 750; CHECK-GI-NEXT: .cfi_offset b11, -48 751; CHECK-GI-NEXT: .cfi_offset b12, -56 752; CHECK-GI-NEXT: .cfi_offset b13, -64 753; CHECK-GI-NEXT: mov h8, v0.h[1] 754; CHECK-GI-NEXT: mov h9, v0.h[2] 755; CHECK-GI-NEXT: mov w19, w0 756; CHECK-GI-NEXT: mov h10, v0.h[3] 757; CHECK-GI-NEXT: mov h11, v0.h[4] 758; CHECK-GI-NEXT: mov h12, v0.h[5] 759; CHECK-GI-NEXT: mov h13, v0.h[6] 760; CHECK-GI-NEXT: fcvt s0, h0 761; CHECK-GI-NEXT: bl __powisf2 762; CHECK-GI-NEXT: fcvt s1, h8 763; CHECK-GI-NEXT: fcvt h0, s0 764; CHECK-GI-NEXT: mov w0, w19 765; CHECK-GI-NEXT: str q0, [sp, #80] // 16-byte Folded Spill 766; CHECK-GI-NEXT: fmov s0, s1 767; CHECK-GI-NEXT: bl __powisf2 768; CHECK-GI-NEXT: fcvt s1, h9 769; CHECK-GI-NEXT: fcvt h0, s0 770; CHECK-GI-NEXT: mov w0, w19 771; CHECK-GI-NEXT: str q0, [sp, #64] // 16-byte Folded Spill 772; CHECK-GI-NEXT: fmov s0, s1 773; CHECK-GI-NEXT: bl __powisf2 774; CHECK-GI-NEXT: fcvt s1, h10 775; CHECK-GI-NEXT: fcvt h0, s0 776; CHECK-GI-NEXT: mov w0, w19 777; CHECK-GI-NEXT: str q0, [sp, #48] // 16-byte Folded Spill 778; CHECK-GI-NEXT: fmov s0, s1 779; CHECK-GI-NEXT: bl __powisf2 780; CHECK-GI-NEXT: fcvt s1, h11 781; CHECK-GI-NEXT: fcvt h0, s0 782; CHECK-GI-NEXT: mov w0, w19 783; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 784; CHECK-GI-NEXT: fmov s0, s1 785; CHECK-GI-NEXT: bl __powisf2 786; CHECK-GI-NEXT: fcvt s1, h12 787; CHECK-GI-NEXT: fcvt h0, s0 788; CHECK-GI-NEXT: mov w0, w19 789; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 790; CHECK-GI-NEXT: fmov s0, s1 791; CHECK-GI-NEXT: bl __powisf2 792; CHECK-GI-NEXT: fcvt s1, h13 793; CHECK-GI-NEXT: fcvt h0, s0 794; CHECK-GI-NEXT: mov w0, w19 795; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 796; CHECK-GI-NEXT: fmov s0, s1 797; CHECK-GI-NEXT: bl __powisf2 798; CHECK-GI-NEXT: ldp q2, q1, [sp, #64] // 32-byte Folded Reload 799; CHECK-GI-NEXT: fcvt h0, s0 800; CHECK-GI-NEXT: ldp x30, x19, [sp, #144] // 16-byte Folded Reload 801; CHECK-GI-NEXT: ldp d9, d8, [sp, #128] // 16-byte Folded Reload 802; CHECK-GI-NEXT: mov v1.h[1], v2.h[0] 803; CHECK-GI-NEXT: ldp q2, q3, [sp, #32] // 32-byte Folded Reload 804; CHECK-GI-NEXT: ldp d11, d10, [sp, #112] // 16-byte Folded Reload 805; CHECK-GI-NEXT: ldp d13, d12, [sp, #96] // 16-byte Folded Reload 806; CHECK-GI-NEXT: mov v1.h[2], v3.h[0] 807; CHECK-GI-NEXT: mov v1.h[3], v2.h[0] 808; CHECK-GI-NEXT: ldp q2, q3, [sp] // 32-byte Folded Reload 809; CHECK-GI-NEXT: mov v1.h[4], v3.h[0] 810; CHECK-GI-NEXT: mov v1.h[5], v2.h[0] 811; CHECK-GI-NEXT: mov v1.h[6], v0.h[0] 812; CHECK-GI-NEXT: mov v0.16b, v1.16b 813; CHECK-GI-NEXT: add sp, sp, #160 814; CHECK-GI-NEXT: ret 815entry: 816 %c = call <7 x half> @llvm.powi.v7f16.i32(<7 x half> %a, i32 %b) 817 ret <7 x half> %c 818} 819 820define <4 x half> @powi_v4f16(<4 x half> %a, i32 %b) { 821; CHECK-SD-LABEL: powi_v4f16: 822; CHECK-SD: // %bb.0: // %entry 823; CHECK-SD-NEXT: sub sp, sp, #48 824; CHECK-SD-NEXT: stp x30, x19, [sp, #32] // 16-byte Folded Spill 825; CHECK-SD-NEXT: .cfi_def_cfa_offset 48 826; CHECK-SD-NEXT: .cfi_offset w19, -8 827; CHECK-SD-NEXT: .cfi_offset w30, -16 828; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 829; CHECK-SD-NEXT: mov h1, v0.h[1] 830; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 831; CHECK-SD-NEXT: mov w19, w0 832; CHECK-SD-NEXT: fcvt s0, h1 833; CHECK-SD-NEXT: bl __powisf2 834; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 835; CHECK-SD-NEXT: fcvt h0, s0 836; CHECK-SD-NEXT: mov w0, w19 837; CHECK-SD-NEXT: fcvt s1, h1 838; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 839; CHECK-SD-NEXT: fmov s0, s1 840; CHECK-SD-NEXT: bl __powisf2 841; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 842; CHECK-SD-NEXT: fcvt h2, s0 843; CHECK-SD-NEXT: mov w0, w19 844; CHECK-SD-NEXT: mov h1, v1.h[2] 845; CHECK-SD-NEXT: fcvt s0, h1 846; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload 847; CHECK-SD-NEXT: mov v2.h[1], v1.h[0] 848; CHECK-SD-NEXT: str q2, [sp] // 16-byte Folded Spill 849; CHECK-SD-NEXT: bl __powisf2 850; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 851; CHECK-SD-NEXT: fcvt h2, s0 852; CHECK-SD-NEXT: mov w0, w19 853; CHECK-SD-NEXT: mov h1, v1.h[3] 854; CHECK-SD-NEXT: fcvt s0, h1 855; CHECK-SD-NEXT: ldr q1, [sp] // 16-byte Folded Reload 856; CHECK-SD-NEXT: mov v1.h[2], v2.h[0] 857; CHECK-SD-NEXT: str q1, [sp] // 16-byte Folded Spill 858; CHECK-SD-NEXT: bl __powisf2 859; CHECK-SD-NEXT: fcvt h1, s0 860; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 861; CHECK-SD-NEXT: ldp x30, x19, [sp, #32] // 16-byte Folded Reload 862; CHECK-SD-NEXT: mov v0.h[3], v1.h[0] 863; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 864; CHECK-SD-NEXT: add sp, sp, #48 865; CHECK-SD-NEXT: ret 866; 867; CHECK-GI-LABEL: powi_v4f16: 868; CHECK-GI: // %bb.0: // %entry 869; CHECK-GI-NEXT: sub sp, sp, #96 870; CHECK-GI-NEXT: str d10, [sp, #48] // 8-byte Folded Spill 871; CHECK-GI-NEXT: stp d9, d8, [sp, #64] // 16-byte Folded Spill 872; CHECK-GI-NEXT: stp x30, x19, [sp, #80] // 16-byte Folded Spill 873; CHECK-GI-NEXT: .cfi_def_cfa_offset 96 874; CHECK-GI-NEXT: .cfi_offset w19, -8 875; CHECK-GI-NEXT: .cfi_offset w30, -16 876; CHECK-GI-NEXT: .cfi_offset b8, -24 877; CHECK-GI-NEXT: .cfi_offset b9, -32 878; CHECK-GI-NEXT: .cfi_offset b10, -48 879; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 880; CHECK-GI-NEXT: mov h8, v0.h[1] 881; CHECK-GI-NEXT: mov h9, v0.h[2] 882; CHECK-GI-NEXT: mov w19, w0 883; CHECK-GI-NEXT: mov h10, v0.h[3] 884; CHECK-GI-NEXT: fcvt s0, h0 885; CHECK-GI-NEXT: bl __powisf2 886; CHECK-GI-NEXT: fcvt s1, h8 887; CHECK-GI-NEXT: fcvt h0, s0 888; CHECK-GI-NEXT: mov w0, w19 889; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 890; CHECK-GI-NEXT: fmov s0, s1 891; CHECK-GI-NEXT: bl __powisf2 892; CHECK-GI-NEXT: fcvt s1, h9 893; CHECK-GI-NEXT: fcvt h0, s0 894; CHECK-GI-NEXT: mov w0, w19 895; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 896; CHECK-GI-NEXT: fmov s0, s1 897; CHECK-GI-NEXT: bl __powisf2 898; CHECK-GI-NEXT: fcvt s1, h10 899; CHECK-GI-NEXT: fcvt h0, s0 900; CHECK-GI-NEXT: mov w0, w19 901; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 902; CHECK-GI-NEXT: fmov s0, s1 903; CHECK-GI-NEXT: bl __powisf2 904; CHECK-GI-NEXT: ldp q3, q2, [sp] // 32-byte Folded Reload 905; CHECK-GI-NEXT: fcvt h0, s0 906; CHECK-GI-NEXT: ldr q1, [sp, #32] // 16-byte Folded Reload 907; CHECK-GI-NEXT: ldp x30, x19, [sp, #80] // 16-byte Folded Reload 908; CHECK-GI-NEXT: ldp d9, d8, [sp, #64] // 16-byte Folded Reload 909; CHECK-GI-NEXT: ldr d10, [sp, #48] // 8-byte Folded Reload 910; CHECK-GI-NEXT: mov v1.h[1], v3.h[0] 911; CHECK-GI-NEXT: mov v1.h[2], v2.h[0] 912; CHECK-GI-NEXT: mov v1.h[3], v0.h[0] 913; CHECK-GI-NEXT: mov v0.16b, v1.16b 914; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0 915; CHECK-GI-NEXT: add sp, sp, #96 916; CHECK-GI-NEXT: ret 917entry: 918 %c = call <4 x half> @llvm.powi.v4f16.i32(<4 x half> %a, i32 %b) 919 ret <4 x half> %c 920} 921 922define <8 x half> @powi_v8f16(<8 x half> %a, i32 %b) { 923; CHECK-SD-LABEL: powi_v8f16: 924; CHECK-SD: // %bb.0: // %entry 925; CHECK-SD-NEXT: sub sp, sp, #48 926; CHECK-SD-NEXT: stp x30, x19, [sp, #32] // 16-byte Folded Spill 927; CHECK-SD-NEXT: .cfi_def_cfa_offset 48 928; CHECK-SD-NEXT: .cfi_offset w19, -8 929; CHECK-SD-NEXT: .cfi_offset w30, -16 930; CHECK-SD-NEXT: mov h1, v0.h[1] 931; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 932; CHECK-SD-NEXT: mov w19, w0 933; CHECK-SD-NEXT: fcvt s0, h1 934; CHECK-SD-NEXT: bl __powisf2 935; CHECK-SD-NEXT: fcvt h0, s0 936; CHECK-SD-NEXT: mov w0, w19 937; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 938; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 939; CHECK-SD-NEXT: fcvt s0, h0 940; CHECK-SD-NEXT: bl __powisf2 941; CHECK-SD-NEXT: fcvt h0, s0 942; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 943; CHECK-SD-NEXT: mov w0, w19 944; CHECK-SD-NEXT: mov v0.h[1], v1.h[0] 945; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 946; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 947; CHECK-SD-NEXT: mov h0, v0.h[2] 948; CHECK-SD-NEXT: fcvt s0, h0 949; CHECK-SD-NEXT: bl __powisf2 950; CHECK-SD-NEXT: fcvt h0, s0 951; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 952; CHECK-SD-NEXT: mov w0, w19 953; CHECK-SD-NEXT: mov v1.h[2], v0.h[0] 954; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 955; CHECK-SD-NEXT: mov h0, v0.h[3] 956; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Folded Spill 957; CHECK-SD-NEXT: fcvt s0, h0 958; CHECK-SD-NEXT: bl __powisf2 959; CHECK-SD-NEXT: fcvt h0, s0 960; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 961; CHECK-SD-NEXT: mov w0, w19 962; CHECK-SD-NEXT: mov v1.h[3], v0.h[0] 963; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 964; CHECK-SD-NEXT: mov h0, v0.h[4] 965; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Folded Spill 966; CHECK-SD-NEXT: fcvt s0, h0 967; CHECK-SD-NEXT: bl __powisf2 968; CHECK-SD-NEXT: fcvt h0, s0 969; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 970; CHECK-SD-NEXT: mov w0, w19 971; CHECK-SD-NEXT: mov v1.h[4], v0.h[0] 972; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 973; CHECK-SD-NEXT: mov h0, v0.h[5] 974; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Folded Spill 975; CHECK-SD-NEXT: fcvt s0, h0 976; CHECK-SD-NEXT: bl __powisf2 977; CHECK-SD-NEXT: fcvt h0, s0 978; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 979; CHECK-SD-NEXT: mov w0, w19 980; CHECK-SD-NEXT: mov v1.h[5], v0.h[0] 981; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 982; CHECK-SD-NEXT: mov h0, v0.h[6] 983; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Folded Spill 984; CHECK-SD-NEXT: fcvt s0, h0 985; CHECK-SD-NEXT: bl __powisf2 986; CHECK-SD-NEXT: fcvt h0, s0 987; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 988; CHECK-SD-NEXT: mov w0, w19 989; CHECK-SD-NEXT: mov v1.h[6], v0.h[0] 990; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 991; CHECK-SD-NEXT: mov h0, v0.h[7] 992; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Folded Spill 993; CHECK-SD-NEXT: fcvt s0, h0 994; CHECK-SD-NEXT: bl __powisf2 995; CHECK-SD-NEXT: fcvt h1, s0 996; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 997; CHECK-SD-NEXT: ldp x30, x19, [sp, #32] // 16-byte Folded Reload 998; CHECK-SD-NEXT: mov v0.h[7], v1.h[0] 999; CHECK-SD-NEXT: add sp, sp, #48 1000; CHECK-SD-NEXT: ret 1001; 1002; CHECK-GI-LABEL: powi_v8f16: 1003; CHECK-GI: // %bb.0: // %entry 1004; CHECK-GI-NEXT: sub sp, sp, #192 1005; CHECK-GI-NEXT: str d14, [sp, #112] // 8-byte Folded Spill 1006; CHECK-GI-NEXT: stp d13, d12, [sp, #128] // 16-byte Folded Spill 1007; CHECK-GI-NEXT: stp d11, d10, [sp, #144] // 16-byte Folded Spill 1008; CHECK-GI-NEXT: stp d9, d8, [sp, #160] // 16-byte Folded Spill 1009; CHECK-GI-NEXT: stp x30, x19, [sp, #176] // 16-byte Folded Spill 1010; CHECK-GI-NEXT: .cfi_def_cfa_offset 192 1011; CHECK-GI-NEXT: .cfi_offset w19, -8 1012; CHECK-GI-NEXT: .cfi_offset w30, -16 1013; CHECK-GI-NEXT: .cfi_offset b8, -24 1014; CHECK-GI-NEXT: .cfi_offset b9, -32 1015; CHECK-GI-NEXT: .cfi_offset b10, -40 1016; CHECK-GI-NEXT: .cfi_offset b11, -48 1017; CHECK-GI-NEXT: .cfi_offset b12, -56 1018; CHECK-GI-NEXT: .cfi_offset b13, -64 1019; CHECK-GI-NEXT: .cfi_offset b14, -80 1020; CHECK-GI-NEXT: mov h8, v0.h[1] 1021; CHECK-GI-NEXT: mov h9, v0.h[2] 1022; CHECK-GI-NEXT: mov w19, w0 1023; CHECK-GI-NEXT: mov h10, v0.h[3] 1024; CHECK-GI-NEXT: mov h11, v0.h[4] 1025; CHECK-GI-NEXT: mov h12, v0.h[5] 1026; CHECK-GI-NEXT: mov h13, v0.h[6] 1027; CHECK-GI-NEXT: mov h14, v0.h[7] 1028; CHECK-GI-NEXT: fcvt s0, h0 1029; CHECK-GI-NEXT: bl __powisf2 1030; CHECK-GI-NEXT: fcvt s1, h8 1031; CHECK-GI-NEXT: fcvt h0, s0 1032; CHECK-GI-NEXT: mov w0, w19 1033; CHECK-GI-NEXT: str q0, [sp, #96] // 16-byte Folded Spill 1034; CHECK-GI-NEXT: fmov s0, s1 1035; CHECK-GI-NEXT: bl __powisf2 1036; CHECK-GI-NEXT: fcvt s1, h9 1037; CHECK-GI-NEXT: fcvt h0, s0 1038; CHECK-GI-NEXT: mov w0, w19 1039; CHECK-GI-NEXT: str q0, [sp, #80] // 16-byte Folded Spill 1040; CHECK-GI-NEXT: fmov s0, s1 1041; CHECK-GI-NEXT: bl __powisf2 1042; CHECK-GI-NEXT: fcvt s1, h10 1043; CHECK-GI-NEXT: fcvt h0, s0 1044; CHECK-GI-NEXT: mov w0, w19 1045; CHECK-GI-NEXT: str q0, [sp, #64] // 16-byte Folded Spill 1046; CHECK-GI-NEXT: fmov s0, s1 1047; CHECK-GI-NEXT: bl __powisf2 1048; CHECK-GI-NEXT: fcvt s1, h11 1049; CHECK-GI-NEXT: fcvt h0, s0 1050; CHECK-GI-NEXT: mov w0, w19 1051; CHECK-GI-NEXT: str q0, [sp, #48] // 16-byte Folded Spill 1052; CHECK-GI-NEXT: fmov s0, s1 1053; CHECK-GI-NEXT: bl __powisf2 1054; CHECK-GI-NEXT: fcvt s1, h12 1055; CHECK-GI-NEXT: fcvt h0, s0 1056; CHECK-GI-NEXT: mov w0, w19 1057; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 1058; CHECK-GI-NEXT: fmov s0, s1 1059; CHECK-GI-NEXT: bl __powisf2 1060; CHECK-GI-NEXT: fcvt s1, h13 1061; CHECK-GI-NEXT: fcvt h0, s0 1062; CHECK-GI-NEXT: mov w0, w19 1063; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 1064; CHECK-GI-NEXT: fmov s0, s1 1065; CHECK-GI-NEXT: bl __powisf2 1066; CHECK-GI-NEXT: fcvt s1, h14 1067; CHECK-GI-NEXT: fcvt h0, s0 1068; CHECK-GI-NEXT: mov w0, w19 1069; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 1070; CHECK-GI-NEXT: fmov s0, s1 1071; CHECK-GI-NEXT: bl __powisf2 1072; CHECK-GI-NEXT: ldp q2, q1, [sp, #80] // 32-byte Folded Reload 1073; CHECK-GI-NEXT: fcvt h0, s0 1074; CHECK-GI-NEXT: ldp x30, x19, [sp, #176] // 16-byte Folded Reload 1075; CHECK-GI-NEXT: ldr d14, [sp, #112] // 8-byte Folded Reload 1076; CHECK-GI-NEXT: ldp d9, d8, [sp, #160] // 16-byte Folded Reload 1077; CHECK-GI-NEXT: mov v1.h[1], v2.h[0] 1078; CHECK-GI-NEXT: ldp q2, q3, [sp, #48] // 32-byte Folded Reload 1079; CHECK-GI-NEXT: ldp d11, d10, [sp, #144] // 16-byte Folded Reload 1080; CHECK-GI-NEXT: ldp d13, d12, [sp, #128] // 16-byte Folded Reload 1081; CHECK-GI-NEXT: mov v1.h[2], v3.h[0] 1082; CHECK-GI-NEXT: mov v1.h[3], v2.h[0] 1083; CHECK-GI-NEXT: ldp q2, q3, [sp, #16] // 32-byte Folded Reload 1084; CHECK-GI-NEXT: mov v1.h[4], v3.h[0] 1085; CHECK-GI-NEXT: mov v1.h[5], v2.h[0] 1086; CHECK-GI-NEXT: ldr q2, [sp] // 16-byte Folded Reload 1087; CHECK-GI-NEXT: mov v1.h[6], v2.h[0] 1088; CHECK-GI-NEXT: mov v1.h[7], v0.h[0] 1089; CHECK-GI-NEXT: mov v0.16b, v1.16b 1090; CHECK-GI-NEXT: add sp, sp, #192 1091; CHECK-GI-NEXT: ret 1092entry: 1093 %c = call <8 x half> @llvm.powi.v8f16.i32(<8 x half> %a, i32 %b) 1094 ret <8 x half> %c 1095} 1096 1097define <16 x half> @powi_v16f16(<16 x half> %a, i32 %b) { 1098; CHECK-SD-LABEL: powi_v16f16: 1099; CHECK-SD: // %bb.0: // %entry 1100; CHECK-SD-NEXT: sub sp, sp, #64 1101; CHECK-SD-NEXT: stp x30, x19, [sp, #48] // 16-byte Folded Spill 1102; CHECK-SD-NEXT: .cfi_def_cfa_offset 64 1103; CHECK-SD-NEXT: .cfi_offset w19, -8 1104; CHECK-SD-NEXT: .cfi_offset w30, -16 1105; CHECK-SD-NEXT: stp q1, q0, [sp] // 32-byte Folded Spill 1106; CHECK-SD-NEXT: mov h1, v0.h[1] 1107; CHECK-SD-NEXT: mov w19, w0 1108; CHECK-SD-NEXT: fcvt s0, h1 1109; CHECK-SD-NEXT: bl __powisf2 1110; CHECK-SD-NEXT: fcvt h0, s0 1111; CHECK-SD-NEXT: mov w0, w19 1112; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 1113; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 1114; CHECK-SD-NEXT: fcvt s0, h0 1115; CHECK-SD-NEXT: bl __powisf2 1116; CHECK-SD-NEXT: fcvt h0, s0 1117; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Folded Reload 1118; CHECK-SD-NEXT: mov w0, w19 1119; CHECK-SD-NEXT: mov v0.h[1], v1.h[0] 1120; CHECK-SD-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 1121; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 1122; CHECK-SD-NEXT: mov h0, v0.h[2] 1123; CHECK-SD-NEXT: fcvt s0, h0 1124; CHECK-SD-NEXT: bl __powisf2 1125; CHECK-SD-NEXT: fcvt h0, s0 1126; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Folded Reload 1127; CHECK-SD-NEXT: mov w0, w19 1128; CHECK-SD-NEXT: mov v1.h[2], v0.h[0] 1129; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 1130; CHECK-SD-NEXT: mov h0, v0.h[3] 1131; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Folded Spill 1132; CHECK-SD-NEXT: fcvt s0, h0 1133; CHECK-SD-NEXT: bl __powisf2 1134; CHECK-SD-NEXT: fcvt h0, s0 1135; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Folded Reload 1136; CHECK-SD-NEXT: mov w0, w19 1137; CHECK-SD-NEXT: mov v1.h[3], v0.h[0] 1138; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 1139; CHECK-SD-NEXT: mov h0, v0.h[4] 1140; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Folded Spill 1141; CHECK-SD-NEXT: fcvt s0, h0 1142; CHECK-SD-NEXT: bl __powisf2 1143; CHECK-SD-NEXT: fcvt h0, s0 1144; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Folded Reload 1145; CHECK-SD-NEXT: mov w0, w19 1146; CHECK-SD-NEXT: mov v1.h[4], v0.h[0] 1147; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 1148; CHECK-SD-NEXT: mov h0, v0.h[5] 1149; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Folded Spill 1150; CHECK-SD-NEXT: fcvt s0, h0 1151; CHECK-SD-NEXT: bl __powisf2 1152; CHECK-SD-NEXT: fcvt h0, s0 1153; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Folded Reload 1154; CHECK-SD-NEXT: mov w0, w19 1155; CHECK-SD-NEXT: mov v1.h[5], v0.h[0] 1156; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 1157; CHECK-SD-NEXT: mov h0, v0.h[6] 1158; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Folded Spill 1159; CHECK-SD-NEXT: fcvt s0, h0 1160; CHECK-SD-NEXT: bl __powisf2 1161; CHECK-SD-NEXT: fcvt h0, s0 1162; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Folded Reload 1163; CHECK-SD-NEXT: mov w0, w19 1164; CHECK-SD-NEXT: mov v1.h[6], v0.h[0] 1165; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 1166; CHECK-SD-NEXT: mov h0, v0.h[7] 1167; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Folded Spill 1168; CHECK-SD-NEXT: fcvt s0, h0 1169; CHECK-SD-NEXT: bl __powisf2 1170; CHECK-SD-NEXT: fcvt h0, s0 1171; CHECK-SD-NEXT: ldr q1, [sp, #32] // 16-byte Folded Reload 1172; CHECK-SD-NEXT: mov w0, w19 1173; CHECK-SD-NEXT: mov v1.h[7], v0.h[0] 1174; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 1175; CHECK-SD-NEXT: mov h0, v0.h[1] 1176; CHECK-SD-NEXT: str q1, [sp, #32] // 16-byte Folded Spill 1177; CHECK-SD-NEXT: fcvt s0, h0 1178; CHECK-SD-NEXT: bl __powisf2 1179; CHECK-SD-NEXT: fcvt h0, s0 1180; CHECK-SD-NEXT: mov w0, w19 1181; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 1182; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 1183; CHECK-SD-NEXT: fcvt s0, h0 1184; CHECK-SD-NEXT: bl __powisf2 1185; CHECK-SD-NEXT: fcvt h0, s0 1186; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 1187; CHECK-SD-NEXT: mov w0, w19 1188; CHECK-SD-NEXT: mov v0.h[1], v1.h[0] 1189; CHECK-SD-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 1190; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 1191; CHECK-SD-NEXT: mov h0, v0.h[2] 1192; CHECK-SD-NEXT: fcvt s0, h0 1193; CHECK-SD-NEXT: bl __powisf2 1194; CHECK-SD-NEXT: fcvt h0, s0 1195; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 1196; CHECK-SD-NEXT: mov w0, w19 1197; CHECK-SD-NEXT: mov v1.h[2], v0.h[0] 1198; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 1199; CHECK-SD-NEXT: mov h0, v0.h[3] 1200; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Folded Spill 1201; CHECK-SD-NEXT: fcvt s0, h0 1202; CHECK-SD-NEXT: bl __powisf2 1203; CHECK-SD-NEXT: fcvt h0, s0 1204; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 1205; CHECK-SD-NEXT: mov w0, w19 1206; CHECK-SD-NEXT: mov v1.h[3], v0.h[0] 1207; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 1208; CHECK-SD-NEXT: mov h0, v0.h[4] 1209; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Folded Spill 1210; CHECK-SD-NEXT: fcvt s0, h0 1211; CHECK-SD-NEXT: bl __powisf2 1212; CHECK-SD-NEXT: fcvt h0, s0 1213; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 1214; CHECK-SD-NEXT: mov w0, w19 1215; CHECK-SD-NEXT: mov v1.h[4], v0.h[0] 1216; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 1217; CHECK-SD-NEXT: mov h0, v0.h[5] 1218; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Folded Spill 1219; CHECK-SD-NEXT: fcvt s0, h0 1220; CHECK-SD-NEXT: bl __powisf2 1221; CHECK-SD-NEXT: fcvt h0, s0 1222; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 1223; CHECK-SD-NEXT: mov w0, w19 1224; CHECK-SD-NEXT: mov v1.h[5], v0.h[0] 1225; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 1226; CHECK-SD-NEXT: mov h0, v0.h[6] 1227; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Folded Spill 1228; CHECK-SD-NEXT: fcvt s0, h0 1229; CHECK-SD-NEXT: bl __powisf2 1230; CHECK-SD-NEXT: fcvt h0, s0 1231; CHECK-SD-NEXT: ldr q1, [sp, #16] // 16-byte Folded Reload 1232; CHECK-SD-NEXT: mov w0, w19 1233; CHECK-SD-NEXT: mov v1.h[6], v0.h[0] 1234; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 1235; CHECK-SD-NEXT: mov h0, v0.h[7] 1236; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Folded Spill 1237; CHECK-SD-NEXT: fcvt s0, h0 1238; CHECK-SD-NEXT: bl __powisf2 1239; CHECK-SD-NEXT: fmov s1, s0 1240; CHECK-SD-NEXT: ldp x30, x19, [sp, #48] // 16-byte Folded Reload 1241; CHECK-SD-NEXT: fcvt h2, s1 1242; CHECK-SD-NEXT: ldp q1, q0, [sp, #16] // 32-byte Folded Reload 1243; CHECK-SD-NEXT: mov v1.h[7], v2.h[0] 1244; CHECK-SD-NEXT: add sp, sp, #64 1245; CHECK-SD-NEXT: ret 1246; 1247; CHECK-GI-LABEL: powi_v16f16: 1248; CHECK-GI: // %bb.0: // %entry 1249; CHECK-GI-NEXT: sub sp, sp, #336 1250; CHECK-GI-NEXT: stp d15, d14, [sp, #240] // 16-byte Folded Spill 1251; CHECK-GI-NEXT: stp d13, d12, [sp, #256] // 16-byte Folded Spill 1252; CHECK-GI-NEXT: stp d11, d10, [sp, #272] // 16-byte Folded Spill 1253; CHECK-GI-NEXT: stp d9, d8, [sp, #288] // 16-byte Folded Spill 1254; CHECK-GI-NEXT: str x29, [sp, #304] // 8-byte Folded Spill 1255; CHECK-GI-NEXT: stp x30, x19, [sp, #320] // 16-byte Folded Spill 1256; CHECK-GI-NEXT: .cfi_def_cfa_offset 336 1257; CHECK-GI-NEXT: .cfi_offset w19, -8 1258; CHECK-GI-NEXT: .cfi_offset w30, -16 1259; CHECK-GI-NEXT: .cfi_offset w29, -32 1260; CHECK-GI-NEXT: .cfi_offset b8, -40 1261; CHECK-GI-NEXT: .cfi_offset b9, -48 1262; CHECK-GI-NEXT: .cfi_offset b10, -56 1263; CHECK-GI-NEXT: .cfi_offset b11, -64 1264; CHECK-GI-NEXT: .cfi_offset b12, -72 1265; CHECK-GI-NEXT: .cfi_offset b13, -80 1266; CHECK-GI-NEXT: .cfi_offset b14, -88 1267; CHECK-GI-NEXT: .cfi_offset b15, -96 1268; CHECK-GI-NEXT: mov v2.16b, v1.16b 1269; CHECK-GI-NEXT: str q1, [sp, #64] // 16-byte Folded Spill 1270; CHECK-GI-NEXT: mov h14, v1.h[1] 1271; CHECK-GI-NEXT: mov h1, v1.h[2] 1272; CHECK-GI-NEXT: mov h8, v0.h[1] 1273; CHECK-GI-NEXT: mov w19, w0 1274; CHECK-GI-NEXT: mov h9, v0.h[2] 1275; CHECK-GI-NEXT: mov h10, v0.h[3] 1276; CHECK-GI-NEXT: mov h11, v0.h[4] 1277; CHECK-GI-NEXT: mov h12, v0.h[5] 1278; CHECK-GI-NEXT: mov h13, v0.h[6] 1279; CHECK-GI-NEXT: mov h15, v0.h[7] 1280; CHECK-GI-NEXT: fcvt s0, h0 1281; CHECK-GI-NEXT: str h1, [sp, #16] // 2-byte Folded Spill 1282; CHECK-GI-NEXT: mov h1, v2.h[3] 1283; CHECK-GI-NEXT: str h1, [sp, #32] // 2-byte Folded Spill 1284; CHECK-GI-NEXT: mov h1, v2.h[4] 1285; CHECK-GI-NEXT: str h1, [sp, #48] // 2-byte Folded Spill 1286; CHECK-GI-NEXT: mov h1, v2.h[5] 1287; CHECK-GI-NEXT: str h1, [sp, #80] // 2-byte Folded Spill 1288; CHECK-GI-NEXT: mov h1, v2.h[6] 1289; CHECK-GI-NEXT: str h1, [sp, #112] // 2-byte Folded Spill 1290; CHECK-GI-NEXT: mov h1, v2.h[7] 1291; CHECK-GI-NEXT: str h1, [sp, #176] // 2-byte Folded Spill 1292; CHECK-GI-NEXT: bl __powisf2 1293; CHECK-GI-NEXT: fcvt s1, h8 1294; CHECK-GI-NEXT: fcvt h0, s0 1295; CHECK-GI-NEXT: mov w0, w19 1296; CHECK-GI-NEXT: str q0, [sp, #192] // 16-byte Folded Spill 1297; CHECK-GI-NEXT: fmov s0, s1 1298; CHECK-GI-NEXT: bl __powisf2 1299; CHECK-GI-NEXT: fcvt s1, h9 1300; CHECK-GI-NEXT: fcvt h0, s0 1301; CHECK-GI-NEXT: mov w0, w19 1302; CHECK-GI-NEXT: str q0, [sp, #144] // 16-byte Folded Spill 1303; CHECK-GI-NEXT: fmov s0, s1 1304; CHECK-GI-NEXT: bl __powisf2 1305; CHECK-GI-NEXT: fcvt s1, h10 1306; CHECK-GI-NEXT: fcvt h0, s0 1307; CHECK-GI-NEXT: mov w0, w19 1308; CHECK-GI-NEXT: str q0, [sp, #224] // 16-byte Folded Spill 1309; CHECK-GI-NEXT: fmov s0, s1 1310; CHECK-GI-NEXT: bl __powisf2 1311; CHECK-GI-NEXT: fcvt s1, h11 1312; CHECK-GI-NEXT: fcvt h0, s0 1313; CHECK-GI-NEXT: mov w0, w19 1314; CHECK-GI-NEXT: str q0, [sp, #208] // 16-byte Folded Spill 1315; CHECK-GI-NEXT: fmov s0, s1 1316; CHECK-GI-NEXT: bl __powisf2 1317; CHECK-GI-NEXT: fcvt s1, h12 1318; CHECK-GI-NEXT: fcvt h0, s0 1319; CHECK-GI-NEXT: mov w0, w19 1320; CHECK-GI-NEXT: str q0, [sp, #160] // 16-byte Folded Spill 1321; CHECK-GI-NEXT: fmov s0, s1 1322; CHECK-GI-NEXT: bl __powisf2 1323; CHECK-GI-NEXT: fcvt s1, h13 1324; CHECK-GI-NEXT: fcvt h0, s0 1325; CHECK-GI-NEXT: mov w0, w19 1326; CHECK-GI-NEXT: str q0, [sp, #128] // 16-byte Folded Spill 1327; CHECK-GI-NEXT: fmov s0, s1 1328; CHECK-GI-NEXT: bl __powisf2 1329; CHECK-GI-NEXT: fcvt s1, h15 1330; CHECK-GI-NEXT: fcvt h0, s0 1331; CHECK-GI-NEXT: mov w0, w19 1332; CHECK-GI-NEXT: str q0, [sp, #96] // 16-byte Folded Spill 1333; CHECK-GI-NEXT: fmov s0, s1 1334; CHECK-GI-NEXT: bl __powisf2 1335; CHECK-GI-NEXT: ldr q1, [sp, #64] // 16-byte Folded Reload 1336; CHECK-GI-NEXT: fcvt h0, s0 1337; CHECK-GI-NEXT: mov w0, w19 1338; CHECK-GI-NEXT: fcvt s1, h1 1339; CHECK-GI-NEXT: str q0, [sp, #64] // 16-byte Folded Spill 1340; CHECK-GI-NEXT: fmov s0, s1 1341; CHECK-GI-NEXT: bl __powisf2 1342; CHECK-GI-NEXT: fcvt s1, h14 1343; CHECK-GI-NEXT: fcvt h0, s0 1344; CHECK-GI-NEXT: mov w0, w19 1345; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 1346; CHECK-GI-NEXT: fmov s0, s1 1347; CHECK-GI-NEXT: bl __powisf2 1348; CHECK-GI-NEXT: ldr h1, [sp, #16] // 2-byte Folded Reload 1349; CHECK-GI-NEXT: fcvt h0, s0 1350; CHECK-GI-NEXT: mov w0, w19 1351; CHECK-GI-NEXT: fcvt s1, h1 1352; CHECK-GI-NEXT: str q0, [sp, #16] // 16-byte Folded Spill 1353; CHECK-GI-NEXT: fmov s0, s1 1354; CHECK-GI-NEXT: bl __powisf2 1355; CHECK-GI-NEXT: ldr h1, [sp, #32] // 2-byte Folded Reload 1356; CHECK-GI-NEXT: fcvt h0, s0 1357; CHECK-GI-NEXT: mov w0, w19 1358; CHECK-GI-NEXT: fcvt s1, h1 1359; CHECK-GI-NEXT: str q0, [sp, #32] // 16-byte Folded Spill 1360; CHECK-GI-NEXT: fmov s0, s1 1361; CHECK-GI-NEXT: bl __powisf2 1362; CHECK-GI-NEXT: ldr h1, [sp, #48] // 2-byte Folded Reload 1363; CHECK-GI-NEXT: fcvt h0, s0 1364; CHECK-GI-NEXT: mov w0, w19 1365; CHECK-GI-NEXT: fcvt s1, h1 1366; CHECK-GI-NEXT: str q0, [sp, #48] // 16-byte Folded Spill 1367; CHECK-GI-NEXT: fmov s0, s1 1368; CHECK-GI-NEXT: bl __powisf2 1369; CHECK-GI-NEXT: ldr h1, [sp, #80] // 2-byte Folded Reload 1370; CHECK-GI-NEXT: fcvt h0, s0 1371; CHECK-GI-NEXT: mov w0, w19 1372; CHECK-GI-NEXT: fcvt s1, h1 1373; CHECK-GI-NEXT: str q0, [sp, #80] // 16-byte Folded Spill 1374; CHECK-GI-NEXT: fmov s0, s1 1375; CHECK-GI-NEXT: bl __powisf2 1376; CHECK-GI-NEXT: ldr h1, [sp, #112] // 2-byte Folded Reload 1377; CHECK-GI-NEXT: fcvt h0, s0 1378; CHECK-GI-NEXT: mov w0, w19 1379; CHECK-GI-NEXT: fcvt s1, h1 1380; CHECK-GI-NEXT: str q0, [sp, #112] // 16-byte Folded Spill 1381; CHECK-GI-NEXT: fmov s0, s1 1382; CHECK-GI-NEXT: bl __powisf2 1383; CHECK-GI-NEXT: ldr h1, [sp, #176] // 2-byte Folded Reload 1384; CHECK-GI-NEXT: fcvt h0, s0 1385; CHECK-GI-NEXT: mov w0, w19 1386; CHECK-GI-NEXT: fcvt s1, h1 1387; CHECK-GI-NEXT: str q0, [sp, #176] // 16-byte Folded Spill 1388; CHECK-GI-NEXT: fmov s0, s1 1389; CHECK-GI-NEXT: bl __powisf2 1390; CHECK-GI-NEXT: ldr q3, [sp, #192] // 16-byte Folded Reload 1391; CHECK-GI-NEXT: ldr q2, [sp, #144] // 16-byte Folded Reload 1392; CHECK-GI-NEXT: ldr x29, [sp, #304] // 8-byte Folded Reload 1393; CHECK-GI-NEXT: ldp x30, x19, [sp, #320] // 16-byte Folded Reload 1394; CHECK-GI-NEXT: mov v3.h[1], v2.h[0] 1395; CHECK-GI-NEXT: ldp q1, q2, [sp] // 32-byte Folded Reload 1396; CHECK-GI-NEXT: ldp d9, d8, [sp, #288] // 16-byte Folded Reload 1397; CHECK-GI-NEXT: ldp d11, d10, [sp, #272] // 16-byte Folded Reload 1398; CHECK-GI-NEXT: mov v1.h[1], v2.h[0] 1399; CHECK-GI-NEXT: ldr q2, [sp, #224] // 16-byte Folded Reload 1400; CHECK-GI-NEXT: ldp d13, d12, [sp, #256] // 16-byte Folded Reload 1401; CHECK-GI-NEXT: mov v3.h[2], v2.h[0] 1402; CHECK-GI-NEXT: ldr q2, [sp, #32] // 16-byte Folded Reload 1403; CHECK-GI-NEXT: ldp d15, d14, [sp, #240] // 16-byte Folded Reload 1404; CHECK-GI-NEXT: mov v1.h[2], v2.h[0] 1405; CHECK-GI-NEXT: ldr q2, [sp, #208] // 16-byte Folded Reload 1406; CHECK-GI-NEXT: mov v3.h[3], v2.h[0] 1407; CHECK-GI-NEXT: ldr q2, [sp, #48] // 16-byte Folded Reload 1408; CHECK-GI-NEXT: mov v1.h[3], v2.h[0] 1409; CHECK-GI-NEXT: ldr q2, [sp, #160] // 16-byte Folded Reload 1410; CHECK-GI-NEXT: mov v3.h[4], v2.h[0] 1411; CHECK-GI-NEXT: ldr q2, [sp, #80] // 16-byte Folded Reload 1412; CHECK-GI-NEXT: mov v1.h[4], v2.h[0] 1413; CHECK-GI-NEXT: ldp q2, q4, [sp, #112] // 32-byte Folded Reload 1414; CHECK-GI-NEXT: mov v3.h[5], v4.h[0] 1415; CHECK-GI-NEXT: mov v1.h[5], v2.h[0] 1416; CHECK-GI-NEXT: fcvt h2, s0 1417; CHECK-GI-NEXT: ldr q0, [sp, #96] // 16-byte Folded Reload 1418; CHECK-GI-NEXT: mov v3.h[6], v0.h[0] 1419; CHECK-GI-NEXT: ldr q0, [sp, #176] // 16-byte Folded Reload 1420; CHECK-GI-NEXT: mov v1.h[6], v0.h[0] 1421; CHECK-GI-NEXT: ldr q0, [sp, #64] // 16-byte Folded Reload 1422; CHECK-GI-NEXT: mov v3.h[7], v0.h[0] 1423; CHECK-GI-NEXT: mov v1.h[7], v2.h[0] 1424; CHECK-GI-NEXT: mov v0.16b, v3.16b 1425; CHECK-GI-NEXT: add sp, sp, #336 1426; CHECK-GI-NEXT: ret 1427entry: 1428 %c = call <16 x half> @llvm.powi.v16f16.i32(<16 x half> %a, i32 %b) 1429 ret <16 x half> %c 1430} 1431 1432define <2 x fp128> @powi_v2fp128(<2 x fp128> %a, i32 %b) { 1433; CHECK-SD-LABEL: powi_v2fp128: 1434; CHECK-SD: // %bb.0: // %entry 1435; CHECK-SD-NEXT: sub sp, sp, #48 1436; CHECK-SD-NEXT: stp x30, x19, [sp, #32] // 16-byte Folded Spill 1437; CHECK-SD-NEXT: .cfi_def_cfa_offset 48 1438; CHECK-SD-NEXT: .cfi_offset w19, -8 1439; CHECK-SD-NEXT: .cfi_offset w30, -16 1440; CHECK-SD-NEXT: mov w19, w0 1441; CHECK-SD-NEXT: str q1, [sp, #16] // 16-byte Folded Spill 1442; CHECK-SD-NEXT: bl __powitf2 1443; CHECK-SD-NEXT: str q0, [sp] // 16-byte Folded Spill 1444; CHECK-SD-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 1445; CHECK-SD-NEXT: mov w0, w19 1446; CHECK-SD-NEXT: bl __powitf2 1447; CHECK-SD-NEXT: ldp x30, x19, [sp, #32] // 16-byte Folded Reload 1448; CHECK-SD-NEXT: mov v1.16b, v0.16b 1449; CHECK-SD-NEXT: ldr q0, [sp] // 16-byte Folded Reload 1450; CHECK-SD-NEXT: add sp, sp, #48 1451; CHECK-SD-NEXT: ret 1452; 1453; CHECK-GI-LABEL: powi_v2fp128: 1454; CHECK-GI: // %bb.0: // %entry 1455; CHECK-GI-NEXT: sub sp, sp, #48 1456; CHECK-GI-NEXT: stp x30, x19, [sp, #32] // 16-byte Folded Spill 1457; CHECK-GI-NEXT: .cfi_def_cfa_offset 48 1458; CHECK-GI-NEXT: .cfi_offset w19, -8 1459; CHECK-GI-NEXT: .cfi_offset w30, -16 1460; CHECK-GI-NEXT: str q1, [sp, #16] // 16-byte Folded Spill 1461; CHECK-GI-NEXT: mov w19, w0 1462; CHECK-GI-NEXT: bl __powitf2 1463; CHECK-GI-NEXT: str q0, [sp] // 16-byte Folded Spill 1464; CHECK-GI-NEXT: ldr q0, [sp, #16] // 16-byte Folded Reload 1465; CHECK-GI-NEXT: mov w0, w19 1466; CHECK-GI-NEXT: bl __powitf2 1467; CHECK-GI-NEXT: ldp x30, x19, [sp, #32] // 16-byte Folded Reload 1468; CHECK-GI-NEXT: mov v1.16b, v0.16b 1469; CHECK-GI-NEXT: ldr q0, [sp] // 16-byte Folded Reload 1470; CHECK-GI-NEXT: add sp, sp, #48 1471; CHECK-GI-NEXT: ret 1472entry: 1473 %c = call <2 x fp128> @llvm.powi.v2fp128.i32(<2 x fp128> %a, i32 %b) 1474 ret <2 x fp128> %c 1475} 1476 1477declare <1 x double> @llvm.powi.v1f64.i32(<1 x double>, i32) 1478declare <16 x half> @llvm.powi.v16f16.i32(<16 x half>, i32) 1479declare <2 x double> @llvm.powi.v2f64.i32(<2 x double>, i32) 1480declare <2 x float> @llvm.powi.v2f32.i32(<2 x float>, i32) 1481declare <2 x fp128> @llvm.powi.v2fp128.i32(<2 x fp128>, i32) 1482declare <3 x double> @llvm.powi.v3f64.i32(<3 x double>, i32) 1483declare <3 x float> @llvm.powi.v3f32.i32(<3 x float>, i32) 1484declare <4 x double> @llvm.powi.v4f64.i32(<4 x double>, i32) 1485declare <4 x float> @llvm.powi.v4f32.i32(<4 x float>, i32) 1486declare <4 x half> @llvm.powi.v4f16.i32(<4 x half>, i32) 1487declare <7 x half> @llvm.powi.v7f16.i32(<7 x half>, i32) 1488declare <8 x float> @llvm.powi.v8f32.i32(<8 x float>, i32) 1489declare <8 x half> @llvm.powi.v8f16.i32(<8 x half>, i32) 1490declare double @llvm.powi.f64.i32(double, i32) 1491declare float @llvm.powi.f32.i32(float, i32) 1492declare fp128 @llvm.powi.fp128.i32(fp128, i32) 1493declare half @llvm.powi.f16.i32(half, i32) 1494