746 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc < %s -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -mattr=+neon -fp-contract=fast | FileCheck %s3 4attributes #0 = { strictfp }5 6declare float @llvm.fma.f32(float, float, float)7declare double @llvm.fma.f64(double, double, double)8declare float @llvm.experimental.constrained.fma.f32(float, float, float, metadata, metadata)9declare double @llvm.experimental.constrained.fma.f64(double, double, double, metadata, metadata)10 11define float @test_fmla_ss4S_0(float %a, float %b, <4 x float> %v) {12; CHECK-LABEL: test_fmla_ss4S_0:13; CHECK: // %bb.0:14; CHECK-NEXT: fmadd s0, s1, s2, s015; CHECK-NEXT: ret16 %tmp1 = extractelement <4 x float> %v, i32 017 %tmp2 = call float @llvm.fma.f32(float %b, float %tmp1, float %a)18 ret float %tmp219}20 21define float @test_fmla_ss4S_0_swap(float %a, float %b, <4 x float> %v) {22; CHECK-LABEL: test_fmla_ss4S_0_swap:23; CHECK: // %bb.0:24; CHECK-NEXT: fmadd s0, s2, s1, s025; CHECK-NEXT: ret26 %tmp1 = extractelement <4 x float> %v, i32 027 %tmp2 = call float @llvm.fma.f32(float %tmp1, float %b, float %a)28 ret float %tmp229}30 31define float @test_fmla_ss4S_3(float %a, float %b, <4 x float> %v) {32; CHECK-LABEL: test_fmla_ss4S_3:33; CHECK: // %bb.0:34; CHECK-NEXT: fmla s0, s1, v2.s[3]35; CHECK-NEXT: ret36 %tmp1 = extractelement <4 x float> %v, i32 337 %tmp2 = call float @llvm.fma.f32(float %b, float %tmp1, float %a)38 ret float %tmp239}40 41define float @test_fmla_ss4S_3_swap(float %a, float %b, <4 x float> %v) {42; CHECK-LABEL: test_fmla_ss4S_3_swap:43; CHECK: // %bb.0:44; CHECK-NEXT: fmla s0, s0, v2.s[3]45; CHECK-NEXT: ret46 %tmp1 = extractelement <4 x float> %v, i32 347 %tmp2 = call float @llvm.fma.f32(float %tmp1, float %a, float %a)48 ret float %tmp249}50 51define float @test_fmla_ss2S_0(float %a, float %b, <2 x float> %v) {52; CHECK-LABEL: test_fmla_ss2S_0:53; CHECK: // %bb.0:54; CHECK-NEXT: // kill: def $d2 killed $d2 def $q255; CHECK-NEXT: fmadd s0, s1, s2, s056; CHECK-NEXT: ret57 %tmp1 = extractelement <2 x float> %v, i32 058 %tmp2 = call float @llvm.fma.f32(float %b, float %tmp1, float %a)59 ret float %tmp260}61 62define float @test_fmla_ss2S_0_swap(float %a, float %b, <2 x float> %v) {63; CHECK-LABEL: test_fmla_ss2S_0_swap:64; CHECK: // %bb.0:65; CHECK-NEXT: // kill: def $d2 killed $d2 def $q266; CHECK-NEXT: fmadd s0, s2, s1, s067; CHECK-NEXT: ret68 %tmp1 = extractelement <2 x float> %v, i32 069 %tmp2 = call float @llvm.fma.f32(float %tmp1, float %b, float %a)70 ret float %tmp271}72 73define float @test_fmla_ss2S_1(float %a, float %b, <2 x float> %v) {74; CHECK-LABEL: test_fmla_ss2S_1:75; CHECK: // %bb.0:76; CHECK-NEXT: // kill: def $d2 killed $d2 def $q277; CHECK-NEXT: fmla s0, s1, v2.s[1]78; CHECK-NEXT: ret79 %tmp1 = extractelement <2 x float> %v, i32 180 %tmp2 = call float @llvm.fma.f32(float %b, float %tmp1, float %a)81 ret float %tmp282}83 84define float @test_fmla_ss4S_3_ext0(float %a, <4 x float> %v) {85; CHECK-LABEL: test_fmla_ss4S_3_ext0:86; CHECK: // %bb.0:87; CHECK-NEXT: fmla s0, s1, v1.s[3]88; CHECK-NEXT: ret89 %tmp0 = extractelement <4 x float> %v, i32 090 %tmp1 = extractelement <4 x float> %v, i32 391 %tmp2 = call float @llvm.fma.f32(float %tmp0, float %tmp1, float %a)92 ret float %tmp293}94 95define float @test_fmla_ss4S_3_ext0_swp(float %a, <4 x float> %v) {96; CHECK-LABEL: test_fmla_ss4S_3_ext0_swp:97; CHECK: // %bb.0:98; CHECK-NEXT: fmla s0, s1, v1.s[3]99; CHECK-NEXT: ret100 %tmp0 = extractelement <4 x float> %v, i32 0101 %tmp1 = extractelement <4 x float> %v, i32 3102 %tmp2 = call float @llvm.fma.f32(float %tmp1, float %tmp0, float %a)103 ret float %tmp2104}105 106define float @test_fmla_ss4S_0_ext0(float %a, <4 x float> %v, <4 x float> %w) {107; CHECK-LABEL: test_fmla_ss4S_0_ext0:108; CHECK: // %bb.0:109; CHECK-NEXT: fmadd s0, s1, s2, s0110; CHECK-NEXT: ret111 %tmp0 = extractelement <4 x float> %v, i32 0112 %tmp1 = extractelement <4 x float> %w, i32 0113 %tmp2 = call float @llvm.fma.f32(float %tmp0, float %tmp1, float %a)114 ret float %tmp2115}116 117define float @test_fmla_ss2S_3_ext0(float %a, <2 x float> %v) {118; CHECK-LABEL: test_fmla_ss2S_3_ext0:119; CHECK: // %bb.0:120; CHECK-NEXT: // kill: def $d1 killed $d1 def $q1121; CHECK-NEXT: fmla s0, s1, v1.s[1]122; CHECK-NEXT: ret123 %tmp0 = extractelement <2 x float> %v, i32 0124 %tmp1 = extractelement <2 x float> %v, i32 1125 %tmp2 = call float @llvm.fma.f32(float %tmp0, float %tmp1, float %a)126 ret float %tmp2127}128 129define float @test_fmla_ss2S_3_ext0_swp(float %a, <2 x float> %v) {130; CHECK-LABEL: test_fmla_ss2S_3_ext0_swp:131; CHECK: // %bb.0:132; CHECK-NEXT: // kill: def $d1 killed $d1 def $q1133; CHECK-NEXT: fmla s0, s1, v1.s[1]134; CHECK-NEXT: ret135 %tmp0 = extractelement <2 x float> %v, i32 0136 %tmp1 = extractelement <2 x float> %v, i32 1137 %tmp2 = call float @llvm.fma.f32(float %tmp1, float %tmp0, float %a)138 ret float %tmp2139}140 141define float @test_fmla_ss2S_0_ext0(float %a, <2 x float> %v, <2 x float> %w) {142; CHECK-LABEL: test_fmla_ss2S_0_ext0:143; CHECK: // %bb.0:144; CHECK-NEXT: // kill: def $d2 killed $d2 def $q2145; CHECK-NEXT: // kill: def $d1 killed $d1 def $q1146; CHECK-NEXT: fmadd s0, s1, s2, s0147; CHECK-NEXT: ret148 %tmp0 = extractelement <2 x float> %v, i32 0149 %tmp1 = extractelement <2 x float> %w, i32 0150 %tmp2 = call float @llvm.fma.f32(float %tmp0, float %tmp1, float %a)151 ret float %tmp2152}153 154define double @test_fmla_ddD_0(double %a, double %b, <1 x double> %v) {155; CHECK-LABEL: test_fmla_ddD_0:156; CHECK: // %bb.0:157; CHECK-NEXT: fmadd d0, d1, d2, d0158; CHECK-NEXT: ret159 %tmp1 = extractelement <1 x double> %v, i32 0160 %tmp2 = call double @llvm.fma.f64(double %b, double %tmp1, double %a)161 ret double %tmp2162}163 164define double @test_fmla_ddD_0_swap(double %a, double %b, <1 x double> %v) {165; CHECK-LABEL: test_fmla_ddD_0_swap:166; CHECK: // %bb.0:167; CHECK-NEXT: fmadd d0, d2, d1, d0168; CHECK-NEXT: ret169 %tmp1 = extractelement <1 x double> %v, i32 0170 %tmp2 = call double @llvm.fma.f64(double %tmp1, double %b, double %a)171 ret double %tmp2172}173 174define double @test_fmla_dd2D_0(double %a, double %b, <2 x double> %v) {175; CHECK-LABEL: test_fmla_dd2D_0:176; CHECK: // %bb.0:177; CHECK-NEXT: fmadd d0, d1, d2, d0178; CHECK-NEXT: ret179 %tmp1 = extractelement <2 x double> %v, i32 0180 %tmp2 = call double @llvm.fma.f64(double %b, double %tmp1, double %a)181 ret double %tmp2182}183 184define double @test_fmla_dd2D_0_swap(double %a, double %b, <2 x double> %v) {185; CHECK-LABEL: test_fmla_dd2D_0_swap:186; CHECK: // %bb.0:187; CHECK-NEXT: fmadd d0, d2, d1, d0188; CHECK-NEXT: ret189 %tmp1 = extractelement <2 x double> %v, i32 0190 %tmp2 = call double @llvm.fma.f64(double %tmp1, double %b, double %a)191 ret double %tmp2192}193 194define double @test_fmla_dd2D_1(double %a, double %b, <2 x double> %v) {195; CHECK-LABEL: test_fmla_dd2D_1:196; CHECK: // %bb.0:197; CHECK-NEXT: fmla d0, d1, v2.d[1]198; CHECK-NEXT: ret199 %tmp1 = extractelement <2 x double> %v, i32 1200 %tmp2 = call double @llvm.fma.f64(double %b, double %tmp1, double %a)201 ret double %tmp2202}203 204define double @test_fmla_dd2D_1_swap(double %a, double %b, <2 x double> %v) {205; CHECK-LABEL: test_fmla_dd2D_1_swap:206; CHECK: // %bb.0:207; CHECK-NEXT: fmla d0, d1, v2.d[1]208; CHECK-NEXT: ret209 %tmp1 = extractelement <2 x double> %v, i32 1210 %tmp2 = call double @llvm.fma.f64(double %tmp1, double %b, double %a)211 ret double %tmp2212}213 214define double @test_fmla_ss2D_1_ext0(double %a, <2 x double> %v) {215; CHECK-LABEL: test_fmla_ss2D_1_ext0:216; CHECK: // %bb.0:217; CHECK-NEXT: fmla d0, d1, v1.d[1]218; CHECK-NEXT: ret219 %tmp0 = extractelement <2 x double> %v, i32 0220 %tmp1 = extractelement <2 x double> %v, i32 1221 %tmp2 = call double @llvm.fma.f64(double %tmp0, double %tmp1, double %a)222 ret double %tmp2223}224 225define double @test_fmla_ss2D_1_ext0_swp(double %a, <2 x double> %v) {226; CHECK-LABEL: test_fmla_ss2D_1_ext0_swp:227; CHECK: // %bb.0:228; CHECK-NEXT: fmla d0, d1, v1.d[1]229; CHECK-NEXT: ret230 %tmp0 = extractelement <2 x double> %v, i32 0231 %tmp1 = extractelement <2 x double> %v, i32 1232 %tmp2 = call double @llvm.fma.f64(double %tmp1, double %tmp0, double %a)233 ret double %tmp2234}235 236define double @test_fmla_ss2D_0_ext0(double %a, <2 x double> %v, <2 x double> %w) {237; CHECK-LABEL: test_fmla_ss2D_0_ext0:238; CHECK: // %bb.0:239; CHECK-NEXT: fmadd d0, d1, d2, d0240; CHECK-NEXT: ret241 %tmp0 = extractelement <2 x double> %v, i32 0242 %tmp1 = extractelement <2 x double> %w, i32 0243 %tmp2 = call double @llvm.fma.f64(double %tmp0, double %tmp1, double %a)244 ret double %tmp2245}246 247define float @test_fmls_ss4S_0(float %a, float %b, <4 x float> %v) {248; CHECK-LABEL: test_fmls_ss4S_0:249; CHECK: // %bb.0: // %entry250; CHECK-NEXT: fmsub s0, s2, s1, s0251; CHECK-NEXT: ret252entry:253 %fneg = fneg float %b254 %extract = extractelement <4 x float> %v, i64 0255 %0 = tail call float @llvm.fma.f32(float %fneg, float %extract, float %a)256 ret float %0257}258 259define float @test_fmls_ss4S_0_swap(float %a, float %b, <4 x float> %v) {260; CHECK-LABEL: test_fmls_ss4S_0_swap:261; CHECK: // %bb.0: // %entry262; CHECK-NEXT: fmsub s0, s2, s1, s0263; CHECK-NEXT: ret264entry:265 %fneg = fneg float %b266 %extract = extractelement <4 x float> %v, i64 0267 %0 = tail call float @llvm.fma.f32(float %extract, float %fneg, float %a)268 ret float %0269}270 271define float @test_fmls_ss4S_3(float %a, float %b, <4 x float> %v) {272; CHECK-LABEL: test_fmls_ss4S_3:273; CHECK: // %bb.0:274; CHECK-NEXT: mov s1, v2.s[3]275; CHECK-NEXT: fmls s0, s1, v2.s[3]276; CHECK-NEXT: ret277 %tmp1 = extractelement <4 x float> %v, i32 3278 %tmp2 = fsub float -0.0, %tmp1279 %tmp3 = call float @llvm.fma.f32(float %tmp2, float %tmp1, float %a)280 ret float %tmp3281}282 283define float @test_fmls_ss4S_3_swap(float %a, float %b, <4 x float> %v) {284; CHECK-LABEL: test_fmls_ss4S_3_swap:285; CHECK: // %bb.0:286; CHECK-NEXT: mov s1, v2.s[3]287; CHECK-NEXT: fmls s0, s1, v2.s[3]288; CHECK-NEXT: ret289 %tmp1 = extractelement <4 x float> %v, i32 3290 %tmp2 = fsub float -0.0, %tmp1291 %tmp3 = call float @llvm.fma.f32(float %tmp1, float %tmp2, float %a)292 ret float %tmp3293}294 295define float @test_fmls_ss2S_0(float %a, float %b, <2 x float> %v) {296; CHECK-LABEL: test_fmls_ss2S_0:297; CHECK: // %bb.0: // %entry298; CHECK-NEXT: // kill: def $d2 killed $d2 def $q2299; CHECK-NEXT: fmsub s0, s2, s1, s0300; CHECK-NEXT: ret301entry:302 %fneg = fneg float %b303 %extract = extractelement <2 x float> %v, i64 0304 %0 = tail call float @llvm.fma.f32(float %fneg, float %extract, float %a)305 ret float %0306}307 308define float @test_fmls_ss2S_0_swap(float %a, float %b, <2 x float> %v) {309; CHECK-LABEL: test_fmls_ss2S_0_swap:310; CHECK: // %bb.0: // %entry311; CHECK-NEXT: // kill: def $d2 killed $d2 def $q2312; CHECK-NEXT: fmsub s0, s2, s1, s0313; CHECK-NEXT: ret314entry:315 %fneg = fneg float %b316 %extract = extractelement <2 x float> %v, i64 0317 %0 = tail call float @llvm.fma.f32(float %extract, float %fneg, float %a)318 ret float %0319}320 321define float @test_fmls_ss2S_1(float %a, float %b, <2 x float> %v) {322; CHECK-LABEL: test_fmls_ss2S_1:323; CHECK: // %bb.0:324; CHECK-NEXT: // kill: def $d2 killed $d2 def $q2325; CHECK-NEXT: mov s1, v2.s[1]326; CHECK-NEXT: fmls s0, s1, v2.s[1]327; CHECK-NEXT: ret328 %tmp1 = extractelement <2 x float> %v, i32 1329 %tmp2 = fsub float -0.0, %tmp1330 %tmp3 = call float @llvm.fma.f32(float %tmp2, float %tmp1, float %a)331 ret float %tmp3332}333 334define float @test_fmls_ss4S_3_ext0(float %a, <4 x float> %v) {335; CHECK-LABEL: test_fmls_ss4S_3_ext0:336; CHECK: // %bb.0:337; CHECK-NEXT: fmls s0, s1, v1.s[3]338; CHECK-NEXT: ret339 %tmp0 = extractelement <4 x float> %v, i32 0340 %tmp1 = extractelement <4 x float> %v, i32 3341 %tmp2 = fsub float -0.0, %tmp1342 %tmp3 = call float @llvm.fma.f32(float %tmp0, float %tmp2, float %a)343 ret float %tmp3344}345 346define float @test_fmls_ss4S_0_ext0(float %a, <4 x float> %v, <4 x float> %w) {347; CHECK-LABEL: test_fmls_ss4S_0_ext0:348; CHECK: // %bb.0:349; CHECK-NEXT: fmsub s0, s1, s2, s0350; CHECK-NEXT: ret351 %tmp0 = extractelement <4 x float> %v, i32 0352 %tmp1 = extractelement <4 x float> %w, i32 0353 %tmp2 = fsub float -0.0, %tmp1354 %tmp3 = call float @llvm.fma.f32(float %tmp0, float %tmp2, float %a)355 ret float %tmp3356}357 358define double @test_fmls_ddD_0(double %a, double %b, <1 x double> %v) {359; CHECK-LABEL: test_fmls_ddD_0:360; CHECK: // %bb.0: // %entry361; CHECK-NEXT: fmsub d0, d1, d2, d0362; CHECK-NEXT: ret363entry:364 %fneg = fneg double %b365 %extract = extractelement <1 x double> %v, i64 0366 %0 = tail call double @llvm.fma.f64(double %fneg, double %extract, double %a)367 ret double %0368}369 370define double @test_fmls_ddD_0_swap(double %a, double %b, <1 x double> %v) {371; CHECK-LABEL: test_fmls_ddD_0_swap:372; CHECK: // %bb.0: // %entry373; CHECK-NEXT: fmsub d0, d2, d1, d0374; CHECK-NEXT: ret375entry:376 %fneg = fneg double %b377 %extract = extractelement <1 x double> %v, i64 0378 %0 = tail call double @llvm.fma.f64(double %extract, double %fneg, double %a)379 ret double %0380}381 382define double @test_fmls_dd2D_0(double %a, double %b, <2 x double> %v) {383; CHECK-LABEL: test_fmls_dd2D_0:384; CHECK: // %bb.0: // %entry385; CHECK-NEXT: fmsub d0, d2, d1, d0386; CHECK-NEXT: ret387entry:388 %fneg = fneg double %b389 %extract = extractelement <2 x double> %v, i64 0390 %0 = tail call double @llvm.fma.f64(double %fneg, double %extract, double %a)391 ret double %0392}393 394define double @test_fmls_dd2D_0_swap(double %a, double %b, <2 x double> %v) {395; CHECK-LABEL: test_fmls_dd2D_0_swap:396; CHECK: // %bb.0: // %entry397; CHECK-NEXT: fmsub d0, d2, d1, d0398; CHECK-NEXT: ret399entry:400 %fneg = fneg double %b401 %extract = extractelement <2 x double> %v, i64 0402 %0 = tail call double @llvm.fma.f64(double %extract, double %fneg, double %a)403 ret double %0404}405 406define double @test_fmls_dd2D_1(double %a, double %b, <2 x double> %v) {407; CHECK-LABEL: test_fmls_dd2D_1:408; CHECK: // %bb.0:409; CHECK-NEXT: mov d1, v2.d[1]410; CHECK-NEXT: fmls d0, d1, v2.d[1]411; CHECK-NEXT: ret412 %tmp1 = extractelement <2 x double> %v, i32 1413 %tmp2 = fsub double -0.0, %tmp1414 %tmp3 = call double @llvm.fma.f64(double %tmp2, double %tmp1, double %a)415 ret double %tmp3416}417 418define double @test_fmls_dd2D_1_swap(double %a, double %b, <2 x double> %v) {419; CHECK-LABEL: test_fmls_dd2D_1_swap:420; CHECK: // %bb.0:421; CHECK-NEXT: mov d1, v2.d[1]422; CHECK-NEXT: fmls d0, d1, v2.d[1]423; CHECK-NEXT: ret424 %tmp1 = extractelement <2 x double> %v, i32 1425 %tmp2 = fsub double -0.0, %tmp1426 %tmp3 = call double @llvm.fma.f64(double %tmp1, double %tmp2, double %a)427 ret double %tmp3428}429 430define double @test_fmls_dd2D_1_ext0(double %a, <2 x double> %v) {431; CHECK-LABEL: test_fmls_dd2D_1_ext0:432; CHECK: // %bb.0:433; CHECK-NEXT: fmls d0, d1, v1.d[1]434; CHECK-NEXT: ret435 %tmp0 = extractelement <2 x double> %v, i32 0436 %tmp1 = extractelement <2 x double> %v, i32 1437 %tmp2 = fsub double -0.0, %tmp1438 %tmp3 = call double @llvm.fma.f64(double %tmp2, double %tmp0, double %a)439 ret double %tmp3440}441 442define double @test_fmls_dd2D_0_ext0(double %a, <2 x double> %v, <2 x double> %w) {443; CHECK-LABEL: test_fmls_dd2D_0_ext0:444; CHECK: // %bb.0:445; CHECK-NEXT: fmsub d0, d1, d2, d0446; CHECK-NEXT: ret447 %tmp0 = extractelement <2 x double> %v, i32 0448 %tmp1 = extractelement <2 x double> %w, i32 0449 %tmp2 = fsub double -0.0, %tmp1450 %tmp3 = call double @llvm.fma.f64(double %tmp2, double %tmp0, double %a)451 ret double %tmp3452}453 454define float @test_fmla_ss4S_0_strict(float %a, float %b, <4 x float> %v) #0 {455; CHECK-LABEL: test_fmla_ss4S_0_strict:456; CHECK: // %bb.0:457; CHECK-NEXT: fmadd s0, s1, s2, s0458; CHECK-NEXT: ret459 %tmp1 = extractelement <4 x float> %v, i32 0460 %tmp2 = call float @llvm.experimental.constrained.fma.f32(float %b, float %tmp1, float %a, metadata !"round.tonearest", metadata !"fpexcept.strict")461 ret float %tmp2462}463 464define float @test_fmla_ss4S_0_swap_strict(float %a, float %b, <4 x float> %v) #0 {465; CHECK-LABEL: test_fmla_ss4S_0_swap_strict:466; CHECK: // %bb.0:467; CHECK-NEXT: fmadd s0, s2, s1, s0468; CHECK-NEXT: ret469 %tmp1 = extractelement <4 x float> %v, i32 0470 %tmp2 = call float @llvm.experimental.constrained.fma.f32(float %tmp1, float %b, float %a, metadata !"round.tonearest", metadata !"fpexcept.strict")471 ret float %tmp2472}473 474define float @test_fmla_ss4S_3_strict(float %a, float %b, <4 x float> %v) #0 {475; CHECK-LABEL: test_fmla_ss4S_3_strict:476; CHECK: // %bb.0:477; CHECK-NEXT: fmla s0, s1, v2.s[3]478; CHECK-NEXT: ret479 %tmp1 = extractelement <4 x float> %v, i32 3480 %tmp2 = call float @llvm.experimental.constrained.fma.f32(float %b, float %tmp1, float %a, metadata !"round.tonearest", metadata !"fpexcept.strict")481 ret float %tmp2482}483 484define float @test_fmla_ss4S_3_swap_strict(float %a, float %b, <4 x float> %v) #0 {485; CHECK-LABEL: test_fmla_ss4S_3_swap_strict:486; CHECK: // %bb.0:487; CHECK-NEXT: fmla s0, s0, v2.s[3]488; CHECK-NEXT: ret489 %tmp1 = extractelement <4 x float> %v, i32 3490 %tmp2 = call float @llvm.experimental.constrained.fma.f32(float %tmp1, float %a, float %a, metadata !"round.tonearest", metadata !"fpexcept.strict")491 ret float %tmp2492}493 494define float @test_fmla_ss2S_0_strict(float %a, float %b, <2 x float> %v) #0 {495; CHECK-LABEL: test_fmla_ss2S_0_strict:496; CHECK: // %bb.0:497; CHECK-NEXT: // kill: def $d2 killed $d2 def $q2498; CHECK-NEXT: fmadd s0, s1, s2, s0499; CHECK-NEXT: ret500 %tmp1 = extractelement <2 x float> %v, i32 0501 %tmp2 = call float @llvm.experimental.constrained.fma.f32(float %b, float %tmp1, float %a, metadata !"round.tonearest", metadata !"fpexcept.strict")502 ret float %tmp2503}504 505define float @test_fmla_ss2S_0_swap_strict(float %a, float %b, <2 x float> %v) #0 {506; CHECK-LABEL: test_fmla_ss2S_0_swap_strict:507; CHECK: // %bb.0:508; CHECK-NEXT: // kill: def $d2 killed $d2 def $q2509; CHECK-NEXT: fmadd s0, s2, s1, s0510; CHECK-NEXT: ret511 %tmp1 = extractelement <2 x float> %v, i32 0512 %tmp2 = call float @llvm.experimental.constrained.fma.f32(float %tmp1, float %b, float %a, metadata !"round.tonearest", metadata !"fpexcept.strict")513 ret float %tmp2514}515 516define float @test_fmla_ss2S_1_strict(float %a, float %b, <2 x float> %v) #0 {517; CHECK-LABEL: test_fmla_ss2S_1_strict:518; CHECK: // %bb.0:519; CHECK-NEXT: // kill: def $d2 killed $d2 def $q2520; CHECK-NEXT: fmla s0, s1, v2.s[1]521; CHECK-NEXT: ret522 %tmp1 = extractelement <2 x float> %v, i32 1523 %tmp2 = call float @llvm.experimental.constrained.fma.f32(float %b, float %tmp1, float %a, metadata !"round.tonearest", metadata !"fpexcept.strict")524 ret float %tmp2525}526 527define double @test_fmla_ddD_0_strict(double %a, double %b, <1 x double> %v) #0 {528; CHECK-LABEL: test_fmla_ddD_0_strict:529; CHECK: // %bb.0:530; CHECK-NEXT: fmadd d0, d1, d2, d0531; CHECK-NEXT: ret532 %tmp1 = extractelement <1 x double> %v, i32 0533 %tmp2 = call double @llvm.experimental.constrained.fma.f64(double %b, double %tmp1, double %a, metadata !"round.tonearest", metadata !"fpexcept.strict")534 ret double %tmp2535}536 537define double @test_fmla_ddD_0_swap_strict(double %a, double %b, <1 x double> %v) #0 {538; CHECK-LABEL: test_fmla_ddD_0_swap_strict:539; CHECK: // %bb.0:540; CHECK-NEXT: fmadd d0, d2, d1, d0541; CHECK-NEXT: ret542 %tmp1 = extractelement <1 x double> %v, i32 0543 %tmp2 = call double @llvm.experimental.constrained.fma.f64(double %tmp1, double %b, double %a, metadata !"round.tonearest", metadata !"fpexcept.strict")544 ret double %tmp2545}546 547define double @test_fmla_dd2D_0_strict(double %a, double %b, <2 x double> %v) #0 {548; CHECK-LABEL: test_fmla_dd2D_0_strict:549; CHECK: // %bb.0:550; CHECK-NEXT: fmadd d0, d1, d2, d0551; CHECK-NEXT: ret552 %tmp1 = extractelement <2 x double> %v, i32 0553 %tmp2 = call double @llvm.experimental.constrained.fma.f64(double %b, double %tmp1, double %a, metadata !"round.tonearest", metadata !"fpexcept.strict")554 ret double %tmp2555}556 557define double @test_fmla_dd2D_0_swap_strict(double %a, double %b, <2 x double> %v) #0 {558; CHECK-LABEL: test_fmla_dd2D_0_swap_strict:559; CHECK: // %bb.0:560; CHECK-NEXT: fmadd d0, d2, d1, d0561; CHECK-NEXT: ret562 %tmp1 = extractelement <2 x double> %v, i32 0563 %tmp2 = call double @llvm.experimental.constrained.fma.f64(double %tmp1, double %b, double %a, metadata !"round.tonearest", metadata !"fpexcept.strict")564 ret double %tmp2565}566 567define double @test_fmla_dd2D_1_strict(double %a, double %b, <2 x double> %v) #0 {568; CHECK-LABEL: test_fmla_dd2D_1_strict:569; CHECK: // %bb.0:570; CHECK-NEXT: fmla d0, d1, v2.d[1]571; CHECK-NEXT: ret572 %tmp1 = extractelement <2 x double> %v, i32 1573 %tmp2 = call double @llvm.experimental.constrained.fma.f64(double %b, double %tmp1, double %a, metadata !"round.tonearest", metadata !"fpexcept.strict")574 ret double %tmp2575}576 577define double @test_fmla_dd2D_1_swap_strict(double %a, double %b, <2 x double> %v) #0 {578; CHECK-LABEL: test_fmla_dd2D_1_swap_strict:579; CHECK: // %bb.0:580; CHECK-NEXT: fmla d0, d1, v2.d[1]581; CHECK-NEXT: ret582 %tmp1 = extractelement <2 x double> %v, i32 1583 %tmp2 = call double @llvm.experimental.constrained.fma.f64(double %tmp1, double %b, double %a, metadata !"round.tonearest", metadata !"fpexcept.strict")584 ret double %tmp2585}586 587define float @test_fmls_ss4S_0_strict(float %a, float %b, <4 x float> %v) #0 {588; CHECK-LABEL: test_fmls_ss4S_0_strict:589; CHECK: // %bb.0: // %entry590; CHECK-NEXT: fmsub s0, s2, s1, s0591; CHECK-NEXT: ret592entry:593 %fneg = fneg float %b594 %extract = extractelement <4 x float> %v, i64 0595 %0 = tail call float @llvm.experimental.constrained.fma.f32(float %fneg, float %extract, float %a, metadata !"round.tonearest", metadata !"fpexcept.strict")596 ret float %0597}598 599define float @test_fmls_ss4S_0_swap_strict(float %a, float %b, <4 x float> %v) #0 {600; CHECK-LABEL: test_fmls_ss4S_0_swap_strict:601; CHECK: // %bb.0: // %entry602; CHECK-NEXT: fmsub s0, s2, s1, s0603; CHECK-NEXT: ret604entry:605 %fneg = fneg float %b606 %extract = extractelement <4 x float> %v, i64 0607 %0 = tail call float @llvm.experimental.constrained.fma.f32(float %extract, float %fneg, float %a, metadata !"round.tonearest", metadata !"fpexcept.strict")608 ret float %0609}610 611define float @test_fmls_ss4S_3_strict(float %a, float %b, <4 x float> %v) #0 {612; CHECK-LABEL: test_fmls_ss4S_3_strict:613; CHECK: // %bb.0:614; CHECK-NEXT: mov s1, v2.s[3]615; CHECK-NEXT: fmls s0, s1, v2.s[3]616; CHECK-NEXT: ret617 %tmp1 = extractelement <4 x float> %v, i32 3618 %tmp2 = fneg float %tmp1619 %tmp3 = call float @llvm.experimental.constrained.fma.f32(float %tmp2, float %tmp1, float %a, metadata !"round.tonearest", metadata !"fpexcept.strict")620 ret float %tmp3621}622 623define float @test_fmls_ss4S_3_swap_strict(float %a, float %b, <4 x float> %v) #0 {624; CHECK-LABEL: test_fmls_ss4S_3_swap_strict:625; CHECK: // %bb.0:626; CHECK-NEXT: mov s1, v2.s[3]627; CHECK-NEXT: fmls s0, s1, v2.s[3]628; CHECK-NEXT: ret629 %tmp1 = extractelement <4 x float> %v, i32 3630 %tmp2 = fneg float %tmp1631 %tmp3 = call float @llvm.experimental.constrained.fma.f32(float %tmp1, float %tmp2, float %a, metadata !"round.tonearest", metadata !"fpexcept.strict")632 ret float %tmp3633}634 635define float @test_fmls_ss2S_0_strict(float %a, float %b, <2 x float> %v) #0 {636; CHECK-LABEL: test_fmls_ss2S_0_strict:637; CHECK: // %bb.0: // %entry638; CHECK-NEXT: // kill: def $d2 killed $d2 def $q2639; CHECK-NEXT: fmsub s0, s2, s1, s0640; CHECK-NEXT: ret641entry:642 %fneg = fneg float %b643 %extract = extractelement <2 x float> %v, i64 0644 %0 = tail call float @llvm.experimental.constrained.fma.f32(float %fneg, float %extract, float %a, metadata !"round.tonearest", metadata !"fpexcept.strict")645 ret float %0646}647 648define float @test_fmls_ss2S_0_swap_strict(float %a, float %b, <2 x float> %v) #0 {649; CHECK-LABEL: test_fmls_ss2S_0_swap_strict:650; CHECK: // %bb.0: // %entry651; CHECK-NEXT: // kill: def $d2 killed $d2 def $q2652; CHECK-NEXT: fmsub s0, s2, s1, s0653; CHECK-NEXT: ret654entry:655 %fneg = fneg float %b656 %extract = extractelement <2 x float> %v, i64 0657 %0 = tail call float @llvm.experimental.constrained.fma.f32(float %extract, float %fneg, float %a, metadata !"round.tonearest", metadata !"fpexcept.strict")658 ret float %0659}660 661define float @test_fmls_ss2S_1_strict(float %a, float %b, <2 x float> %v) #0 {662; CHECK-LABEL: test_fmls_ss2S_1_strict:663; CHECK: // %bb.0:664; CHECK-NEXT: // kill: def $d2 killed $d2 def $q2665; CHECK-NEXT: mov s1, v2.s[1]666; CHECK-NEXT: fmls s0, s1, v2.s[1]667; CHECK-NEXT: ret668 %tmp1 = extractelement <2 x float> %v, i32 1669 %tmp2 = fneg float %tmp1670 %tmp3 = call float @llvm.experimental.constrained.fma.f32(float %tmp2, float %tmp1, float %a, metadata !"round.tonearest", metadata !"fpexcept.strict")671 ret float %tmp3672}673 674define double @test_fmls_ddD_0_strict(double %a, double %b, <1 x double> %v) #0 {675; CHECK-LABEL: test_fmls_ddD_0_strict:676; CHECK: // %bb.0: // %entry677; CHECK-NEXT: fmsub d0, d2, d1, d0678; CHECK-NEXT: ret679entry:680 %fneg = fneg double %b681 %extract = extractelement <1 x double> %v, i64 0682 %0 = tail call double @llvm.experimental.constrained.fma.f64(double %fneg, double %extract, double %a, metadata !"round.tonearest", metadata !"fpexcept.strict")683 ret double %0684}685 686define double @test_fmls_ddD_0_swap_strict(double %a, double %b, <1 x double> %v) #0 {687; CHECK-LABEL: test_fmls_ddD_0_swap_strict:688; CHECK: // %bb.0: // %entry689; CHECK-NEXT: fmsub d0, d2, d1, d0690; CHECK-NEXT: ret691entry:692 %fneg = fneg double %b693 %extract = extractelement <1 x double> %v, i64 0694 %0 = tail call double @llvm.experimental.constrained.fma.f64(double %extract, double %fneg, double %a, metadata !"round.tonearest", metadata !"fpexcept.strict")695 ret double %0696}697 698define double @test_fmls_dd2D_0_strict(double %a, double %b, <2 x double> %v) #0 {699; CHECK-LABEL: test_fmls_dd2D_0_strict:700; CHECK: // %bb.0: // %entry701; CHECK-NEXT: fmsub d0, d2, d1, d0702; CHECK-NEXT: ret703entry:704 %fneg = fneg double %b705 %extract = extractelement <2 x double> %v, i64 0706 %0 = tail call double @llvm.experimental.constrained.fma.f64(double %fneg, double %extract, double %a, metadata !"round.tonearest", metadata !"fpexcept.strict")707 ret double %0708}709 710define double @test_fmls_dd2D_0_swap_strict(double %a, double %b, <2 x double> %v) #0 {711; CHECK-LABEL: test_fmls_dd2D_0_swap_strict:712; CHECK: // %bb.0: // %entry713; CHECK-NEXT: fmsub d0, d2, d1, d0714; CHECK-NEXT: ret715entry:716 %fneg = fneg double %b717 %extract = extractelement <2 x double> %v, i64 0718 %0 = tail call double @llvm.experimental.constrained.fma.f64(double %extract, double %fneg, double %a, metadata !"round.tonearest", metadata !"fpexcept.strict")719 ret double %0720}721 722define double @test_fmls_dd2D_1_strict(double %a, double %b, <2 x double> %v) #0 {723; CHECK-LABEL: test_fmls_dd2D_1_strict:724; CHECK: // %bb.0:725; CHECK-NEXT: mov d1, v2.d[1]726; CHECK-NEXT: fmls d0, d1, v2.d[1]727; CHECK-NEXT: ret728 %tmp1 = extractelement <2 x double> %v, i32 1729 %tmp2 = fneg double %tmp1730 %tmp3 = call double @llvm.experimental.constrained.fma.f64(double %tmp2, double %tmp1, double %a, metadata !"round.tonearest", metadata !"fpexcept.strict")731 ret double %tmp3732}733 734define double @test_fmls_dd2D_1_swap_strict(double %a, double %b, <2 x double> %v) #0 {735; CHECK-LABEL: test_fmls_dd2D_1_swap_strict:736; CHECK: // %bb.0:737; CHECK-NEXT: mov d1, v2.d[1]738; CHECK-NEXT: fmls d0, d1, v2.d[1]739; CHECK-NEXT: ret740 %tmp1 = extractelement <2 x double> %v, i32 1741 %tmp2 = fneg double %tmp1742 %tmp3 = call double @llvm.experimental.constrained.fma.f64(double %tmp1, double %tmp2, double %a, metadata !"round.tonearest", metadata !"fpexcept.strict")743 ret double %tmp3744}745 746