@@ -5234,6 +5234,32 @@ multiclass FPToIntegerUnscaled<bits<2> rmode, bits<3> opcode, string asm,
5234
5234
}
5235
5235
}
5236
5236
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
+
5237
5263
multiclass FPToIntegerScaled<bits<2> rmode, bits<3> opcode, string asm,
5238
5264
SDPatternOperator OpN> {
5239
5265
// Scaled half-precision to 32-bit
@@ -5295,7 +5321,7 @@ multiclass FPToIntegerScaled<bits<2> rmode, bits<3> opcode, string asm,
5295
5321
//---
5296
5322
5297
5323
let 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 ,
5299
5325
RegisterClass srcType, RegisterClass dstType,
5300
5326
Operand immType, string asm, list<dag> pattern>
5301
5327
: I<(outs dstType:$Rd), (ins srcType:$Rn, immType:$scale),
@@ -5305,15 +5331,16 @@ class BaseIntegerToFP<bit isUnsigned,
5305
5331
bits<5> Rn;
5306
5332
bits<6> scale;
5307
5333
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;
5310
5337
let Inst{15-10} = scale;
5311
5338
let Inst{9-5} = Rn;
5312
5339
let Inst{4-0} = Rd;
5313
5340
}
5314
5341
5315
5342
let mayRaiseFPException = 1, Uses = [FPCR] in
5316
- class BaseIntegerToFPUnscaled<bit isUnsigned ,
5343
+ class BaseIntegerToFPUnscaled<bits<2> rmode, bits<3> opcode ,
5317
5344
RegisterClass srcType, RegisterClass dstType,
5318
5345
ValueType dvt, string asm, SDPatternOperator node>
5319
5346
: I<(outs dstType:$Rd), (ins srcType:$Rn),
@@ -5323,49 +5350,50 @@ class BaseIntegerToFPUnscaled<bit isUnsigned,
5323
5350
bits<5> Rn;
5324
5351
bits<6> scale;
5325
5352
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;
5328
5356
let Inst{15-10} = 0b000000;
5329
5357
let Inst{9-5} = Rn;
5330
5358
let Inst{4-0} = Rd;
5331
5359
}
5332
5360
5333
- multiclass IntegerToFP<bit isUnsigned , string asm, SDPatternOperator node> {
5361
+ multiclass IntegerToFP<bits<2> rmode, bits<3> opcode , string asm, SDPatternOperator node> {
5334
5362
// Unscaled
5335
- def UWHri: BaseIntegerToFPUnscaled<isUnsigned , GPR32, FPR16, f16, asm, node> {
5363
+ def UWHri: BaseIntegerToFPUnscaled<rmode, opcode , GPR32, FPR16, f16, asm, node> {
5336
5364
let Inst{31} = 0; // 32-bit GPR flag
5337
5365
let Inst{23-22} = 0b11; // 16-bit FPR flag
5338
5366
let Predicates = [HasFullFP16];
5339
5367
}
5340
5368
5341
- def UWSri: BaseIntegerToFPUnscaled<isUnsigned , GPR32, FPR32, f32, asm, node> {
5369
+ def UWSri: BaseIntegerToFPUnscaled<rmode, opcode , GPR32, FPR32, f32, asm, node> {
5342
5370
let Inst{31} = 0; // 32-bit GPR flag
5343
5371
let Inst{23-22} = 0b00; // 32-bit FPR flag
5344
5372
}
5345
5373
5346
- def UWDri: BaseIntegerToFPUnscaled<isUnsigned , GPR32, FPR64, f64, asm, node> {
5374
+ def UWDri: BaseIntegerToFPUnscaled<rmode, opcode , GPR32, FPR64, f64, asm, node> {
5347
5375
let Inst{31} = 0; // 32-bit GPR flag
5348
5376
let Inst{23-22} = 0b01; // 64-bit FPR flag
5349
5377
}
5350
5378
5351
- def UXHri: BaseIntegerToFPUnscaled<isUnsigned , GPR64, FPR16, f16, asm, node> {
5379
+ def UXHri: BaseIntegerToFPUnscaled<rmode, opcode , GPR64, FPR16, f16, asm, node> {
5352
5380
let Inst{31} = 1; // 64-bit GPR flag
5353
5381
let Inst{23-22} = 0b11; // 16-bit FPR flag
5354
5382
let Predicates = [HasFullFP16];
5355
5383
}
5356
5384
5357
- def UXSri: BaseIntegerToFPUnscaled<isUnsigned , GPR64, FPR32, f32, asm, node> {
5385
+ def UXSri: BaseIntegerToFPUnscaled<rmode, opcode , GPR64, FPR32, f32, asm, node> {
5358
5386
let Inst{31} = 1; // 64-bit GPR flag
5359
5387
let Inst{23-22} = 0b00; // 32-bit FPR flag
5360
5388
}
5361
5389
5362
- def UXDri: BaseIntegerToFPUnscaled<isUnsigned , GPR64, FPR64, f64, asm, node> {
5390
+ def UXDri: BaseIntegerToFPUnscaled<rmode, opcode , GPR64, FPR64, f64, asm, node> {
5363
5391
let Inst{31} = 1; // 64-bit GPR flag
5364
5392
let Inst{23-22} = 0b01; // 64-bit FPR flag
5365
5393
}
5366
5394
5367
5395
// 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,
5369
5397
[(set (f16 FPR16:$Rd),
5370
5398
(fmul (node GPR32:$Rn),
5371
5399
fixedpoint_recip_f16_i32:$scale))]> {
@@ -5375,7 +5403,7 @@ multiclass IntegerToFP<bit isUnsigned, string asm, SDPatternOperator node> {
5375
5403
let Predicates = [HasFullFP16];
5376
5404
}
5377
5405
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,
5379
5407
[(set FPR32:$Rd,
5380
5408
(fmul (node GPR32:$Rn),
5381
5409
fixedpoint_recip_f32_i32:$scale))]> {
@@ -5384,7 +5412,7 @@ multiclass IntegerToFP<bit isUnsigned, string asm, SDPatternOperator node> {
5384
5412
let scale{5} = 1;
5385
5413
}
5386
5414
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,
5388
5416
[(set FPR64:$Rd,
5389
5417
(fmul (node GPR32:$Rn),
5390
5418
fixedpoint_recip_f64_i32:$scale))]> {
@@ -5393,7 +5421,7 @@ multiclass IntegerToFP<bit isUnsigned, string asm, SDPatternOperator node> {
5393
5421
let scale{5} = 1;
5394
5422
}
5395
5423
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,
5397
5425
[(set (f16 FPR16:$Rd),
5398
5426
(fmul (node GPR64:$Rn),
5399
5427
fixedpoint_recip_f16_i64:$scale))]> {
@@ -5402,15 +5430,15 @@ multiclass IntegerToFP<bit isUnsigned, string asm, SDPatternOperator node> {
5402
5430
let Predicates = [HasFullFP16];
5403
5431
}
5404
5432
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,
5406
5434
[(set FPR32:$Rd,
5407
5435
(fmul (node GPR64:$Rn),
5408
5436
fixedpoint_recip_f32_i64:$scale))]> {
5409
5437
let Inst{31} = 1; // 64-bit GPR flag
5410
5438
let Inst{23-22} = 0b00; // 32-bit FPR flag
5411
5439
}
5412
5440
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,
5414
5442
[(set FPR64:$Rd,
5415
5443
(fmul (node GPR64:$Rn),
5416
5444
fixedpoint_recip_f64_i64:$scale))]> {
@@ -5419,6 +5447,32 @@ multiclass IntegerToFP<bit isUnsigned, string asm, SDPatternOperator node> {
5419
5447
}
5420
5448
}
5421
5449
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
+
5422
5476
//---
5423
5477
// Unscaled integer <-> floating point conversion (i.e. FMOV)
5424
5478
//---
@@ -13126,3 +13180,20 @@ multiclass AtomicFPStore<bit R, bits<3> op0, string asm> {
13126
13180
def S : BaseAtomicFPStore<FPR32, 0b10, R, op0, asm>;
13127
13181
def H : BaseAtomicFPStore<FPR16, 0b01, R, op0, asm>;
13128
13182
}
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