253 lines · plain
1// RUN: mlir-opt %s --convert-vector-to-llvm="enable-x86vector" --convert-to-llvm -reconcile-unrealized-casts \2// RUN: | mlir-translate --mlir-to-llvmir \3// RUN: | FileCheck %s4 5// CHECK-LABEL: define <16 x float> @LLVM_x86_avx512_mask_ps_5126func.func @LLVM_x86_avx512_mask_ps_512(7 %src: vector<16xf32>, %a: vector<16xf32>, %b: vector<16xf32>,8 %imm: i16, %scale_k: i16)9 -> (vector<16xf32>)10{11 %rnd_k = arith.constant 15 : i3212 %rnd = arith.constant 42 : i3213 // CHECK: call <16 x float> @llvm.x86.avx512.mask.rndscale.ps.512(<16 x float>14 %0 = x86vector.avx512.mask.rndscale %src, %rnd_k, %a, %imm, %rnd : vector<16xf32>15 // CHECK: call <16 x float> @llvm.x86.avx512.mask.scalef.ps.512(<16 x float>16 %1 = x86vector.avx512.mask.scalef %0, %a, %b, %scale_k, %rnd : vector<16xf32>17 return %1 : vector<16xf32>18}19 20// CHECK-LABEL: define <8 x double> @LLVM_x86_avx512_mask_pd_51221func.func @LLVM_x86_avx512_mask_pd_512(22 %src: vector<8xf64>, %a: vector<8xf64>, %b: vector<8xf64>,23 %imm: i8, %scale_k: i8)24 -> (vector<8xf64>)25{26 %rnd_k = arith.constant 15 : i3227 %rnd = arith.constant 42 : i3228 // CHECK: call <8 x double> @llvm.x86.avx512.mask.rndscale.pd.512(<8 x double>29 %0 = x86vector.avx512.mask.rndscale %src, %rnd_k, %a, %imm, %rnd : vector<8xf64>30 // CHECK: call <8 x double> @llvm.x86.avx512.mask.scalef.pd.512(<8 x double>31 %1 = x86vector.avx512.mask.scalef %0, %a, %b, %scale_k, %rnd : vector<8xf64>32 return %1 : vector<8xf64>33}34 35// CHECK-LABEL: define <16 x float> @LLVM_x86_mask_compress36func.func @LLVM_x86_mask_compress(%k: vector<16xi1>, %a: vector<16xf32>)37 -> vector<16xf32>38{39 // CHECK: call <16 x float> @llvm.x86.avx512.mask.compress.v16f32(40 %0 = x86vector.avx512.mask.compress %k, %a, %a : vector<16xf32>, vector<16xf32>41 return %0 : vector<16xf32>42}43 44// CHECK-LABEL: define { <16 x i1>, <16 x i1> } @LLVM_x86_vp2intersect_d_51245func.func @LLVM_x86_vp2intersect_d_512(%a: vector<16xi32>, %b: vector<16xi32>)46 -> (vector<16xi1>, vector<16xi1>)47{48 // CHECK: call { <16 x i1>, <16 x i1> } @llvm.x86.avx512.vp2intersect.d.512(<16 x i32>49 %0, %1 = x86vector.avx512.vp2intersect %a, %b : vector<16xi32>50 return %0, %1 : vector<16xi1>, vector<16xi1>51}52 53// CHECK-LABEL: define { <8 x i1>, <8 x i1> } @LLVM_x86_vp2intersect_q_51254func.func @LLVM_x86_vp2intersect_q_512(%a: vector<8xi64>, %b: vector<8xi64>)55 -> (vector<8 x i1>, vector<8 x i1>)56{57 // CHECK: call { <8 x i1>, <8 x i1> } @llvm.x86.avx512.vp2intersect.q.512(<8 x i64>58 %0, %1 = x86vector.avx512.vp2intersect %a, %b : vector<8xi64>59 return %0, %1 : vector<8 x i1>, vector<8 x i1>60}61 62// CHECK-LABEL: define <4 x float> @LLVM_x86_avx512bf16_dpbf16ps_12863func.func @LLVM_x86_avx512bf16_dpbf16ps_128(64 %src: vector<4xf32>, %a: vector<8xbf16>, %b: vector<8xbf16>65 ) -> vector<4xf32>66{67 // CHECK: call <4 x float> @llvm.x86.avx512bf16.dpbf16ps.128(68 %0 = x86vector.avx512.dot %src, %a, %b : vector<8xbf16> -> vector<4xf32>69 return %0 : vector<4xf32>70}71 72// CHECK-LABEL: define <8 x float> @LLVM_x86_avx512bf16_dpbf16ps_25673func.func @LLVM_x86_avx512bf16_dpbf16ps_256(74 %src: vector<8xf32>, %a: vector<16xbf16>, %b: vector<16xbf16>75 ) -> vector<8xf32>76{77 // CHECK: call <8 x float> @llvm.x86.avx512bf16.dpbf16ps.256(78 %0 = x86vector.avx512.dot %src, %a, %b : vector<16xbf16> -> vector<8xf32>79 return %0 : vector<8xf32>80}81 82// CHECK-LABEL: define <16 x float> @LLVM_x86_avx512bf16_dpbf16ps_51283func.func @LLVM_x86_avx512bf16_dpbf16ps_512(84 %src: vector<16xf32>, %a: vector<32xbf16>, %b: vector<32xbf16>85 ) -> vector<16xf32>86{87 // CHECK: call <16 x float> @llvm.x86.avx512bf16.dpbf16ps.512(88 %0 = x86vector.avx512.dot %src, %a, %b : vector<32xbf16> -> vector<16xf32>89 return %0 : vector<16xf32>90}91 92// CHECK-LABEL: define <8 x bfloat> @LLVM_x86_avx512bf16_cvtneps2bf16_25693func.func @LLVM_x86_avx512bf16_cvtneps2bf16_256(94 %a: vector<8xf32>) -> vector<8xbf16>95{96 // CHECK: call <8 x bfloat> @llvm.x86.avx512bf16.cvtneps2bf16.256(97 %0 = x86vector.avx512.cvt.packed.f32_to_bf16 %a98 : vector<8xf32> -> vector<8xbf16>99 return %0 : vector<8xbf16>100}101 102// CHECK-LABEL: define <16 x bfloat> @LLVM_x86_avx512bf16_cvtneps2bf16_512103func.func @LLVM_x86_avx512bf16_cvtneps2bf16_512(104 %a: vector<16xf32>) -> vector<16xbf16>105{106 // CHECK: call <16 x bfloat> @llvm.x86.avx512bf16.cvtneps2bf16.512(107 %0 = x86vector.avx512.cvt.packed.f32_to_bf16 %a108 : vector<16xf32> -> vector<16xbf16>109 return %0 : vector<16xbf16>110}111 112// CHECK-LABEL: define <4 x float> @LLVM_x86_avxbf16_vcvtneebf162ps128113func.func @LLVM_x86_avxbf16_vcvtneebf162ps128(114 %a: memref<8xbf16>) -> vector<4xf32>115{116 // CHECK: call <4 x float> @llvm.x86.vcvtneebf162ps128(117 %0 = x86vector.avx.cvt.packed.even.indexed_to_f32 %a : memref<8xbf16> -> vector<4xf32>118 return %0 : vector<4xf32>119}120 121// CHECK-LABEL: define <8 x float> @LLVM_x86_avxbf16_vcvtneebf162ps256122func.func @LLVM_x86_avxbf16_vcvtneebf162ps256(123 %a: memref<16xbf16>) -> vector<8xf32>124{125 // CHECK: call <8 x float> @llvm.x86.vcvtneebf162ps256(126 %0 = x86vector.avx.cvt.packed.even.indexed_to_f32 %a : memref<16xbf16> -> vector<8xf32>127 return %0 : vector<8xf32>128}129 130// CHECK-LABEL: define <4 x float> @LLVM_x86_avxbf16_vcvtneobf162ps128131func.func @LLVM_x86_avxbf16_vcvtneobf162ps128(132 %a: memref<8xbf16>) -> vector<4xf32>133{134 // CHECK: call <4 x float> @llvm.x86.vcvtneobf162ps128(135 %0 = x86vector.avx.cvt.packed.odd.indexed_to_f32 %a : memref<8xbf16> -> vector<4xf32>136 return %0 : vector<4xf32>137}138 139// CHECK-LABEL: define <8 x float> @LLVM_x86_avxbf16_vcvtneobf162ps256140func.func @LLVM_x86_avxbf16_vcvtneobf162ps256(141 %a: memref<16xbf16>) -> vector<8xf32>142{143 // CHECK: call <8 x float> @llvm.x86.vcvtneobf162ps256(144 %0 = x86vector.avx.cvt.packed.odd.indexed_to_f32 %a : memref<16xbf16> -> vector<8xf32>145 return %0 : vector<8xf32>146}147 148// CHECK-LABEL: define <4 x float> @LLVM_x86_avxbf16_vbcstnebf162ps128149func.func @LLVM_x86_avxbf16_vbcstnebf162ps128(150 %a: memref<1xbf16>) -> vector<4xf32>151{152 // CHECK: call <4 x float> @llvm.x86.vbcstnebf162ps128(153 %0 = x86vector.avx.bcst_to_f32.packed %a : memref<1xbf16> -> vector<4xf32>154 return %0 : vector<4xf32>155}156 157// CHECK-LABEL: define <8 x float> @LLVM_x86_avxbf16_vbcstnebf162ps256158func.func @LLVM_x86_avxbf16_vbcstnebf162ps256(159 %a: memref<1xbf16>) -> vector<8xf32>160{161 // CHECK: call <8 x float> @llvm.x86.vbcstnebf162ps256(162 %0 = x86vector.avx.bcst_to_f32.packed %a : memref<1xbf16> -> vector<8xf32>163 return %0 : vector<8xf32>164}165 166// CHECK-LABEL: define <4 x float> @LLVM_x86_avxf16_vcvtneeph2ps128167func.func @LLVM_x86_avxf16_vcvtneeph2ps128(168 %a: memref<8xf16>) -> vector<4xf32>169{170 // CHECK: call <4 x float> @llvm.x86.vcvtneeph2ps128(171 %0 = x86vector.avx.cvt.packed.even.indexed_to_f32 %a : memref<8xf16> -> vector<4xf32>172 return %0 : vector<4xf32>173}174 175// CHECK-LABEL: define <8 x float> @LLVM_x86_avxf16_vcvtneeph2ps256176func.func @LLVM_x86_avxf16_vcvtneeph2ps256(177 %a: memref<16xf16>) -> vector<8xf32>178{179 // CHECK: call <8 x float> @llvm.x86.vcvtneeph2ps256(180 %0 = x86vector.avx.cvt.packed.even.indexed_to_f32 %a : memref<16xf16> -> vector<8xf32>181 return %0 : vector<8xf32>182}183 184// CHECK-LABEL: define <4 x float> @LLVM_x86_avxf16_vcvtneoph2ps128185func.func @LLVM_x86_avxf16_vcvtneoph2ps128(186 %a: memref<8xf16>) -> vector<4xf32>187{188 // CHECK: call <4 x float> @llvm.x86.vcvtneoph2ps128(189 %0 = x86vector.avx.cvt.packed.odd.indexed_to_f32 %a : memref<8xf16> -> vector<4xf32>190 return %0 : vector<4xf32>191}192 193// CHECK-LABEL: define <8 x float> @LLVM_x86_avxf16_vcvtneoph2ps256194func.func @LLVM_x86_avxf16_vcvtneoph2ps256(195 %a: memref<16xf16>) -> vector<8xf32>196{197 // CHECK: call <8 x float> @llvm.x86.vcvtneoph2ps256(198 %0 = x86vector.avx.cvt.packed.odd.indexed_to_f32 %a : memref<16xf16> -> vector<8xf32>199 return %0 : vector<8xf32>200}201 202// CHECK-LABEL: define <4 x float> @LLVM_x86_avxf16_vbcstnesh2ps128203func.func @LLVM_x86_avxf16_vbcstnesh2ps128(204 %a: memref<1xf16>) -> vector<4xf32>205{206 // CHECK: call <4 x float> @llvm.x86.vbcstnesh2ps128(207 %0 = x86vector.avx.bcst_to_f32.packed %a : memref<1xf16> -> vector<4xf32>208 return %0 : vector<4xf32>209}210 211// CHECK-LABEL: define <8 x float> @LLVM_x86_avxf16_vbcstnesh2ps256212func.func @LLVM_x86_avxf16_vbcstnesh2ps256(213 %a: memref<1xf16>) -> vector<8xf32>214{215 // CHECK: call <8 x float> @llvm.x86.vbcstnesh2ps256(216 %0 = x86vector.avx.bcst_to_f32.packed %a : memref<1xf16> -> vector<8xf32>217 return %0 : vector<8xf32>218}219 220// CHECK-LABEL: define <8 x float> @LLVM_x86_avx_rsqrt_ps_256221func.func @LLVM_x86_avx_rsqrt_ps_256(%a: vector <8xf32>) -> vector<8xf32>222{223 // CHECK: call <8 x float> @llvm.x86.avx.rsqrt.ps.256(<8 x float>224 %0 = x86vector.avx.rsqrt %a : vector<8xf32>225 return %0 : vector<8xf32>226}227 228// CHECK-LABEL: define <8 x float> @LLVM_x86_avx_dp_ps_256229func.func @LLVM_x86_avx_dp_ps_256(230 %a: vector<8xf32>, %b: vector<8xf32>231 ) -> vector<8xf32>232{233 // CHECK: call <8 x float> @llvm.x86.avx.dp.ps.256(234 %0 = x86vector.avx.intr.dot %a, %b : vector<8xf32>235 return %0 : vector<8xf32>236}237 238// CHECK-LABEL: define <4 x i32> @LLVM_x86_avx2_vpdpbssd_128239func.func @LLVM_x86_avx2_vpdpbssd_128(%w: vector<4xi32>, %a: vector<16xi8>,240 %b: vector<16xi8>) -> vector<4xi32> {241 // CHECK: call <4 x i32> @llvm.x86.avx2.vpdpbssd.128(242 %0 = x86vector.avx.dot.i8 %w, %a, %b : vector<16xi8> -> vector<4xi32>243 return %0 : vector<4xi32>244}245 246// CHECK-LABEL: define <8 x i32> @LLVM_x86_avx2_vpdpbssd_256247func.func @LLVM_x86_avx2_vpdpbssd_256(%w: vector<8xi32>, %a: vector<32xi8>,248 %b: vector<32xi8>) -> vector<8xi32> {249 // CHECK: call <8 x i32> @llvm.x86.avx2.vpdpbssd.256(250 %0 = x86vector.avx.dot.i8 %w, %a, %b : vector<32xi8> -> vector<8xi32>251 return %0 : vector<8xi32>252}253