brintos

brintos / llvm-project-archived public Read only

0
0
Text · 27.1 KiB · 544d768 Raw
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