brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.5 KiB · 59ed6bd Raw
168 lines · plain
1// RUN: mlir-opt --split-input-file %s -convert-arith-to-amdgpu="chipset=gfx942" | FileCheck %s2 3// CHECK-LABEL: func.func @scalar_ext4// CHECK-SAME: ([[V:%.+]]: f8E5M2FNUZ)5// CHECK: [[FLOAT:%.+]] = amdgpu.ext_packed_fp8 [[V]][0] : f8E5M2FNUZ to f326// CHECK: [[W:%.+]] = arith.truncf [[FLOAT]] : f32 to f167// CHECK: return [[W]]8func.func @scalar_ext(%v: f8E5M2FNUZ) -> f16 {9  %w = arith.extf %v : f8E5M2FNUZ to f1610  return %w : f1611}12 13// -----14 15// CHECK-LABEL: func.func @vector_zero_d(16// CHECK-SAME:   %[[ARG0:[a-zA-Z0-9_]+]]: vector<f8E5M2FNUZ>) -> vector<f32>17// CHECK: %[[CONST:.+]] = arith.constant dense<0.000000e+00> : vector<f32>18// CHECK: %[[EXTRACT:.+]] = vector.extract %[[ARG0]][] : f8E5M2FNUZ from vector<f8E5M2FNUZ>19// CHECK: %[[CONVERT:.+]] = amdgpu.ext_packed_fp8 %[[EXTRACT]][0] : f8E5M2FNUZ to f3220// CHECK: %[[RESULT:.+]] = vector.insert %[[CONVERT]], %[[CONST]] [] : f32 into vector<f32>21// CHECK: return %[[RESULT]] : vector<f32>22func.func @vector_zero_d(%v: vector<f8E5M2FNUZ>) -> vector<f32> {23  %w = arith.extf %v : vector<f8E5M2FNUZ> to vector<f32>24  return %w : vector<f32>25}26 27// -----28 29// CHECK-LABEL: func.func @vector_ext_short30// CHECK-SAME: ([[V:%.+]]: vector<2xf8E5M2FNUZ>)31// CHECK: [[FLOAT:%.+]] = amdgpu.ext_packed_fp8 [[V]][0] : vector<2xf8E5M2FNUZ> to vector<2xf32>32// CHECK: [[EXT:%.+]] = arith.extf [[FLOAT]] : vector<2xf32> to vector<2xf64>33// CHECK: return [[EXT]] : vector<2xf64>34func.func @vector_ext_short(%v: vector<2xf8E5M2FNUZ>) -> vector<2xf64> {35  %w = arith.extf %v : vector<2xf8E5M2FNUZ> to vector<2xf64>36  return %w : vector<2xf64>37}38 39// -----40 41// CHECK-LABEL: func.func @vector_ext_long42// CHECK-SAME: ([[V:%.+]]: vector<9xf8E4M3FNUZ>)43// CHECK: [[W0:%.+]] = arith.constant dense<0.000000e+00> : vector<9xf32>44// CHECK: [[IN1:%.+]] = vector.extract_strided_slice [[V]] {offsets = [0], sizes = [4], strides = [1]} : vector<9xf8E4M3FNUZ> to vector<4xf8E4M3FNUZ>45// CHECK: [[FLOAT1:%.+]] = amdgpu.ext_packed_fp8 [[IN1]][0] : vector<4xf8E4M3FNUZ> to vector<2xf32>46// CHECK: [[W1:%.+]] = vector.insert_strided_slice [[FLOAT1]], [[W0]] {offsets = [0], strides = [1]} : vector<2xf32> into vector<9xf32>47// CHECK: [[FLOAT2:%.+]] = amdgpu.ext_packed_fp8 [[IN1]][1] : vector<4xf8E4M3FNUZ> to vector<2xf32>48// CHECK: [[W2:%.+]] = vector.insert_strided_slice [[FLOAT2]], [[W1]] {offsets = [2], strides = [1]} : vector<2xf32> into vector<9xf32>49// CHECK: [[IN2:%.+]] = vector.extract_strided_slice [[V]] {offsets = [4], sizes = [4], strides = [1]} : vector<9xf8E4M3FNUZ> to vector<4xf8E4M3FNUZ>50// CHECK: [[FLOAT3:%.+]] = amdgpu.ext_packed_fp8 [[IN2]][0] : vector<4xf8E4M3FNUZ> to vector<2xf32>51// CHECK: [[W3:%.+]] = vector.insert_strided_slice [[FLOAT3]], [[W2]] {offsets = [4], strides = [1]} : vector<2xf32> into vector<9xf32>52// CHECK: [[FLOAT4:%.+]] = amdgpu.ext_packed_fp8 [[IN2]][1] : vector<4xf8E4M3FNUZ> to vector<2xf32>53// CHECK: [[W4:%.+]] = vector.insert_strided_slice [[FLOAT4]], [[W3]] {offsets = [6], strides = [1]} : vector<2xf32> into vector<9xf32>54// CHECK: [[IN3:%.+]] = vector.extract_strided_slice [[V]] {offsets = [8], sizes = [1], strides = [1]} : vector<9xf8E4M3FNUZ> to vector<1xf8E4M3FNUZ>55// CHECK: [[FLOAT5:%.+]] = amdgpu.ext_packed_fp8 [[IN3]][0] : vector<1xf8E4M3FNUZ> to f3256// CHECK: [[W5:%.+]] = vector.insert [[FLOAT5]], [[W4]] [8] : f32 into vector<9xf32>57// CHECK: return [[W5]]58func.func @vector_ext_long(%v: vector<9xf8E4M3FNUZ>) -> vector<9xf32> {59  %w = arith.extf %v : vector<9xf8E4M3FNUZ> to vector<9xf32>60  return %w : vector<9xf32>61}62 63// -----64 65// CHECK-LABEL: func.func @scalar_trunc66// CHECK-SAME: ([[V:%.+]]: f16)67// CHECK: [[FLOAT:%.+]] = arith.extf [[V]] : f16 to f3268// CHECK: [[TRUNCV:%.+]] = amdgpu.packed_trunc_2xfp8 [[FLOAT]], undef into undef[word 0] : f32 to vector<4xf8E5M2FNUZ>69// CHECK: [[W:%.+]] = vector.extract [[TRUNCV]][0] : f8E5M2FNUZ from vector<4xf8E5M2FNUZ>70// CHECK: return [[W]] : f8E5M2FNUZ71func.func @scalar_trunc(%v: f16) -> f8E5M2FNUZ {72  %w = arith.truncf %v : f16 to f8E5M2FNUZ73  return %w : f8E5M2FNUZ74}75 76// No 0-D test because arith.truncf hasn't been extended to support it.77 78// -----79 80// CHECK-LABEL: func.func @vector_trunc_short81// CHECK-SAME: ([[V:%.+]]: vector<2xf64>) -> vector<2xf8E5M2FNUZ> {82// CHECK: [[V0:%.+]] = vector.extract [[V]][0]83// CHECK: [[F0:%.+]] = arith.truncf [[V0]] : f64 to f3284// CHECK: [[V1:%.+]] = vector.extract [[V]][1]85// CHECK: [[F1:%.+]] = arith.truncf [[V1]] : f64 to f3286// CHECK: [[W0:%.+]] = amdgpu.packed_trunc_2xfp8 [[F0]], [[F1]] into undef[word 0] : f32 to vector<4xf8E5M2FNUZ>87// CHECK: [[W:%.+]] = vector.extract_strided_slice [[W0]] {offsets = [0], sizes = [2], strides = [1]} : vector<4xf8E5M2FNUZ> to vector<2xf8E5M2FNUZ>88// CHECK: return [[W]] : vector<2xf8E5M2FNUZ>89func.func @vector_trunc_short(%v: vector<2xf64>) -> vector<2xf8E5M2FNUZ> {90  %w = arith.truncf %v : vector<2xf64> to vector<2xf8E5M2FNUZ>91  return %w : vector<2xf8E5M2FNUZ>92}93 94// -----95 96// CHECK-LABEL: func.func @vector_trunc_long97// CHECK-SAME: ([[V:%.+]]: vector<9xf32>)98// CHECK: [[ZEROES:%.+]] = arith.constant dense<0.000000e+00> : vector<9xf8E4M3FNUZ>99// CHECK: [[T0:%.+]] = amdgpu.packed_trunc_2xfp8 %{{.+}}, %{{.+}} into undef[word 0]100// CHECK: [[T1:%.+]] = amdgpu.packed_trunc_2xfp8 %{{.+}}, %{{.+}} into [[T0]][word 1]101// CHECK: [[W0:%.+]] = vector.insert_strided_slice [[T1]], [[ZEROES]] {offsets = [0], strides = [1]}102 103// CHECK: [[T2:%.+]] = amdgpu.packed_trunc_2xfp8 %{{.+}}, %{{.+}} into undef[word 0]104// CHECK: [[T3:%.+]] = amdgpu.packed_trunc_2xfp8 %{{.+}}, %{{.+}} into [[T2]][word 1]105// CHECK: [[W1:%.+]] = vector.insert_strided_slice [[T3]], [[W0]] {offsets = [4], strides = [1]}106 107// CHECK: [[T4:%.+]] = amdgpu.packed_trunc_2xfp8 %{{.+}}, undef into undef[word 0]108// CHECK: [[T4_SHORT:%.+]] = vector.extract_strided_slice [[T4]] {offsets = [0], sizes = [1], strides = [1]}109// CHECK: [[W:%.+]] = vector.insert_strided_slice [[T4_SHORT]], [[W1]] {offsets = [8], strides = [1]}110// CHECK: return [[W]]111func.func @vector_trunc_long(%v: vector<9xf32>) -> vector<9xf8E4M3FNUZ> {112  %w = arith.truncf %v : vector<9xf32> to vector<9xf8E4M3FNUZ>113  return %w : vector<9xf8E4M3FNUZ>114}115 116// -----117 118// CHECK-LABEL: func.func @vector_trunc_long_2d119// CHECK-SAME: ([[V:%.+]]: vector<1x9xf32>)120// CHECK: [[ZEROES:%.+]] = arith.constant dense<0.000000e+00> : vector<9xf8E4M3FNUZ>121// CHECK: [[T0:%.+]] = amdgpu.packed_trunc_2xfp8 %{{.+}}, %{{.+}} into undef[word 0]122// CHECK: [[T1:%.+]] = amdgpu.packed_trunc_2xfp8 %{{.+}}, %{{.+}} into [[T0]][word 1]123// CHECK: [[W0:%.+]] = vector.insert_strided_slice [[T1]], [[ZEROES]] {offsets = [0], strides = [1]}124 125// CHECK: [[T2:%.+]] = amdgpu.packed_trunc_2xfp8 %{{.+}}, %{{.+}} into undef[word 0]126// CHECK: [[T3:%.+]] = amdgpu.packed_trunc_2xfp8 %{{.+}}, %{{.+}} into [[T2]][word 1]127// CHECK: [[W1:%.+]] = vector.insert_strided_slice [[T3]], [[W0]] {offsets = [4], strides = [1]}128 129// CHECK: [[T4:%.+]] = amdgpu.packed_trunc_2xfp8 %{{.+}}, undef into undef[word 0]130// CHECK: [[T4_SHORT:%.+]] = vector.extract_strided_slice [[T4]] {offsets = [0], sizes = [1], strides = [1]}131// CHECK: [[W:%.+]] = vector.insert_strided_slice [[T4_SHORT]], [[W1]] {offsets = [8], strides = [1]}132// CHECK: [[RE:%.+]] = vector.shape_cast [[W]] : vector<9xf8E4M3FNUZ> to vector<1x9xf8E4M3FNUZ>133// CHECK: return [[RE]]134func.func @vector_trunc_long_2d(%v: vector<1x9xf32>) -> vector<1x9xf8E4M3FNUZ> {135  %w = arith.truncf %v : vector<1x9xf32> to vector<1x9xf8E4M3FNUZ>136  return %w : vector<1x9xf8E4M3FNUZ>137}138 139// -----140 141// CHECK-LABEL: func.func @vector_ext_long_2d142// CHECK-SAME: ([[V:%.+]]: vector<1x11xf8E4M3FNUZ>)143// CHECK: [[CST:%.+]] = arith.constant dense<0.000000e+00> : vector<11xf32>144// CHECK: [[CAST:%.+]] = vector.shape_cast [[V]] : vector<1x11xf8E4M3FNUZ> to vector<11xf8E4M3FNUZ>145// CHECK: [[V0:%.+]] = vector.extract_strided_slice [[CAST]] {offsets = [0], sizes = [4], strides = [1]}146// CHECK: [[F0:%.+]] = amdgpu.ext_packed_fp8 [[V0]][0] : vector<4xf8E4M3FNUZ> to vector<2xf32>147// CHECK: [[W0:%.+]] = vector.insert_strided_slice [[F0]], [[CST]] {offsets = [0], strides = [1]} : vector<2xf32> into vector<11xf32>148// CHECK: [[F1:%.+]] = amdgpu.ext_packed_fp8 [[V0]][1] : vector<4xf8E4M3FNUZ> to vector<2xf32>149// CHECK: [[W1:%.+]] = vector.insert_strided_slice [[F1]], [[W0]] {offsets = [2], strides = [1]} : vector<2xf32> into vector<11xf32>150 151// CHECK: [[V1:%.+]] = vector.extract_strided_slice [[CAST]] {offsets = [4], sizes = [4], strides = [1]} : vector<11xf8E4M3FNUZ> to vector<4xf8E4M3FNUZ>152// CHECK: [[F2:%.+]] = amdgpu.ext_packed_fp8 [[V1]][0] : vector<4xf8E4M3FNUZ> to vector<2xf32>153// CHECK: [[W2:%.+]] = vector.insert_strided_slice [[F2]], [[W1]] {offsets = [4], strides = [1]} : vector<2xf32> into vector<11xf32>154// CHECK: [[F3:%.+]] = amdgpu.ext_packed_fp8 [[V1]][1] : vector<4xf8E4M3FNUZ> to vector<2xf32>155// CHECK: [[W3:%.+]] = vector.insert_strided_slice [[F3]], [[W2]] {offsets = [6], strides = [1]} : vector<2xf32> into vector<11xf32>156 157// CHECK: [[V2:%.+]] = vector.extract_strided_slice [[CAST]] {offsets = [8], sizes = [3], strides = [1]} : vector<11xf8E4M3FNUZ> to vector<3xf8E4M3FNUZ>158// CHECK: [[F4:%.+]] = amdgpu.ext_packed_fp8 [[V2]][0] : vector<3xf8E4M3FNUZ> to vector<2xf32>159// CHECK: [[W4:%.+]] = vector.insert_strided_slice [[F4]], [[W3]] {offsets = [8], strides = [1]} : vector<2xf32> into vector<11xf32>160// CHECK: [[F5:%.+]] = amdgpu.ext_packed_fp8 [[V2]][2] : vector<3xf8E4M3FNUZ> to f32161// CHECK: [[W5:%.+]] = vector.insert [[F5]], [[W4]] [10] : f32 into vector<11xf32>162// CHECK: [[CAST:%.+]] = vector.shape_cast [[W5]] : vector<11xf32> to vector<1x11xf32>163// CHECK: return [[CAST]]164func.func @vector_ext_long_2d(%v: vector<1x11xf8E4M3FNUZ>) -> vector<1x11xf32> {165  %w = arith.extf %v : vector<1x11xf8E4M3FNUZ> to vector<1x11xf32>166  return %w : vector<1x11xf32>167}168