brintos

brintos / llvm-project-archived public Read only

0
0
Text · 24.8 KiB · 540fd24 Raw
574 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f -mattr=+fma -show-mc-encoding | FileCheck %s3 4define <2 x double> @combine_scalar_mask_fmadd_f32(<2 x double> %a, i8 zeroext %k, <2 x double> %b, <2 x double> %c) {5; CHECK-LABEL: combine_scalar_mask_fmadd_f32:6; CHECK:       # %bb.0: # %entry7; CHECK-NEXT:    kmovw %edi, %k1 # encoding: [0xc5,0xf8,0x92,0xcf]8; CHECK-NEXT:    vfmadd213ss %xmm2, %xmm1, %xmm0 {%k1} # encoding: [0x62,0xf2,0x75,0x09,0xa9,0xc2]9; CHECK-NEXT:    # xmm0 {%k1} = (xmm1 * xmm0) + xmm210; CHECK-NEXT:    retq # encoding: [0xc3]11entry:12  %0 = bitcast <2 x double> %a to <4 x float>13  %1 = bitcast <2 x double> %b to <4 x float>14  %2 = bitcast <2 x double> %c to <4 x float>15  %3 = extractelement <4 x float> %0, i64 016  %4 = extractelement <4 x float> %1, i64 017  %5 = extractelement <4 x float> %2, i64 018  %6 = fmul fast float %4, %319  %7 = fadd fast float %6, %520  %8 = bitcast i8 %k to <8 x i1>21  %9 = extractelement <8 x i1> %8, i64 022  %10 = select i1 %9, float %7, float %323  %11 = insertelement <4 x float> %0, float %10, i64 024  %12 = bitcast <4 x float> %11 to <2 x double>25  ret <2 x double> %1226}27 28define <2 x double> @combine_scalar_mask_fmadd_f64(<2 x double> %a, i8 zeroext %k, <2 x double> %b, <2 x double> %c) {29; CHECK-LABEL: combine_scalar_mask_fmadd_f64:30; CHECK:       # %bb.0: # %entry31; CHECK-NEXT:    kmovw %edi, %k1 # encoding: [0xc5,0xf8,0x92,0xcf]32; CHECK-NEXT:    vfmadd213sd %xmm2, %xmm1, %xmm0 {%k1} # encoding: [0x62,0xf2,0xf5,0x09,0xa9,0xc2]33; CHECK-NEXT:    # xmm0 {%k1} = (xmm1 * xmm0) + xmm234; CHECK-NEXT:    retq # encoding: [0xc3]35entry:36  %0 = extractelement <2 x double> %a, i64 037  %1 = extractelement <2 x double> %b, i64 038  %2 = extractelement <2 x double> %c, i64 039  %3 = fmul fast double %1, %040  %4 = fadd fast double %3, %241  %5 = bitcast i8 %k to <8 x i1>42  %6 = extractelement <8 x i1> %5, i64 043  %7 = select i1 %6, double %4, double %044  %8 = insertelement <2 x double> %a, double %7, i64 045  ret <2 x double> %846}47 48define <2 x double> @combine_scalar_maskz_fmadd_32(i8 zeroext %k, <2 x double> %a, <2 x double> %b, <2 x double> %c) {49; CHECK-LABEL: combine_scalar_maskz_fmadd_32:50; CHECK:       # %bb.0: # %entry51; CHECK-NEXT:    kmovw %edi, %k1 # encoding: [0xc5,0xf8,0x92,0xcf]52; CHECK-NEXT:    vfmadd213ss %xmm2, %xmm1, %xmm0 {%k1} {z} # encoding: [0x62,0xf2,0x75,0x89,0xa9,0xc2]53; CHECK-NEXT:    # xmm0 {%k1} {z} = (xmm1 * xmm0) + xmm254; CHECK-NEXT:    retq # encoding: [0xc3]55entry:56  %0 = bitcast <2 x double> %a to <4 x float>57  %1 = bitcast <2 x double> %b to <4 x float>58  %2 = bitcast <2 x double> %c to <4 x float>59  %3 = extractelement <4 x float> %0, i64 060  %4 = extractelement <4 x float> %1, i64 061  %5 = extractelement <4 x float> %2, i64 062  %6 = fmul fast float %4, %363  %7 = fadd fast float %6, %564  %8 = bitcast i8 %k to <8 x i1>65  %9 = extractelement <8 x i1> %8, i64 066  %10 = select i1 %9, float %7, float 0.000000e+0067  %11 = insertelement <4 x float> %0, float %10, i64 068  %12 = bitcast <4 x float> %11 to <2 x double>69  ret <2 x double> %1270}71 72define <2 x double> @combine_scalar_maskz_fmadd_64(i8 zeroext %k, <2 x double> %a, <2 x double> %b, <2 x double> %c) {73; CHECK-LABEL: combine_scalar_maskz_fmadd_64:74; CHECK:       # %bb.0: # %entry75; CHECK-NEXT:    kmovw %edi, %k1 # encoding: [0xc5,0xf8,0x92,0xcf]76; CHECK-NEXT:    vfmadd213sd %xmm2, %xmm1, %xmm0 {%k1} {z} # encoding: [0x62,0xf2,0xf5,0x89,0xa9,0xc2]77; CHECK-NEXT:    # xmm0 {%k1} {z} = (xmm1 * xmm0) + xmm278; CHECK-NEXT:    retq # encoding: [0xc3]79entry:80  %0 = extractelement <2 x double> %a, i64 081  %1 = extractelement <2 x double> %b, i64 082  %2 = extractelement <2 x double> %c, i64 083  %3 = fmul fast double %1, %084  %4 = fadd fast double %3, %285  %5 = bitcast i8 %k to <8 x i1>86  %6 = extractelement <8 x i1> %5, i64 087  %7 = select i1 %6, double %4, double 0.000000e+0088  %8 = insertelement <2 x double> %a, double %7, i64 089  ret <2 x double> %890}91 92define <2 x double> @combine_scalar_mask3_fmadd_32(<2 x double> %a, <2 x double> %b, <2 x double> %c, i8 zeroext %k) {93; CHECK-LABEL: combine_scalar_mask3_fmadd_32:94; CHECK:       # %bb.0: # %entry95; CHECK-NEXT:    kmovw %edi, %k1 # encoding: [0xc5,0xf8,0x92,0xcf]96; CHECK-NEXT:    vfmadd231ss %xmm0, %xmm1, %xmm2 {%k1} # encoding: [0x62,0xf2,0x75,0x09,0xb9,0xd0]97; CHECK-NEXT:    # xmm2 {%k1} = (xmm1 * xmm0) + xmm298; CHECK-NEXT:    vmovaps %xmm2, %xmm0 # encoding: [0xc5,0xf8,0x28,0xc2]99; CHECK-NEXT:    retq # encoding: [0xc3]100entry:101  %0 = bitcast <2 x double> %a to <4 x float>102  %1 = bitcast <2 x double> %b to <4 x float>103  %2 = bitcast <2 x double> %c to <4 x float>104  %3 = extractelement <4 x float> %0, i64 0105  %4 = extractelement <4 x float> %1, i64 0106  %5 = extractelement <4 x float> %2, i64 0107  %6 = fmul fast float %4, %3108  %7 = fadd fast float %6, %5109  %8 = bitcast i8 %k to <8 x i1>110  %9 = extractelement <8 x i1> %8, i64 0111  %10 = select i1 %9, float %7, float %5112  %11 = insertelement <4 x float> %2, float %10, i64 0113  %12 = bitcast <4 x float> %11 to <2 x double>114  ret <2 x double> %12115}116 117define <2 x double> @combine_scalar_mask3_fmadd_64(<2 x double> %a, <2 x double> %b, <2 x double> %c, i8 zeroext %k) {118; CHECK-LABEL: combine_scalar_mask3_fmadd_64:119; CHECK:       # %bb.0: # %entry120; CHECK-NEXT:    kmovw %edi, %k1 # encoding: [0xc5,0xf8,0x92,0xcf]121; CHECK-NEXT:    vfmadd231sd %xmm0, %xmm1, %xmm2 {%k1} # encoding: [0x62,0xf2,0xf5,0x09,0xb9,0xd0]122; CHECK-NEXT:    # xmm2 {%k1} = (xmm1 * xmm0) + xmm2123; CHECK-NEXT:    vmovapd %xmm2, %xmm0 # encoding: [0xc5,0xf9,0x28,0xc2]124; CHECK-NEXT:    retq # encoding: [0xc3]125entry:126  %0 = extractelement <2 x double> %a, i64 0127  %1 = extractelement <2 x double> %b, i64 0128  %2 = extractelement <2 x double> %c, i64 0129  %3 = fmul fast double %1, %0130  %4 = fadd fast double %3, %2131  %5 = bitcast i8 %k to <8 x i1>132  %6 = extractelement <8 x i1> %5, i64 0133  %7 = select i1 %6, double %4, double %2134  %8 = insertelement <2 x double> %c, double %7, i64 0135  ret <2 x double> %8136}137 138define <2 x double> @combine_scalar_mask_fmsub_f32(<2 x double> %a, i8 zeroext %k, <2 x double> %b, <2 x double> %c) {139; CHECK-LABEL: combine_scalar_mask_fmsub_f32:140; CHECK:       # %bb.0: # %entry141; CHECK-NEXT:    kmovw %edi, %k1 # encoding: [0xc5,0xf8,0x92,0xcf]142; CHECK-NEXT:    vfmsub213ss %xmm2, %xmm1, %xmm0 {%k1} # encoding: [0x62,0xf2,0x75,0x09,0xab,0xc2]143; CHECK-NEXT:    # xmm0 {%k1} = (xmm1 * xmm0) - xmm2144; CHECK-NEXT:    retq # encoding: [0xc3]145entry:146  %0 = bitcast <2 x double> %a to <4 x float>147  %1 = bitcast <2 x double> %b to <4 x float>148  %2 = bitcast <2 x double> %c to <4 x float>149  %3 = extractelement <4 x float> %0, i64 0150  %4 = extractelement <4 x float> %1, i64 0151  %5 = extractelement <4 x float> %2, i64 0152  %6 = fmul fast float %4, %3153  %7 = fsub fast float %6, %5154  %8 = bitcast i8 %k to <8 x i1>155  %9 = extractelement <8 x i1> %8, i64 0156  %10 = select i1 %9, float %7, float %3157  %11 = insertelement <4 x float> %0, float %10, i64 0158  %12 = bitcast <4 x float> %11 to <2 x double>159  ret <2 x double> %12160}161 162define <2 x double> @combine_scalar_mask_fmsub_f64(<2 x double> %a, i8 zeroext %k, <2 x double> %b, <2 x double> %c) {163; CHECK-LABEL: combine_scalar_mask_fmsub_f64:164; CHECK:       # %bb.0: # %entry165; CHECK-NEXT:    kmovw %edi, %k1 # encoding: [0xc5,0xf8,0x92,0xcf]166; CHECK-NEXT:    vfmsub213sd %xmm2, %xmm1, %xmm0 {%k1} # encoding: [0x62,0xf2,0xf5,0x09,0xab,0xc2]167; CHECK-NEXT:    # xmm0 {%k1} = (xmm1 * xmm0) - xmm2168; CHECK-NEXT:    retq # encoding: [0xc3]169entry:170  %0 = extractelement <2 x double> %a, i64 0171  %1 = extractelement <2 x double> %b, i64 0172  %2 = extractelement <2 x double> %c, i64 0173  %3 = fmul fast double %1, %0174  %4 = fsub fast double %3, %2175  %5 = bitcast i8 %k to <8 x i1>176  %6 = extractelement <8 x i1> %5, i64 0177  %7 = select i1 %6, double %4, double %0178  %8 = insertelement <2 x double> %a, double %7, i64 0179  ret <2 x double> %8180}181 182define <2 x double> @combine_scalar_maskz_fmsub_32(i8 zeroext %k, <2 x double> %a, <2 x double> %b, <2 x double> %c) {183; CHECK-LABEL: combine_scalar_maskz_fmsub_32:184; CHECK:       # %bb.0: # %entry185; CHECK-NEXT:    kmovw %edi, %k1 # encoding: [0xc5,0xf8,0x92,0xcf]186; CHECK-NEXT:    vfmsub213ss %xmm2, %xmm1, %xmm0 {%k1} {z} # encoding: [0x62,0xf2,0x75,0x89,0xab,0xc2]187; CHECK-NEXT:    # xmm0 {%k1} {z} = (xmm1 * xmm0) - xmm2188; CHECK-NEXT:    retq # encoding: [0xc3]189entry:190  %0 = bitcast <2 x double> %a to <4 x float>191  %1 = bitcast <2 x double> %b to <4 x float>192  %2 = bitcast <2 x double> %c to <4 x float>193  %3 = extractelement <4 x float> %0, i64 0194  %4 = extractelement <4 x float> %1, i64 0195  %5 = extractelement <4 x float> %2, i64 0196  %6 = fmul fast float %4, %3197  %7 = fsub fast float %6, %5198  %8 = bitcast i8 %k to <8 x i1>199  %9 = extractelement <8 x i1> %8, i64 0200  %10 = select i1 %9, float %7, float 0.000000e+00201  %11 = insertelement <4 x float> %0, float %10, i64 0202  %12 = bitcast <4 x float> %11 to <2 x double>203  ret <2 x double> %12204}205 206define <2 x double> @combine_scalar_maskz_fmsub_64(i8 zeroext %k, <2 x double> %a, <2 x double> %b, <2 x double> %c) {207; CHECK-LABEL: combine_scalar_maskz_fmsub_64:208; CHECK:       # %bb.0: # %entry209; CHECK-NEXT:    kmovw %edi, %k1 # encoding: [0xc5,0xf8,0x92,0xcf]210; CHECK-NEXT:    vfmsub213sd %xmm2, %xmm1, %xmm0 {%k1} {z} # encoding: [0x62,0xf2,0xf5,0x89,0xab,0xc2]211; CHECK-NEXT:    # xmm0 {%k1} {z} = (xmm1 * xmm0) - xmm2212; CHECK-NEXT:    retq # encoding: [0xc3]213entry:214  %0 = extractelement <2 x double> %a, i64 0215  %1 = extractelement <2 x double> %b, i64 0216  %2 = extractelement <2 x double> %c, i64 0217  %3 = fmul fast double %1, %0218  %4 = fsub fast double %3, %2219  %5 = bitcast i8 %k to <8 x i1>220  %6 = extractelement <8 x i1> %5, i64 0221  %7 = select i1 %6, double %4, double 0.000000e+00222  %8 = insertelement <2 x double> %a, double %7, i64 0223  ret <2 x double> %8224}225 226define <2 x double> @combine_scalar_mask3_fmsub_32(<2 x double> %a, <2 x double> %b, <2 x double> %c, i8 zeroext %k) {227; CHECK-LABEL: combine_scalar_mask3_fmsub_32:228; CHECK:       # %bb.0: # %entry229; CHECK-NEXT:    kmovw %edi, %k1 # encoding: [0xc5,0xf8,0x92,0xcf]230; CHECK-NEXT:    vfmsub231ss %xmm0, %xmm1, %xmm2 {%k1} # encoding: [0x62,0xf2,0x75,0x09,0xbb,0xd0]231; CHECK-NEXT:    # xmm2 {%k1} = (xmm1 * xmm0) - xmm2232; CHECK-NEXT:    vmovaps %xmm2, %xmm0 # encoding: [0xc5,0xf8,0x28,0xc2]233; CHECK-NEXT:    retq # encoding: [0xc3]234entry:235  %0 = bitcast <2 x double> %a to <4 x float>236  %1 = bitcast <2 x double> %b to <4 x float>237  %2 = bitcast <2 x double> %c to <4 x float>238  %3 = extractelement <4 x float> %0, i64 0239  %4 = extractelement <4 x float> %1, i64 0240  %5 = extractelement <4 x float> %2, i64 0241  %6 = fmul fast float %4, %3242  %7 = fsub fast float %6, %5243  %8 = bitcast i8 %k to <8 x i1>244  %9 = extractelement <8 x i1> %8, i64 0245  %10 = select i1 %9, float %7, float %5246  %11 = insertelement <4 x float> %2, float %10, i64 0247  %12 = bitcast <4 x float> %11 to <2 x double>248  ret <2 x double> %12249}250 251define <2 x double> @combine_scalar_mask3_fmsub_64(<2 x double> %a, <2 x double> %b, <2 x double> %c, i8 zeroext %k) {252; CHECK-LABEL: combine_scalar_mask3_fmsub_64:253; CHECK:       # %bb.0: # %entry254; CHECK-NEXT:    kmovw %edi, %k1 # encoding: [0xc5,0xf8,0x92,0xcf]255; CHECK-NEXT:    vfmsub231sd %xmm0, %xmm1, %xmm2 {%k1} # encoding: [0x62,0xf2,0xf5,0x09,0xbb,0xd0]256; CHECK-NEXT:    # xmm2 {%k1} = (xmm1 * xmm0) - xmm2257; CHECK-NEXT:    vmovapd %xmm2, %xmm0 # encoding: [0xc5,0xf9,0x28,0xc2]258; CHECK-NEXT:    retq # encoding: [0xc3]259entry:260  %0 = extractelement <2 x double> %a, i64 0261  %1 = extractelement <2 x double> %b, i64 0262  %2 = extractelement <2 x double> %c, i64 0263  %3 = fmul fast double %1, %0264  %4 = fsub fast double %3, %2265  %5 = bitcast i8 %k to <8 x i1>266  %6 = extractelement <8 x i1> %5, i64 0267  %7 = select i1 %6, double %4, double %2268  %8 = insertelement <2 x double> %c, double %7, i64 0269  ret <2 x double> %8270}271 272define <2 x double> @combine_scalar_mask_fnmadd_f32(<2 x double> %a, i8 zeroext %k, <2 x double> %b, <2 x double> %c) {273; CHECK-LABEL: combine_scalar_mask_fnmadd_f32:274; CHECK:       # %bb.0: # %entry275; CHECK-NEXT:    kmovw %edi, %k1 # encoding: [0xc5,0xf8,0x92,0xcf]276; CHECK-NEXT:    vfnmadd213ss %xmm2, %xmm1, %xmm0 {%k1} # encoding: [0x62,0xf2,0x75,0x09,0xad,0xc2]277; CHECK-NEXT:    # xmm0 {%k1} = -(xmm1 * xmm0) + xmm2278; CHECK-NEXT:    retq # encoding: [0xc3]279entry:280  %0 = bitcast <2 x double> %a to <4 x float>281  %1 = bitcast <2 x double> %b to <4 x float>282  %2 = bitcast <2 x double> %c to <4 x float>283  %3 = extractelement <4 x float> %0, i64 0284  %4 = extractelement <4 x float> %1, i64 0285  %5 = extractelement <4 x float> %2, i64 0286  %6 = fmul fast float %4, %3287  %7 = fsub fast float %5, %6288  %8 = bitcast i8 %k to <8 x i1>289  %9 = extractelement <8 x i1> %8, i64 0290  %10 = select i1 %9, float %7, float %3291  %11 = insertelement <4 x float> %0, float %10, i64 0292  %12 = bitcast <4 x float> %11 to <2 x double>293  ret <2 x double> %12294}295 296define <2 x double> @combine_scalar_mask_fnmadd_f64(<2 x double> %a, i8 zeroext %k, <2 x double> %b, <2 x double> %c) {297; CHECK-LABEL: combine_scalar_mask_fnmadd_f64:298; CHECK:       # %bb.0: # %entry299; CHECK-NEXT:    kmovw %edi, %k1 # encoding: [0xc5,0xf8,0x92,0xcf]300; CHECK-NEXT:    vfnmadd213sd %xmm2, %xmm1, %xmm0 {%k1} # encoding: [0x62,0xf2,0xf5,0x09,0xad,0xc2]301; CHECK-NEXT:    # xmm0 {%k1} = -(xmm1 * xmm0) + xmm2302; CHECK-NEXT:    retq # encoding: [0xc3]303entry:304  %0 = extractelement <2 x double> %a, i64 0305  %1 = extractelement <2 x double> %b, i64 0306  %2 = extractelement <2 x double> %c, i64 0307  %3 = fmul fast double %1, %0308  %4 = fsub fast double %2, %3309  %5 = bitcast i8 %k to <8 x i1>310  %6 = extractelement <8 x i1> %5, i64 0311  %7 = select i1 %6, double %4, double %0312  %8 = insertelement <2 x double> %a, double %7, i64 0313  ret <2 x double> %8314}315 316define <2 x double> @combine_scalar_maskz_fnmadd_32(i8 zeroext %k, <2 x double> %a, <2 x double> %b, <2 x double> %c) {317; CHECK-LABEL: combine_scalar_maskz_fnmadd_32:318; CHECK:       # %bb.0: # %entry319; CHECK-NEXT:    kmovw %edi, %k1 # encoding: [0xc5,0xf8,0x92,0xcf]320; CHECK-NEXT:    vfnmadd213ss %xmm2, %xmm1, %xmm0 {%k1} {z} # encoding: [0x62,0xf2,0x75,0x89,0xad,0xc2]321; CHECK-NEXT:    # xmm0 {%k1} {z} = -(xmm1 * xmm0) + xmm2322; CHECK-NEXT:    retq # encoding: [0xc3]323entry:324  %0 = bitcast <2 x double> %a to <4 x float>325  %1 = bitcast <2 x double> %b to <4 x float>326  %2 = bitcast <2 x double> %c to <4 x float>327  %3 = extractelement <4 x float> %0, i64 0328  %4 = extractelement <4 x float> %1, i64 0329  %5 = extractelement <4 x float> %2, i64 0330  %6 = fmul fast float %4, %3331  %7 = fsub fast float %5, %6332  %8 = bitcast i8 %k to <8 x i1>333  %9 = extractelement <8 x i1> %8, i64 0334  %10 = select i1 %9, float %7, float 0.000000e+00335  %11 = insertelement <4 x float> %0, float %10, i64 0336  %12 = bitcast <4 x float> %11 to <2 x double>337  ret <2 x double> %12338}339 340define <2 x double> @combine_scalar_maskz_fnmadd_64(i8 zeroext %k, <2 x double> %a, <2 x double> %b, <2 x double> %c) {341; CHECK-LABEL: combine_scalar_maskz_fnmadd_64:342; CHECK:       # %bb.0: # %entry343; CHECK-NEXT:    kmovw %edi, %k1 # encoding: [0xc5,0xf8,0x92,0xcf]344; CHECK-NEXT:    vfnmadd213sd %xmm2, %xmm1, %xmm0 {%k1} {z} # encoding: [0x62,0xf2,0xf5,0x89,0xad,0xc2]345; CHECK-NEXT:    # xmm0 {%k1} {z} = -(xmm1 * xmm0) + xmm2346; CHECK-NEXT:    retq # encoding: [0xc3]347entry:348  %0 = extractelement <2 x double> %a, i64 0349  %1 = extractelement <2 x double> %b, i64 0350  %2 = extractelement <2 x double> %c, i64 0351  %3 = fmul fast double %1, %0352  %4 = fsub fast double %2, %3353  %5 = bitcast i8 %k to <8 x i1>354  %6 = extractelement <8 x i1> %5, i64 0355  %7 = select i1 %6, double %4, double 0.000000e+00356  %8 = insertelement <2 x double> %a, double %7, i64 0357  ret <2 x double> %8358}359 360define <2 x double> @combine_scalar_mask3_fnmadd_32(<2 x double> %a, <2 x double> %b, <2 x double> %c, i8 zeroext %k) {361; CHECK-LABEL: combine_scalar_mask3_fnmadd_32:362; CHECK:       # %bb.0: # %entry363; CHECK-NEXT:    kmovw %edi, %k1 # encoding: [0xc5,0xf8,0x92,0xcf]364; CHECK-NEXT:    vfnmadd231ss %xmm0, %xmm1, %xmm2 {%k1} # encoding: [0x62,0xf2,0x75,0x09,0xbd,0xd0]365; CHECK-NEXT:    # xmm2 {%k1} = -(xmm1 * xmm0) + xmm2366; CHECK-NEXT:    vmovaps %xmm2, %xmm0 # encoding: [0xc5,0xf8,0x28,0xc2]367; CHECK-NEXT:    retq # encoding: [0xc3]368entry:369  %0 = bitcast <2 x double> %a to <4 x float>370  %1 = bitcast <2 x double> %b to <4 x float>371  %2 = bitcast <2 x double> %c to <4 x float>372  %3 = extractelement <4 x float> %0, i64 0373  %4 = extractelement <4 x float> %1, i64 0374  %5 = extractelement <4 x float> %2, i64 0375  %6 = fmul fast float %4, %3376  %7 = fsub fast float %5, %6377  %8 = bitcast i8 %k to <8 x i1>378  %9 = extractelement <8 x i1> %8, i64 0379  %10 = select i1 %9, float %7, float %5380  %11 = insertelement <4 x float> %2, float %10, i64 0381  %12 = bitcast <4 x float> %11 to <2 x double>382  ret <2 x double> %12383}384 385define <2 x double> @combine_scalar_mask3_fnmadd_64(<2 x double> %a, <2 x double> %b, <2 x double> %c, i8 zeroext %k) {386; CHECK-LABEL: combine_scalar_mask3_fnmadd_64:387; CHECK:       # %bb.0: # %entry388; CHECK-NEXT:    kmovw %edi, %k1 # encoding: [0xc5,0xf8,0x92,0xcf]389; CHECK-NEXT:    vfnmadd231sd %xmm0, %xmm1, %xmm2 {%k1} # encoding: [0x62,0xf2,0xf5,0x09,0xbd,0xd0]390; CHECK-NEXT:    # xmm2 {%k1} = -(xmm1 * xmm0) + xmm2391; CHECK-NEXT:    vmovapd %xmm2, %xmm0 # encoding: [0xc5,0xf9,0x28,0xc2]392; CHECK-NEXT:    retq # encoding: [0xc3]393entry:394  %0 = extractelement <2 x double> %a, i64 0395  %1 = extractelement <2 x double> %b, i64 0396  %2 = extractelement <2 x double> %c, i64 0397  %3 = fmul fast double %1, %0398  %4 = fsub fast double %2, %3399  %5 = bitcast i8 %k to <8 x i1>400  %6 = extractelement <8 x i1> %5, i64 0401  %7 = select i1 %6, double %4, double %2402  %8 = insertelement <2 x double> %c, double %7, i64 0403  ret <2 x double> %8404}405 406define <2 x double> @combine_scalar_mask_fnmsub_f32(<2 x double> %a, i8 zeroext %k, <2 x double> %b, <2 x double> %c) {407; CHECK-LABEL: combine_scalar_mask_fnmsub_f32:408; CHECK:       # %bb.0: # %entry409; CHECK-NEXT:    kmovw %edi, %k1 # encoding: [0xc5,0xf8,0x92,0xcf]410; CHECK-NEXT:    vfnmsub213ss %xmm2, %xmm1, %xmm0 {%k1} # encoding: [0x62,0xf2,0x75,0x09,0xaf,0xc2]411; CHECK-NEXT:    # xmm0 {%k1} = -(xmm1 * xmm0) - xmm2412; CHECK-NEXT:    retq # encoding: [0xc3]413entry:414  %0 = bitcast <2 x double> %a to <4 x float>415  %1 = bitcast <2 x double> %b to <4 x float>416  %2 = bitcast <2 x double> %c to <4 x float>417  %3 = extractelement <4 x float> %0, i64 0418  %4 = extractelement <4 x float> %1, i64 0419  %5 = extractelement <4 x float> %2, i64 0420  %sub = fsub fast float -0.000000e+00, %5421  %6 = fmul fast float %4, %3422  %7 = fsub fast float %sub, %6423  %8 = bitcast i8 %k to <8 x i1>424  %9 = extractelement <8 x i1> %8, i64 0425  %10 = select i1 %9, float %7, float %3426  %11 = insertelement <4 x float> %0, float %10, i64 0427  %12 = bitcast <4 x float> %11 to <2 x double>428  ret <2 x double> %12429}430 431define <2 x double> @combine_scalar_mask_fnmsub_f64(<2 x double> %a, i8 zeroext %k, <2 x double> %b, <2 x double> %c) {432; CHECK-LABEL: combine_scalar_mask_fnmsub_f64:433; CHECK:       # %bb.0: # %entry434; CHECK-NEXT:    kmovw %edi, %k1 # encoding: [0xc5,0xf8,0x92,0xcf]435; CHECK-NEXT:    vfnmsub213sd %xmm2, %xmm1, %xmm0 {%k1} # encoding: [0x62,0xf2,0xf5,0x09,0xaf,0xc2]436; CHECK-NEXT:    # xmm0 {%k1} = -(xmm1 * xmm0) - xmm2437; CHECK-NEXT:    retq # encoding: [0xc3]438entry:439  %0 = extractelement <2 x double> %a, i64 0440  %1 = extractelement <2 x double> %b, i64 0441  %2 = extractelement <2 x double> %c, i64 0442  %sub = fsub fast double -0.000000e+00, %2443  %3 = fmul fast double %1, %0444  %4 = fsub fast double %sub, %3445  %5 = bitcast i8 %k to <8 x i1>446  %6 = extractelement <8 x i1> %5, i64 0447  %7 = select i1 %6, double %4, double %0448  %8 = insertelement <2 x double> %a, double %7, i64 0449  ret <2 x double> %8450}451 452define <2 x double> @combine_scalar_maskz_fnmsub_32(i8 zeroext %k, <2 x double> %a, <2 x double> %b, <2 x double> %c) {453; CHECK-LABEL: combine_scalar_maskz_fnmsub_32:454; CHECK:       # %bb.0: # %entry455; CHECK-NEXT:    kmovw %edi, %k1 # encoding: [0xc5,0xf8,0x92,0xcf]456; CHECK-NEXT:    vfnmsub213ss %xmm2, %xmm1, %xmm0 {%k1} {z} # encoding: [0x62,0xf2,0x75,0x89,0xaf,0xc2]457; CHECK-NEXT:    # xmm0 {%k1} {z} = -(xmm1 * xmm0) - xmm2458; CHECK-NEXT:    retq # encoding: [0xc3]459entry:460  %0 = bitcast <2 x double> %a to <4 x float>461  %1 = bitcast <2 x double> %b to <4 x float>462  %2 = bitcast <2 x double> %c to <4 x float>463  %3 = extractelement <4 x float> %0, i64 0464  %4 = extractelement <4 x float> %1, i64 0465  %5 = extractelement <4 x float> %2, i64 0466  %sub = fsub fast float -0.000000e+00, %5467  %6 = fmul fast float %4, %3468  %7 = fsub fast float %sub, %6469  %8 = bitcast i8 %k to <8 x i1>470  %9 = extractelement <8 x i1> %8, i64 0471  %10 = select i1 %9, float %7, float 0.000000e+00472  %11 = insertelement <4 x float> %0, float %10, i64 0473  %12 = bitcast <4 x float> %11 to <2 x double>474  ret <2 x double> %12475}476 477define <2 x double> @combine_scalar_maskz_fnmsub_64(i8 zeroext %k, <2 x double> %a, <2 x double> %b, <2 x double> %c) {478; CHECK-LABEL: combine_scalar_maskz_fnmsub_64:479; CHECK:       # %bb.0: # %entry480; CHECK-NEXT:    kmovw %edi, %k1 # encoding: [0xc5,0xf8,0x92,0xcf]481; CHECK-NEXT:    vfnmsub213sd %xmm2, %xmm1, %xmm0 {%k1} {z} # encoding: [0x62,0xf2,0xf5,0x89,0xaf,0xc2]482; CHECK-NEXT:    # xmm0 {%k1} {z} = -(xmm1 * xmm0) - xmm2483; CHECK-NEXT:    retq # encoding: [0xc3]484entry:485  %0 = extractelement <2 x double> %a, i64 0486  %1 = extractelement <2 x double> %b, i64 0487  %2 = extractelement <2 x double> %c, i64 0488  %sub = fsub fast double -0.000000e+00, %2489  %3 = fmul fast double %1, %0490  %4 = fsub fast double %sub, %3491  %5 = bitcast i8 %k to <8 x i1>492  %6 = extractelement <8 x i1> %5, i64 0493  %7 = select i1 %6, double %4, double 0.000000e+00494  %8 = insertelement <2 x double> %a, double %7, i64 0495  ret <2 x double> %8496}497 498define <2 x double> @combine_scalar_mask3_fnmsub_32(<2 x double> %a, <2 x double> %b, <2 x double> %c, i8 zeroext %k) {499; CHECK-LABEL: combine_scalar_mask3_fnmsub_32:500; CHECK:       # %bb.0: # %entry501; CHECK-NEXT:    kmovw %edi, %k1 # encoding: [0xc5,0xf8,0x92,0xcf]502; CHECK-NEXT:    vfnmsub231ss %xmm0, %xmm1, %xmm2 {%k1} # encoding: [0x62,0xf2,0x75,0x09,0xbf,0xd0]503; CHECK-NEXT:    # xmm2 {%k1} = -(xmm1 * xmm0) - xmm2504; CHECK-NEXT:    vmovaps %xmm2, %xmm0 # encoding: [0xc5,0xf8,0x28,0xc2]505; CHECK-NEXT:    retq # encoding: [0xc3]506entry:507  %0 = bitcast <2 x double> %a to <4 x float>508  %1 = bitcast <2 x double> %b to <4 x float>509  %2 = bitcast <2 x double> %c to <4 x float>510  %3 = extractelement <4 x float> %0, i64 0511  %4 = extractelement <4 x float> %1, i64 0512  %5 = extractelement <4 x float> %2, i64 0513  %sub = fsub fast float -0.000000e+00, %5514  %6 = fmul fast float %4, %3515  %7 = fsub fast float %sub, %6516  %8 = bitcast i8 %k to <8 x i1>517  %9 = extractelement <8 x i1> %8, i64 0518  %10 = select i1 %9, float %7, float %5519  %11 = insertelement <4 x float> %2, float %10, i64 0520  %12 = bitcast <4 x float> %11 to <2 x double>521  ret <2 x double> %12522}523 524define <2 x double> @combine_scalar_mask3_fnmsub_64(<2 x double> %a, <2 x double> %b, <2 x double> %c, i8 zeroext %k) {525; CHECK-LABEL: combine_scalar_mask3_fnmsub_64:526; CHECK:       # %bb.0: # %entry527; CHECK-NEXT:    kmovw %edi, %k1 # encoding: [0xc5,0xf8,0x92,0xcf]528; CHECK-NEXT:    vfnmsub231sd %xmm0, %xmm1, %xmm2 {%k1} # encoding: [0x62,0xf2,0xf5,0x09,0xbf,0xd0]529; CHECK-NEXT:    # xmm2 {%k1} = -(xmm1 * xmm0) - xmm2530; CHECK-NEXT:    vmovapd %xmm2, %xmm0 # encoding: [0xc5,0xf9,0x28,0xc2]531; CHECK-NEXT:    retq # encoding: [0xc3]532entry:533  %0 = extractelement <2 x double> %a, i64 0534  %1 = extractelement <2 x double> %b, i64 0535  %2 = extractelement <2 x double> %c, i64 0536  %sub = fsub fast double -0.000000e+00, %2537  %3 = fmul fast double %1, %0538  %4 = fsub fast double %sub, %3539  %5 = bitcast i8 %k to <8 x i1>540  %6 = extractelement <8 x i1> %5, i64 0541  %7 = select i1 %6, double %4, double %2542  %8 = insertelement <2 x double> %c, double %7, i64 0543  ret <2 x double> %8544}545 546; Don't fold into (fmul x, c1+c2) if reassoc not set547define float @fma_const_fmul(float %x) {548; CHECK-LABEL: fma_const_fmul:549; CHECK:       # %bb.0:550; CHECK-NEXT:    vmulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1 # EVEX TO VEX Compression encoding: [0xc5,0xfa,0x59,0x0d,A,A,A,A]551; CHECK-NEXT:    # fixup A - offset: 4, value: {{\.?LCPI[0-9]+_[0-9]+}}, kind: reloc_riprel_4byte552; CHECK-NEXT:    vfmadd132ss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm0 # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x71,0x99,0x05,A,A,A,A]553; CHECK-NEXT:    # fixup A - offset: 5, value: {{\.?LCPI[0-9]+_[0-9]+}}, kind: reloc_riprel_4byte554; CHECK-NEXT:    # xmm0 = (xmm0 * mem) + xmm1555; CHECK-NEXT:    retq # encoding: [0xc3]556  %mul1 = fmul contract float %x, 10.0557  %mul2 = fmul contract float %x, 11.0558  %add1 = fadd contract float %mul1, %mul2559  ret float %add1560}561 562; Fold (fmul (fadd x, 1.0), y) -> (fma x, y, y) without FP specific command-line563; options.564define float @combine_fmul_distributive(float %x, float %y) {565; CHECK-LABEL: combine_fmul_distributive:566; CHECK:       # %bb.0:567; CHECK-NEXT:    vfmadd231ss %xmm0, %xmm1, %xmm0 # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x71,0xb9,0xc0]568; CHECK-NEXT:    # xmm0 = (xmm1 * xmm0) + xmm0569; CHECK-NEXT:    retq # encoding: [0xc3]570  %fadd = fadd ninf float %y, 1.0571  %fmul = fmul contract float %fadd, %x572  ret float %fmul573}574