@@ -5234,6 +5234,32 @@ multiclass FPToIntegerUnscaled<bits<2> rmode, bits<3> opcode, string asm,
52345234 }
52355235}
52365236
5237+ multiclass FPToIntegerSIMDScalar<bits<2> rmode, bits<3> opcode, string asm> {
5238+ // double-precision to 32-bit SIMD/FPR
5239+ def SDr : BaseFPToIntegerUnscaled<0b01, rmode, opcode, FPR64, FPR32, asm,
5240+ []> {
5241+ let Inst{31} = 0; // 32-bit FPR flag
5242+ }
5243+
5244+ // half-precision to 32-bit SIMD/FPR
5245+ def SHr : BaseFPToIntegerUnscaled<0b11, rmode, opcode, FPR16, FPR32, asm,
5246+ []> {
5247+ let Inst{31} = 0; // 32-bit FPR flag
5248+ }
5249+
5250+ // half-precision to 64-bit SIMD/FPR
5251+ def DHr : BaseFPToIntegerUnscaled<0b11, rmode, opcode, FPR16, FPR64, asm,
5252+ []> {
5253+ let Inst{31} = 1; // 64-bit FPR flag
5254+ }
5255+
5256+ // single-precision to 64-bit SIMD/FPR
5257+ def DSr : BaseFPToIntegerUnscaled<0b00, rmode, opcode, FPR32, FPR64, asm,
5258+ []> {
5259+ let Inst{31} = 1; // 64-bit FPR flag
5260+ }
5261+ }
5262+
52375263multiclass FPToIntegerScaled<bits<2> rmode, bits<3> opcode, string asm,
52385264 SDPatternOperator OpN> {
52395265 // Scaled half-precision to 32-bit
@@ -5295,7 +5321,7 @@ multiclass FPToIntegerScaled<bits<2> rmode, bits<3> opcode, string asm,
52955321//---
52965322
52975323let mayStore = 0, mayLoad = 0, hasSideEffects = 0, mayRaiseFPException = 1, Uses = [FPCR] in
5298- class BaseIntegerToFP<bit isUnsigned ,
5324+ class BaseIntegerToFP<bits<2> rmode, bits<3> opcode ,
52995325 RegisterClass srcType, RegisterClass dstType,
53005326 Operand immType, string asm, list<dag> pattern>
53015327 : I<(outs dstType:$Rd), (ins srcType:$Rn, immType:$scale),
@@ -5305,15 +5331,16 @@ class BaseIntegerToFP<bit isUnsigned,
53055331 bits<5> Rn;
53065332 bits<6> scale;
53075333 let Inst{30-24} = 0b0011110;
5308- let Inst{21-17} = 0b00001;
5309- let Inst{16} = isUnsigned;
5334+ let Inst{21} = 0b0;
5335+ let Inst{20-19} = rmode;
5336+ let Inst{18-16} = opcode;
53105337 let Inst{15-10} = scale;
53115338 let Inst{9-5} = Rn;
53125339 let Inst{4-0} = Rd;
53135340}
53145341
53155342let mayRaiseFPException = 1, Uses = [FPCR] in
5316- class BaseIntegerToFPUnscaled<bit isUnsigned ,
5343+ class BaseIntegerToFPUnscaled<bits<2> rmode, bits<3> opcode ,
53175344 RegisterClass srcType, RegisterClass dstType,
53185345 ValueType dvt, string asm, SDPatternOperator node>
53195346 : I<(outs dstType:$Rd), (ins srcType:$Rn),
@@ -5323,49 +5350,50 @@ class BaseIntegerToFPUnscaled<bit isUnsigned,
53235350 bits<5> Rn;
53245351 bits<6> scale;
53255352 let Inst{30-24} = 0b0011110;
5326- let Inst{21-17} = 0b10001;
5327- let Inst{16} = isUnsigned;
5353+ let Inst{21} = 0b1;
5354+ let Inst{20-19} = rmode;
5355+ let Inst{18-16} = opcode;
53285356 let Inst{15-10} = 0b000000;
53295357 let Inst{9-5} = Rn;
53305358 let Inst{4-0} = Rd;
53315359}
53325360
5333- multiclass IntegerToFP<bit isUnsigned , string asm, SDPatternOperator node> {
5361+ multiclass IntegerToFP<bits<2> rmode, bits<3> opcode , string asm, SDPatternOperator node> {
53345362 // Unscaled
5335- def UWHri: BaseIntegerToFPUnscaled<isUnsigned , GPR32, FPR16, f16, asm, node> {
5363+ def UWHri: BaseIntegerToFPUnscaled<rmode, opcode , GPR32, FPR16, f16, asm, node> {
53365364 let Inst{31} = 0; // 32-bit GPR flag
53375365 let Inst{23-22} = 0b11; // 16-bit FPR flag
53385366 let Predicates = [HasFullFP16];
53395367 }
53405368
5341- def UWSri: BaseIntegerToFPUnscaled<isUnsigned , GPR32, FPR32, f32, asm, node> {
5369+ def UWSri: BaseIntegerToFPUnscaled<rmode, opcode , GPR32, FPR32, f32, asm, node> {
53425370 let Inst{31} = 0; // 32-bit GPR flag
53435371 let Inst{23-22} = 0b00; // 32-bit FPR flag
53445372 }
53455373
5346- def UWDri: BaseIntegerToFPUnscaled<isUnsigned , GPR32, FPR64, f64, asm, node> {
5374+ def UWDri: BaseIntegerToFPUnscaled<rmode, opcode , GPR32, FPR64, f64, asm, node> {
53475375 let Inst{31} = 0; // 32-bit GPR flag
53485376 let Inst{23-22} = 0b01; // 64-bit FPR flag
53495377 }
53505378
5351- def UXHri: BaseIntegerToFPUnscaled<isUnsigned , GPR64, FPR16, f16, asm, node> {
5379+ def UXHri: BaseIntegerToFPUnscaled<rmode, opcode , GPR64, FPR16, f16, asm, node> {
53525380 let Inst{31} = 1; // 64-bit GPR flag
53535381 let Inst{23-22} = 0b11; // 16-bit FPR flag
53545382 let Predicates = [HasFullFP16];
53555383 }
53565384
5357- def UXSri: BaseIntegerToFPUnscaled<isUnsigned , GPR64, FPR32, f32, asm, node> {
5385+ def UXSri: BaseIntegerToFPUnscaled<rmode, opcode , GPR64, FPR32, f32, asm, node> {
53585386 let Inst{31} = 1; // 64-bit GPR flag
53595387 let Inst{23-22} = 0b00; // 32-bit FPR flag
53605388 }
53615389
5362- def UXDri: BaseIntegerToFPUnscaled<isUnsigned , GPR64, FPR64, f64, asm, node> {
5390+ def UXDri: BaseIntegerToFPUnscaled<rmode, opcode , GPR64, FPR64, f64, asm, node> {
53635391 let Inst{31} = 1; // 64-bit GPR flag
53645392 let Inst{23-22} = 0b01; // 64-bit FPR flag
53655393 }
53665394
53675395 // Scaled
5368- def SWHri: BaseIntegerToFP<isUnsigned , GPR32, FPR16, fixedpoint_recip_f16_i32, asm,
5396+ def SWHri: BaseIntegerToFP<rmode, opcode , GPR32, FPR16, fixedpoint_recip_f16_i32, asm,
53695397 [(set (f16 FPR16:$Rd),
53705398 (fmul (node GPR32:$Rn),
53715399 fixedpoint_recip_f16_i32:$scale))]> {
@@ -5375,7 +5403,7 @@ multiclass IntegerToFP<bit isUnsigned, string asm, SDPatternOperator node> {
53755403 let Predicates = [HasFullFP16];
53765404 }
53775405
5378- def SWSri: BaseIntegerToFP<isUnsigned , GPR32, FPR32, fixedpoint_recip_f32_i32, asm,
5406+ def SWSri: BaseIntegerToFP<rmode, opcode , GPR32, FPR32, fixedpoint_recip_f32_i32, asm,
53795407 [(set FPR32:$Rd,
53805408 (fmul (node GPR32:$Rn),
53815409 fixedpoint_recip_f32_i32:$scale))]> {
@@ -5384,7 +5412,7 @@ multiclass IntegerToFP<bit isUnsigned, string asm, SDPatternOperator node> {
53845412 let scale{5} = 1;
53855413 }
53865414
5387- def SWDri: BaseIntegerToFP<isUnsigned , GPR32, FPR64, fixedpoint_recip_f64_i32, asm,
5415+ def SWDri: BaseIntegerToFP<rmode, opcode , GPR32, FPR64, fixedpoint_recip_f64_i32, asm,
53885416 [(set FPR64:$Rd,
53895417 (fmul (node GPR32:$Rn),
53905418 fixedpoint_recip_f64_i32:$scale))]> {
@@ -5393,7 +5421,7 @@ multiclass IntegerToFP<bit isUnsigned, string asm, SDPatternOperator node> {
53935421 let scale{5} = 1;
53945422 }
53955423
5396- def SXHri: BaseIntegerToFP<isUnsigned , GPR64, FPR16, fixedpoint_recip_f16_i64, asm,
5424+ def SXHri: BaseIntegerToFP<rmode, opcode , GPR64, FPR16, fixedpoint_recip_f16_i64, asm,
53975425 [(set (f16 FPR16:$Rd),
53985426 (fmul (node GPR64:$Rn),
53995427 fixedpoint_recip_f16_i64:$scale))]> {
@@ -5402,15 +5430,15 @@ multiclass IntegerToFP<bit isUnsigned, string asm, SDPatternOperator node> {
54025430 let Predicates = [HasFullFP16];
54035431 }
54045432
5405- def SXSri: BaseIntegerToFP<isUnsigned , GPR64, FPR32, fixedpoint_recip_f32_i64, asm,
5433+ def SXSri: BaseIntegerToFP<rmode, opcode , GPR64, FPR32, fixedpoint_recip_f32_i64, asm,
54065434 [(set FPR32:$Rd,
54075435 (fmul (node GPR64:$Rn),
54085436 fixedpoint_recip_f32_i64:$scale))]> {
54095437 let Inst{31} = 1; // 64-bit GPR flag
54105438 let Inst{23-22} = 0b00; // 32-bit FPR flag
54115439 }
54125440
5413- def SXDri: BaseIntegerToFP<isUnsigned , GPR64, FPR64, fixedpoint_recip_f64_i64, asm,
5441+ def SXDri: BaseIntegerToFP<rmode, opcode , GPR64, FPR64, fixedpoint_recip_f64_i64, asm,
54145442 [(set FPR64:$Rd,
54155443 (fmul (node GPR64:$Rn),
54165444 fixedpoint_recip_f64_i64:$scale))]> {
@@ -5419,6 +5447,32 @@ multiclass IntegerToFP<bit isUnsigned, string asm, SDPatternOperator node> {
54195447 }
54205448}
54215449
5450+ multiclass IntegerToFPSIMDScalar<bits<2> rmode, bits<3> opcode, string asm, SDPatternOperator node = null_frag> {
5451+ // 32-bit to half-precision
5452+ def HSr: BaseIntegerToFPUnscaled<rmode, opcode, FPR32, FPR16, f16, asm, node> {
5453+ let Inst{31} = 0; // 32-bit FPR flag
5454+ let Inst{23-22} = 0b11; // 16-bit FPR flag
5455+ }
5456+
5457+ // 32-bit to double-precision
5458+ def DSr: BaseIntegerToFPUnscaled<rmode, opcode, FPR32, FPR64, f64, asm, node> {
5459+ let Inst{31} = 0; // 32-bit FPR flag
5460+ let Inst{23-22} = 0b01; // 64-bit FPR flag
5461+ }
5462+
5463+ // 64-bit to half-precision
5464+ def HDr: BaseIntegerToFPUnscaled<rmode, opcode, FPR64, FPR16, f16, asm, node> {
5465+ let Inst{31} = 1; // 64-bit FPR flag
5466+ let Inst{23-22} = 0b11; // 16-bit FPR flag
5467+ }
5468+
5469+ // 64-bit to single-precision
5470+ def SDr: BaseIntegerToFPUnscaled<rmode, opcode, FPR64, FPR32, f32, asm, node> {
5471+ let Inst{31} = 1; // 64-bit FPR flag
5472+ let Inst{23-22} = 0b00; // 32-bit FPR flag
5473+ }
5474+ }
5475+
54225476//---
54235477// Unscaled integer <-> floating point conversion (i.e. FMOV)
54245478//---
@@ -13126,3 +13180,20 @@ multiclass AtomicFPStore<bit R, bits<3> op0, string asm> {
1312613180 def S : BaseAtomicFPStore<FPR32, 0b10, R, op0, asm>;
1312713181 def H : BaseAtomicFPStore<FPR16, 0b01, R, op0, asm>;
1312813182}
13183+
13184+ class BaseSIMDThreeSameVectorFP8MatrixMul<string asm, bits<2> size, string kind>
13185+ : BaseSIMDThreeSameVectorTied<1, 1, {size, 0}, 0b11101,
13186+ V128, asm, ".16b", []> {
13187+ let AsmString = !strconcat(asm, "{\t$Rd", kind, ", $Rn", ".16b",
13188+ ", $Rm", ".16b", "}");
13189+ }
13190+
13191+ multiclass SIMDThreeSameVectorFP8MatrixMul<string asm>{
13192+ def v8f16: BaseSIMDThreeSameVectorFP8MatrixMul<asm, 0b00, ".8h">{
13193+ let Predicates = [HasNEON, HasF8F16MM];
13194+ }
13195+ def v4f32: BaseSIMDThreeSameVectorFP8MatrixMul<asm, 0b10, ".4s">{
13196+ let Predicates = [HasNEON, HasF8F32MM];
13197+ }
13198+ }
13199+
0 commit comments