1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl -mattr=+avx512bw -mattr=+avx512fp16 -mattr=+avx512vl | FileCheck %s 3 4declare <4 x float> @llvm.x86.avx512fp16.mask.vfmadd.cph.128(<4 x float>, <4 x float>, <4 x float>, i8) 5declare <4 x float> @llvm.x86.avx512fp16.maskz.vfmadd.cph.128(<4 x float>, <4 x float>, <4 x float>, i8) 6 7define <4 x float> @test_int_x86_avx512fp8_mask_cfmadd_ph_bst(<4 x float> %x0, <4 x float> %x1, i8 %x3){ 8; CHECK-LABEL: test_int_x86_avx512fp8_mask_cfmadd_ph_bst: 9; CHECK: ## %bb.0: 10; CHECK-NEXT: kmovd %edi, %k1 11; CHECK-NEXT: vfmaddcph {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm1 {%k1} 12; CHECK-NEXT: vmovaps %xmm1, %xmm0 13; CHECK-NEXT: retq 14 %res = call <4 x float> @llvm.x86.avx512fp16.mask.vfmadd.cph.128(<4 x float> %x0, <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, <4 x float> %x1, i8 %x3) 15 ret <4 x float> %res 16} 17 18define <4 x float> @test_int_x86_avx512fp8_mask_cfmadd_ph_bst2(<4 x float> %x0, <4 x float> %x1, i8 %x3){ 19; CHECK-LABEL: test_int_x86_avx512fp8_mask_cfmadd_ph_bst2: 20; CHECK: ## %bb.0: 21; CHECK-NEXT: kmovd %edi, %k1 22; CHECK-NEXT: vfmaddcph {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm1 {%k1} 23; CHECK-NEXT: vmovaps %xmm1, %xmm0 24; CHECK-NEXT: retq 25 %res = call <4 x float> @llvm.x86.avx512fp16.mask.vfmadd.cph.128(<4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, <4 x float> %x0, <4 x float> %x1, i8 %x3) 26 ret <4 x float> %res 27} 28 29define <4 x float> @test_int_x86_avx512fp8_mask_cfmadd_ph_128(<4 x float> %x0, <4 x float> %x1, <4 x float> %x2, i8 %x3){ 30; CHECK-LABEL: test_int_x86_avx512fp8_mask_cfmadd_ph_128: 31; CHECK: ## %bb.0: 32; CHECK-NEXT: kmovd %edi, %k1 33; CHECK-NEXT: vfmaddcph %xmm1, %xmm0, %xmm2 {%k1} 34; CHECK-NEXT: vmovaps %xmm2, %xmm0 35; CHECK-NEXT: retq 36 %res = call <4 x float> @llvm.x86.avx512fp16.mask.vfmadd.cph.128(<4 x float> %x0, <4 x float> %x1, <4 x float> %x2, i8 %x3) 37 ret <4 x float> %res 38} 39 40define <4 x float> @test_int_x86_avx512fp8_maskz_cfmadd_ph_128(<4 x float> %x0, <4 x float> %x1, <4 x float> %x2, i8 %x3){ 41; CHECK-LABEL: test_int_x86_avx512fp8_maskz_cfmadd_ph_128: 42; CHECK: ## %bb.0: 43; CHECK-NEXT: kmovd %edi, %k1 44; CHECK-NEXT: vfmaddcph %xmm1, %xmm0, %xmm2 {%k1} {z} 45; CHECK-NEXT: vmovaps %xmm2, %xmm0 46; CHECK-NEXT: retq 47 %res = call <4 x float> @llvm.x86.avx512fp16.maskz.vfmadd.cph.128(<4 x float> %x0, <4 x float> %x1, <4 x float> %x2, i8 %x3) 48 ret <4 x float> %res 49} 50 51define <4 x float> @test_int_x86_avx512fp8_cfmadd_ph_128(<4 x float> %x0, <4 x float> %x1, <4 x float> %x2){ 52; CHECK-LABEL: test_int_x86_avx512fp8_cfmadd_ph_128: 53; CHECK: ## %bb.0: 54; CHECK-NEXT: vfmaddcph %xmm1, %xmm2, %xmm0 55; CHECK-NEXT: retq 56 %res = call <4 x float> @llvm.x86.avx512fp16.mask.vfmadd.cph.128(<4 x float> %x2, <4 x float> %x1, <4 x float> %x0, i8 -1) 57 ret <4 x float> %res 58} 59 60 61declare <8 x float> @llvm.x86.avx512fp16.mask.vfmadd.cph.256(<8 x float>, <8 x float>, <8 x float>, i8) 62declare <8 x float> @llvm.x86.avx512fp16.maskz.vfmadd.cph.256(<8 x float>, <8 x float>, <8 x float>, i8) 63 64define <8 x float> @test_int_x86_avx512fp16_mask_cfmadd_ph_256(<8 x float> %x0, <8 x float> %x1, <8 x float> %x2, i8 %x3){ 65; CHECK-LABEL: test_int_x86_avx512fp16_mask_cfmadd_ph_256: 66; CHECK: ## %bb.0: 67; CHECK-NEXT: kmovd %edi, %k1 68; CHECK-NEXT: vfmaddcph %ymm1, %ymm0, %ymm2 {%k1} 69; CHECK-NEXT: vmovaps %ymm2, %ymm0 70; CHECK-NEXT: retq 71 %res = call <8 x float> @llvm.x86.avx512fp16.mask.vfmadd.cph.256(<8 x float> %x0, <8 x float> %x1, <8 x float> %x2, i8 %x3) 72 ret <8 x float> %res 73} 74 75define <8 x float> @test_int_x86_avx512fp16_maskz_cfmadd_ph_256(<8 x float> %x0, <8 x float> %x1, <8 x float> %x2, i8 %x3){ 76; CHECK-LABEL: test_int_x86_avx512fp16_maskz_cfmadd_ph_256: 77; CHECK: ## %bb.0: 78; CHECK-NEXT: kmovd %edi, %k1 79; CHECK-NEXT: vfmaddcph %ymm1, %ymm0, %ymm2 {%k1} {z} 80; CHECK-NEXT: vmovaps %ymm2, %ymm0 81; CHECK-NEXT: retq 82 %res = call <8 x float> @llvm.x86.avx512fp16.maskz.vfmadd.cph.256(<8 x float> %x0, <8 x float> %x1, <8 x float> %x2, i8 %x3) 83 ret <8 x float> %res 84} 85 86define <8 x float> @test_int_x86_avx512fp16_cfmadd_ph_256(<8 x float> %x0, <8 x float> %x1, <8 x float> %x2){ 87; CHECK-LABEL: test_int_x86_avx512fp16_cfmadd_ph_256: 88; CHECK: ## %bb.0: 89; CHECK-NEXT: vfmaddcph %ymm1, %ymm2, %ymm0 90; CHECK-NEXT: retq 91 %res = call <8 x float> @llvm.x86.avx512fp16.mask.vfmadd.cph.256(<8 x float> %x2, <8 x float> %x1, <8 x float> %x0, i8 -1) 92 ret <8 x float> %res 93} 94 95 96declare <16 x float> @llvm.x86.avx512fp16.mask.vfmadd.cph.512(<16 x float>, <16 x float>, <16 x float>, i16, i32) 97declare <16 x float> @llvm.x86.avx512fp16.maskz.vfmadd.cph.512(<16 x float>, <16 x float>, <16 x float>, i16, i32) 98 99define <16 x float> @test_int_x86_avx512fp16_mask_cfmadd_ph_512(<16 x float> %x0, <16 x float> %x1, <16 x float> %x2, i16 %x3){ 100; CHECK-LABEL: test_int_x86_avx512fp16_mask_cfmadd_ph_512: 101; CHECK: ## %bb.0: 102; CHECK-NEXT: kmovd %edi, %k1 103; CHECK-NEXT: vfmaddcph %zmm1, %zmm0, %zmm2 {%k1} 104; CHECK-NEXT: vmovaps %zmm2, %zmm0 105; CHECK-NEXT: retq 106 %res = call <16 x float> @llvm.x86.avx512fp16.mask.vfmadd.cph.512(<16 x float> %x0, <16 x float> %x1, <16 x float> %x2, i16 %x3, i32 4) 107 ret <16 x float> %res 108} 109 110define <16 x float> @test_int_x86_avx512fp16_maskz_cfmadd_ph_512(<16 x float> %x0, <16 x float> %x1, <16 x float> %x2, i16 %x3){ 111; CHECK-LABEL: test_int_x86_avx512fp16_maskz_cfmadd_ph_512: 112; CHECK: ## %bb.0: 113; CHECK-NEXT: kmovd %edi, %k1 114; CHECK-NEXT: vfmaddcph %zmm1, %zmm0, %zmm2 {%k1} {z} 115; CHECK-NEXT: vmovaps %zmm2, %zmm0 116; CHECK-NEXT: retq 117 %res = call <16 x float> @llvm.x86.avx512fp16.maskz.vfmadd.cph.512(<16 x float> %x0, <16 x float> %x1, <16 x float> %x2, i16 %x3, i32 4) 118 ret <16 x float> %res 119} 120 121define <16 x float> @test_int_x86_avx512fp16_cfmadd_ph_512_rn(<16 x float> %x0, <16 x float> %x1, <16 x float> %x2, i16 %x3){ 122; CHECK-LABEL: test_int_x86_avx512fp16_cfmadd_ph_512_rn: 123; CHECK: ## %bb.0: 124; CHECK-NEXT: vfmaddcph {rz-sae}, %zmm1, %zmm2, %zmm0 125; CHECK-NEXT: retq 126 %res = call <16 x float> @llvm.x86.avx512fp16.mask.vfmadd.cph.512(<16 x float> %x2, <16 x float> %x1, <16 x float> %x0, i16 -1, i32 11) 127 ret <16 x float> %res 128} 129 130define <16 x float> @test_int_x86_avx512fp16_cfmadd_ph_512(<16 x float> %x0, <16 x float> %x1, <16 x float> %x2, i16 %x3){ 131; CHECK-LABEL: test_int_x86_avx512fp16_cfmadd_ph_512: 132; CHECK: ## %bb.0: 133; CHECK-NEXT: vfmaddcph %zmm1, %zmm2, %zmm0 134; CHECK-NEXT: retq 135 %res = call <16 x float> @llvm.x86.avx512fp16.mask.vfmadd.cph.512(<16 x float> %x2, <16 x float> %x1, <16 x float> %x0, i16 -1, i32 4) 136 ret <16 x float> %res 137} 138 139declare <4 x float> @llvm.x86.avx512fp16.mask.vfcmadd.cph.128(<4 x float>, <4 x float>, <4 x float>, i8) 140declare <4 x float> @llvm.x86.avx512fp16.maskz.vfcmadd.cph.128(<4 x float>, <4 x float>, <4 x float>, i8) 141 142define <4 x float> @test_int_x86_avx512fp8_mask_cfcmadd_ph_bst(<4 x float> %x0, <4 x float> %x1, i8 %x3){ 143; CHECK-LABEL: test_int_x86_avx512fp8_mask_cfcmadd_ph_bst: 144; CHECK: ## %bb.0: 145; CHECK-NEXT: kmovd %edi, %k1 146; CHECK-NEXT: vfcmaddcph {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm1 {%k1} 147; CHECK-NEXT: vmovaps %xmm1, %xmm0 148; CHECK-NEXT: retq 149 %res = call <4 x float> @llvm.x86.avx512fp16.mask.vfcmadd.cph.128(<4 x float> %x0, <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, <4 x float> %x1, i8 %x3) 150 ret <4 x float> %res 151} 152 153; Check conjugate complex FMA is not commutable. 154define <4 x float> @test_int_x86_avx512fp8_mask_cfcmadd_ph_bst2(<4 x float> %x0, <4 x float> %x1, i8 %x3){ 155; CHECK-LABEL: test_int_x86_avx512fp8_mask_cfcmadd_ph_bst2: 156; CHECK: ## %bb.0: 157; CHECK-NEXT: kmovd %edi, %k1 158; CHECK-NEXT: vbroadcastss {{.*#+}} xmm2 = [1.0E+0,1.0E+0,1.0E+0,1.0E+0] 159; CHECK-NEXT: vfcmaddcph %xmm0, %xmm2, %xmm1 {%k1} 160; CHECK-NEXT: vmovaps %xmm1, %xmm0 161; CHECK-NEXT: retq 162 %res = call <4 x float> @llvm.x86.avx512fp16.mask.vfcmadd.cph.128(<4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, <4 x float> %x0, <4 x float> %x1, i8 %x3) 163 ret <4 x float> %res 164} 165 166define <4 x float> @test_int_x86_avx512fp8_mask_cfcmadd_ph_128(<4 x float> %x0, <4 x float> %x1, <4 x float> %x2, i8 %x3){ 167; CHECK-LABEL: test_int_x86_avx512fp8_mask_cfcmadd_ph_128: 168; CHECK: ## %bb.0: 169; CHECK-NEXT: kmovd %edi, %k1 170; CHECK-NEXT: vfcmaddcph %xmm1, %xmm0, %xmm2 {%k1} 171; CHECK-NEXT: vmovaps %xmm2, %xmm0 172; CHECK-NEXT: retq 173 %res = call <4 x float> @llvm.x86.avx512fp16.mask.vfcmadd.cph.128(<4 x float> %x0, <4 x float> %x1, <4 x float> %x2, i8 %x3) 174 ret <4 x float> %res 175} 176 177define <4 x float> @test_int_x86_avx512fp8_maskz_cfcmadd_ph_128(<4 x float> %x0, <4 x float> %x1, <4 x float> %x2, i8 %x3){ 178; CHECK-LABEL: test_int_x86_avx512fp8_maskz_cfcmadd_ph_128: 179; CHECK: ## %bb.0: 180; CHECK-NEXT: kmovd %edi, %k1 181; CHECK-NEXT: vfcmaddcph %xmm1, %xmm0, %xmm2 {%k1} {z} 182; CHECK-NEXT: vmovaps %xmm2, %xmm0 183; CHECK-NEXT: retq 184 %res = call <4 x float> @llvm.x86.avx512fp16.maskz.vfcmadd.cph.128(<4 x float> %x0, <4 x float> %x1, <4 x float> %x2, i8 %x3) 185 ret <4 x float> %res 186} 187 188define <4 x float> @test_int_x86_avx512fp8_cfcmadd_ph_128(<4 x float> %x0, <4 x float> %x1, <4 x float> %x2){ 189; CHECK-LABEL: test_int_x86_avx512fp8_cfcmadd_ph_128: 190; CHECK: ## %bb.0: 191; CHECK-NEXT: vfcmaddcph %xmm1, %xmm2, %xmm0 192; CHECK-NEXT: retq 193 %res = call <4 x float> @llvm.x86.avx512fp16.mask.vfcmadd.cph.128(<4 x float> %x2, <4 x float> %x1, <4 x float> %x0, i8 -1) 194 ret <4 x float> %res 195} 196 197 198declare <8 x float> @llvm.x86.avx512fp16.mask.vfcmadd.cph.256(<8 x float>, <8 x float>, <8 x float>, i8) 199declare <8 x float> @llvm.x86.avx512fp16.maskz.vfcmadd.cph.256(<8 x float>, <8 x float>, <8 x float>, i8) 200 201define <8 x float> @test_int_x86_avx512fp16_mask_cfcmadd_ph_256(<8 x float> %x0, <8 x float> %x1, <8 x float> %x2, i8 %x3){ 202; CHECK-LABEL: test_int_x86_avx512fp16_mask_cfcmadd_ph_256: 203; CHECK: ## %bb.0: 204; CHECK-NEXT: kmovd %edi, %k1 205; CHECK-NEXT: vfcmaddcph %ymm1, %ymm0, %ymm2 {%k1} 206; CHECK-NEXT: vmovaps %ymm2, %ymm0 207; CHECK-NEXT: retq 208 %res = call <8 x float> @llvm.x86.avx512fp16.mask.vfcmadd.cph.256(<8 x float> %x0, <8 x float> %x1, <8 x float> %x2, i8 %x3) 209 ret <8 x float> %res 210} 211 212define <8 x float> @test_int_x86_avx512fp16_maskz_cfcmadd_ph_256(<8 x float> %x0, <8 x float> %x1, <8 x float> %x2, i8 %x3){ 213; CHECK-LABEL: test_int_x86_avx512fp16_maskz_cfcmadd_ph_256: 214; CHECK: ## %bb.0: 215; CHECK-NEXT: kmovd %edi, %k1 216; CHECK-NEXT: vfcmaddcph %ymm1, %ymm0, %ymm2 {%k1} {z} 217; CHECK-NEXT: vmovaps %ymm2, %ymm0 218; CHECK-NEXT: retq 219 %res = call <8 x float> @llvm.x86.avx512fp16.maskz.vfcmadd.cph.256(<8 x float> %x0, <8 x float> %x1, <8 x float> %x2, i8 %x3) 220 ret <8 x float> %res 221} 222 223define <8 x float> @test_int_x86_avx512fp16_cfcmadd_ph_256(<8 x float> %x0, <8 x float> %x1, <8 x float> %x2){ 224; CHECK-LABEL: test_int_x86_avx512fp16_cfcmadd_ph_256: 225; CHECK: ## %bb.0: 226; CHECK-NEXT: vfcmaddcph %ymm1, %ymm2, %ymm0 227; CHECK-NEXT: retq 228 %res = call <8 x float> @llvm.x86.avx512fp16.mask.vfcmadd.cph.256(<8 x float> %x2, <8 x float> %x1, <8 x float> %x0, i8 -1) 229 ret <8 x float> %res 230} 231 232 233declare <16 x float> @llvm.x86.avx512fp16.mask.vfcmadd.cph.512(<16 x float>, <16 x float>, <16 x float>, i16, i32) 234declare <16 x float> @llvm.x86.avx512fp16.maskz.vfcmadd.cph.512(<16 x float>, <16 x float>, <16 x float>, i16, i32) 235 236define <16 x float> @test_int_x86_avx512fp16_mask_cfcmadd_ph_512(<16 x float> %x0, <16 x float> %x1, <16 x float> %x2, i16 %x3){ 237; CHECK-LABEL: test_int_x86_avx512fp16_mask_cfcmadd_ph_512: 238; CHECK: ## %bb.0: 239; CHECK-NEXT: kmovd %edi, %k1 240; CHECK-NEXT: vfcmaddcph %zmm1, %zmm0, %zmm2 {%k1} 241; CHECK-NEXT: vmovaps %zmm2, %zmm0 242; CHECK-NEXT: retq 243 %res = call <16 x float> @llvm.x86.avx512fp16.mask.vfcmadd.cph.512(<16 x float> %x0, <16 x float> %x1, <16 x float> %x2, i16 %x3, i32 4) 244 ret <16 x float> %res 245} 246 247define <16 x float> @test_int_x86_avx512fp16_maskz_cfcmadd_ph_512(<16 x float> %x0, <16 x float> %x1, <16 x float> %x2, i16 %x3){ 248; CHECK-LABEL: test_int_x86_avx512fp16_maskz_cfcmadd_ph_512: 249; CHECK: ## %bb.0: 250; CHECK-NEXT: kmovd %edi, %k1 251; CHECK-NEXT: vfcmaddcph %zmm1, %zmm0, %zmm2 {%k1} {z} 252; CHECK-NEXT: vmovaps %zmm2, %zmm0 253; CHECK-NEXT: retq 254 %res = call <16 x float> @llvm.x86.avx512fp16.maskz.vfcmadd.cph.512(<16 x float> %x0, <16 x float> %x1, <16 x float> %x2, i16 %x3, i32 4) 255 ret <16 x float> %res 256} 257 258define <16 x float> @test_int_x86_avx512fp16_cfcmadd_ph_512_rn(<16 x float> %x0, <16 x float> %x1, <16 x float> %x2, i16 %x3){ 259; CHECK-LABEL: test_int_x86_avx512fp16_cfcmadd_ph_512_rn: 260; CHECK: ## %bb.0: 261; CHECK-NEXT: vfcmaddcph {rz-sae}, %zmm1, %zmm2, %zmm0 262; CHECK-NEXT: retq 263 %res = call <16 x float> @llvm.x86.avx512fp16.mask.vfcmadd.cph.512(<16 x float> %x2, <16 x float> %x1, <16 x float> %x0, i16 -1, i32 11) 264 ret <16 x float> %res 265} 266 267define <16 x float> @test_int_x86_avx512fp16_cfcmadd_ph_512(<16 x float> %x0, <16 x float> %x1, <16 x float> %x2, i16 %x3){ 268; CHECK-LABEL: test_int_x86_avx512fp16_cfcmadd_ph_512: 269; CHECK: ## %bb.0: 270; CHECK-NEXT: vfcmaddcph %zmm1, %zmm2, %zmm0 271; CHECK-NEXT: retq 272 %res = call <16 x float> @llvm.x86.avx512fp16.mask.vfcmadd.cph.512(<16 x float> %x2, <16 x float> %x1, <16 x float> %x0, i16 -1, i32 4) 273 ret <16 x float> %res 274} 275