@@ -154,11 +154,12 @@ static DecodeStatus decodeSrcOp(MCInst &Inst, unsigned EncSize,
154
154
AMDGPUDisassembler::OpWidthTy OpWidth,
155
155
unsigned Imm, unsigned EncImm,
156
156
bool MandatoryLiteral, unsigned ImmWidth,
157
+ AMDGPU::OperandSemantics Sema,
157
158
const MCDisassembler *Decoder) {
158
159
assert (Imm < (1U << EncSize) && " Operand doesn't fit encoding!" );
159
160
auto DAsm = static_cast <const AMDGPUDisassembler *>(Decoder);
160
- return addOperand (
161
- Inst, DAsm-> decodeSrcOp (OpWidth, EncImm, MandatoryLiteral, ImmWidth));
161
+ return addOperand (Inst, DAsm-> decodeSrcOp (OpWidth, EncImm, MandatoryLiteral,
162
+ ImmWidth, Sema ));
162
163
}
163
164
164
165
// Decoder for registers. Imm(7-bit) is number of register, uses decodeSrcOp to
@@ -174,15 +175,16 @@ template <AMDGPUDisassembler::OpWidthTy OpWidth>
174
175
static DecodeStatus decodeAV10(MCInst &Inst, unsigned Imm, uint64_t /* Addr */ ,
175
176
const MCDisassembler *Decoder) {
176
177
return decodeSrcOp (Inst, 10 , OpWidth, Imm, Imm | AMDGPU::EncValues::IS_VGPR,
177
- false , 0 , Decoder);
178
+ false , 0 , AMDGPU::OperandSemantics::INT, Decoder);
178
179
}
179
180
180
181
// Decoder for Src(9-bit encoding) registers only.
181
182
template <AMDGPUDisassembler::OpWidthTy OpWidth>
182
183
static DecodeStatus decodeSrcReg9 (MCInst &Inst, unsigned Imm,
183
184
uint64_t /* Addr */ ,
184
185
const MCDisassembler *Decoder) {
185
- return decodeSrcOp (Inst, 9 , OpWidth, Imm, Imm, false , 0 , Decoder);
186
+ return decodeSrcOp (Inst, 9 , OpWidth, Imm, Imm, false , 0 ,
187
+ AMDGPU::OperandSemantics::INT, Decoder);
186
188
}
187
189
188
190
// Decoder for Src(9-bit encoding) AGPR, register number encoded in 9bits, set
@@ -191,7 +193,8 @@ static DecodeStatus decodeSrcReg9(MCInst &Inst, unsigned Imm,
191
193
template <AMDGPUDisassembler::OpWidthTy OpWidth>
192
194
static DecodeStatus decodeSrcA9 (MCInst &Inst, unsigned Imm, uint64_t /* Addr */ ,
193
195
const MCDisassembler *Decoder) {
194
- return decodeSrcOp (Inst, 9 , OpWidth, Imm, Imm | 512 , false , 0 , Decoder);
196
+ return decodeSrcOp (Inst, 9 , OpWidth, Imm, Imm | 512 , false , 0 ,
197
+ AMDGPU::OperandSemantics::INT, Decoder);
195
198
}
196
199
197
200
// Decoder for 'enum10' from decodeSrcOp, Imm{0-8} is 9-bit Src encoding
@@ -200,36 +203,42 @@ template <AMDGPUDisassembler::OpWidthTy OpWidth>
200
203
static DecodeStatus decodeSrcAV10 (MCInst &Inst, unsigned Imm,
201
204
uint64_t /* Addr */ ,
202
205
const MCDisassembler *Decoder) {
203
- return decodeSrcOp (Inst, 10 , OpWidth, Imm, Imm, false , 0 , Decoder);
206
+ return decodeSrcOp (Inst, 10 , OpWidth, Imm, Imm, false , 0 ,
207
+ AMDGPU::OperandSemantics::INT, Decoder);
204
208
}
205
209
206
210
// Decoder for RegisterOperands using 9-bit Src encoding. Operand can be
207
211
// register from RegClass or immediate. Registers that don't belong to RegClass
208
212
// will be decoded and InstPrinter will report warning. Immediate will be
209
213
// decoded into constant of size ImmWidth, should match width of immediate used
210
214
// by OperandType (important for floating point types).
211
- template <AMDGPUDisassembler::OpWidthTy OpWidth, unsigned ImmWidth>
215
+ template <AMDGPUDisassembler::OpWidthTy OpWidth, unsigned ImmWidth,
216
+ unsigned OperandSemantics>
212
217
static DecodeStatus decodeSrcRegOrImm9 (MCInst &Inst, unsigned Imm,
213
218
uint64_t /* Addr */ ,
214
219
const MCDisassembler *Decoder) {
215
- return decodeSrcOp (Inst, 9 , OpWidth, Imm, Imm, false , ImmWidth, Decoder);
220
+ return decodeSrcOp (Inst, 9 , OpWidth, Imm, Imm, false , ImmWidth,
221
+ (AMDGPU::OperandSemantics)OperandSemantics, Decoder);
216
222
}
217
223
218
224
// Decoder for Src(9-bit encoding) AGPR or immediate. Set Imm{9} to 1 (set acc)
219
225
// and decode using 'enum10' from decodeSrcOp.
220
- template <AMDGPUDisassembler::OpWidthTy OpWidth, unsigned ImmWidth>
226
+ template <AMDGPUDisassembler::OpWidthTy OpWidth, unsigned ImmWidth,
227
+ unsigned OperandSemantics>
221
228
static DecodeStatus decodeSrcRegOrImmA9 (MCInst &Inst, unsigned Imm,
222
229
uint64_t /* Addr */ ,
223
230
const MCDisassembler *Decoder) {
224
231
return decodeSrcOp (Inst, 9 , OpWidth, Imm, Imm | 512 , false , ImmWidth,
225
- Decoder);
232
+ (AMDGPU::OperandSemantics)OperandSemantics, Decoder);
226
233
}
227
234
228
- template <AMDGPUDisassembler::OpWidthTy OpWidth, unsigned ImmWidth>
235
+ template <AMDGPUDisassembler::OpWidthTy OpWidth, unsigned ImmWidth,
236
+ unsigned OperandSemantics>
229
237
static DecodeStatus decodeSrcRegOrImmDeferred9 (MCInst &Inst, unsigned Imm,
230
238
uint64_t /* Addr */ ,
231
239
const MCDisassembler *Decoder) {
232
- return decodeSrcOp (Inst, 9 , OpWidth, Imm, Imm, true , ImmWidth, Decoder);
240
+ return decodeSrcOp (Inst, 9 , OpWidth, Imm, Imm, true , ImmWidth,
241
+ (AMDGPU::OperandSemantics)OperandSemantics, Decoder);
233
242
}
234
243
235
244
// Default decoders generated by tablegen: 'Decode<RegClass>RegisterClass'
@@ -394,8 +403,9 @@ static DecodeStatus decodeOperand_VSrc_f64(MCInst &Inst, unsigned Imm,
394
403
const MCDisassembler *Decoder) {
395
404
assert (Imm < (1 << 9 ) && " 9-bit encoding" );
396
405
auto DAsm = static_cast <const AMDGPUDisassembler *>(Decoder);
397
- return addOperand (
398
- Inst, DAsm->decodeSrcOp (AMDGPUDisassembler::OPW64, Imm, false , 64 , true ));
406
+ return addOperand (Inst,
407
+ DAsm->decodeSrcOp (AMDGPUDisassembler::OPW64, Imm, false , 64 ,
408
+ AMDGPU::OperandSemantics::FP64));
399
409
}
400
410
401
411
#define DECODE_SDWA (DecName ) \
@@ -1414,7 +1424,7 @@ static int64_t getInlineImmVal64(unsigned Imm) {
1414
1424
}
1415
1425
}
1416
1426
1417
- static int64_t getInlineImmVal16 (unsigned Imm) {
1427
+ static int64_t getInlineImmValF16 (unsigned Imm) {
1418
1428
switch (Imm) {
1419
1429
case 240 :
1420
1430
return 0x3800 ;
@@ -1439,9 +1449,40 @@ static int64_t getInlineImmVal16(unsigned Imm) {
1439
1449
}
1440
1450
}
1441
1451
1442
- MCOperand AMDGPUDisassembler::decodeFPImmed (unsigned ImmWidth, unsigned Imm) {
1443
- assert (Imm >= AMDGPU::EncValues::INLINE_FLOATING_C_MIN
1444
- && Imm <= AMDGPU::EncValues::INLINE_FLOATING_C_MAX);
1452
+ static int64_t getInlineImmValBF16 (unsigned Imm) {
1453
+ switch (Imm) {
1454
+ case 240 :
1455
+ return 0x3F00 ;
1456
+ case 241 :
1457
+ return 0xBF00 ;
1458
+ case 242 :
1459
+ return 0x3F80 ;
1460
+ case 243 :
1461
+ return 0xBF80 ;
1462
+ case 244 :
1463
+ return 0x4000 ;
1464
+ case 245 :
1465
+ return 0xC000 ;
1466
+ case 246 :
1467
+ return 0x4080 ;
1468
+ case 247 :
1469
+ return 0xC080 ;
1470
+ case 248 : // 1 / (2 * PI)
1471
+ return 0x3E22 ;
1472
+ default :
1473
+ llvm_unreachable (" invalid fp inline imm" );
1474
+ }
1475
+ }
1476
+
1477
+ static int64_t getInlineImmVal16 (unsigned Imm, AMDGPU::OperandSemantics Sema) {
1478
+ return (Sema == AMDGPU::OperandSemantics::BF16) ? getInlineImmValBF16 (Imm)
1479
+ : getInlineImmValF16 (Imm);
1480
+ }
1481
+
1482
+ MCOperand AMDGPUDisassembler::decodeFPImmed (unsigned ImmWidth, unsigned Imm,
1483
+ AMDGPU::OperandSemantics Sema) {
1484
+ assert (Imm >= AMDGPU::EncValues::INLINE_FLOATING_C_MIN &&
1485
+ Imm <= AMDGPU::EncValues::INLINE_FLOATING_C_MAX);
1445
1486
1446
1487
// ToDo: case 248: 1/(2*PI) - is allowed only on VI
1447
1488
// ImmWidth 0 is a default case where operand should not allow immediates.
@@ -1454,7 +1495,7 @@ MCOperand AMDGPUDisassembler::decodeFPImmed(unsigned ImmWidth, unsigned Imm) {
1454
1495
case 64 :
1455
1496
return MCOperand::createImm (getInlineImmVal64 (Imm));
1456
1497
case 16 :
1457
- return MCOperand::createImm (getInlineImmVal16 (Imm));
1498
+ return MCOperand::createImm (getInlineImmVal16 (Imm, Sema ));
1458
1499
default :
1459
1500
llvm_unreachable (" implement me" );
1460
1501
}
@@ -1568,7 +1609,8 @@ int AMDGPUDisassembler::getTTmpIdx(unsigned Val) const {
1568
1609
1569
1610
MCOperand AMDGPUDisassembler::decodeSrcOp (const OpWidthTy Width, unsigned Val,
1570
1611
bool MandatoryLiteral,
1571
- unsigned ImmWidth, bool IsFP) const {
1612
+ unsigned ImmWidth,
1613
+ AMDGPU::OperandSemantics Sema) const {
1572
1614
using namespace AMDGPU ::EncValues;
1573
1615
1574
1616
assert (Val < 1024 ); // enum10
@@ -1581,14 +1623,13 @@ MCOperand AMDGPUDisassembler::decodeSrcOp(const OpWidthTy Width, unsigned Val,
1581
1623
: getVgprClassId (Width), Val - VGPR_MIN);
1582
1624
}
1583
1625
return decodeNonVGPRSrcOp (Width, Val & 0xFF , MandatoryLiteral, ImmWidth,
1584
- IsFP );
1626
+ Sema );
1585
1627
}
1586
1628
1587
- MCOperand AMDGPUDisassembler::decodeNonVGPRSrcOp (const OpWidthTy Width,
1588
- unsigned Val,
1589
- bool MandatoryLiteral,
1590
- unsigned ImmWidth,
1591
- bool IsFP) const {
1629
+ MCOperand
1630
+ AMDGPUDisassembler::decodeNonVGPRSrcOp (const OpWidthTy Width, unsigned Val,
1631
+ bool MandatoryLiteral, unsigned ImmWidth,
1632
+ AMDGPU::OperandSemantics Sema) const {
1592
1633
// Cases when Val{8} is 1 (vgpr, agpr or true 16 vgpr) should have been
1593
1634
// decoded earlier.
1594
1635
assert (Val < (1 << 8 ) && " 9-bit Src encoding when Val{8} is 0" );
@@ -1609,14 +1650,14 @@ MCOperand AMDGPUDisassembler::decodeNonVGPRSrcOp(const OpWidthTy Width,
1609
1650
return decodeIntImmed (Val);
1610
1651
1611
1652
if (INLINE_FLOATING_C_MIN <= Val && Val <= INLINE_FLOATING_C_MAX)
1612
- return decodeFPImmed (ImmWidth, Val);
1653
+ return decodeFPImmed (ImmWidth, Val, Sema );
1613
1654
1614
1655
if (Val == LITERAL_CONST) {
1615
1656
if (MandatoryLiteral)
1616
1657
// Keep a sentinel value for deferred setting
1617
1658
return MCOperand::createImm (LITERAL_CONST);
1618
1659
else
1619
- return decodeLiteralConstant (IsFP && ImmWidth == 64 );
1660
+ return decodeLiteralConstant (Sema == AMDGPU::OperandSemantics::FP64 );
1620
1661
}
1621
1662
1622
1663
switch (Width) {
@@ -1713,9 +1754,10 @@ MCOperand AMDGPUDisassembler::decodeSpecialReg64(unsigned Val) const {
1713
1754
return errOperand (Val, " unknown operand encoding " + Twine (Val));
1714
1755
}
1715
1756
1716
- MCOperand AMDGPUDisassembler::decodeSDWASrc (const OpWidthTy Width,
1717
- const unsigned Val,
1718
- unsigned ImmWidth) const {
1757
+ MCOperand
1758
+ AMDGPUDisassembler::decodeSDWASrc (const OpWidthTy Width, const unsigned Val,
1759
+ unsigned ImmWidth,
1760
+ AMDGPU::OperandSemantics Sema) const {
1719
1761
using namespace AMDGPU ::SDWA;
1720
1762
using namespace AMDGPU ::EncValues;
1721
1763
@@ -1746,7 +1788,7 @@ MCOperand AMDGPUDisassembler::decodeSDWASrc(const OpWidthTy Width,
1746
1788
return decodeIntImmed (SVal);
1747
1789
1748
1790
if (INLINE_FLOATING_C_MIN <= SVal && SVal <= INLINE_FLOATING_C_MAX)
1749
- return decodeFPImmed (ImmWidth, SVal);
1791
+ return decodeFPImmed (ImmWidth, SVal, Sema );
1750
1792
1751
1793
return decodeSpecialReg32 (SVal);
1752
1794
} else if (STI.hasFeature (AMDGPU::FeatureVolcanicIslands)) {
@@ -1756,11 +1798,11 @@ MCOperand AMDGPUDisassembler::decodeSDWASrc(const OpWidthTy Width,
1756
1798
}
1757
1799
1758
1800
MCOperand AMDGPUDisassembler::decodeSDWASrc16 (unsigned Val) const {
1759
- return decodeSDWASrc (OPW16, Val, 16 );
1801
+ return decodeSDWASrc (OPW16, Val, 16 , AMDGPU::OperandSemantics::FP16 );
1760
1802
}
1761
1803
1762
1804
MCOperand AMDGPUDisassembler::decodeSDWASrc32 (unsigned Val) const {
1763
- return decodeSDWASrc (OPW32, Val, 32 );
1805
+ return decodeSDWASrc (OPW32, Val, 32 , AMDGPU::OperandSemantics::FP32 );
1764
1806
}
1765
1807
1766
1808
MCOperand AMDGPUDisassembler::decodeSDWAVopcDst (unsigned Val) const {
0 commit comments