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