forked from OSchip/llvm-project
[AMDGPU][MC] Fix for Bugs 28201, 28199, 28170 + LIT tests
This fix enables sp3 abs modifier with constants Reviewers: artem.tamazov Differential Revision: https://reviews.llvm.org/D30825 llvm-svn: 298265
This commit is contained in:
parent
d92d2fc763
commit
1e124e1825
|
@ -951,9 +951,10 @@ public:
|
|||
OperandMatchResultTy parseStringWithPrefix(StringRef Prefix,
|
||||
StringRef &Value);
|
||||
|
||||
OperandMatchResultTy parseImm(OperandVector &Operands);
|
||||
bool parseAbsoluteExpr(int64_t &Val, bool AbsMod = false);
|
||||
OperandMatchResultTy parseImm(OperandVector &Operands, bool AbsMod = false);
|
||||
OperandMatchResultTy parseReg(OperandVector &Operands);
|
||||
OperandMatchResultTy parseRegOrImm(OperandVector &Operands);
|
||||
OperandMatchResultTy parseRegOrImm(OperandVector &Operands, bool AbsMod = false);
|
||||
OperandMatchResultTy parseRegOrImmWithFPInputMods(OperandVector &Operands, bool AllowImm = true);
|
||||
OperandMatchResultTy parseRegOrImmWithIntInputMods(OperandVector &Operands, bool AllowImm = true);
|
||||
OperandMatchResultTy parseRegWithFPInputMods(OperandVector &Operands);
|
||||
|
@ -1656,8 +1657,33 @@ std::unique_ptr<AMDGPUOperand> AMDGPUAsmParser::parseRegister() {
|
|||
return AMDGPUOperand::CreateReg(this, Reg, StartLoc, EndLoc, false);
|
||||
}
|
||||
|
||||
bool
|
||||
AMDGPUAsmParser::parseAbsoluteExpr(int64_t &Val, bool AbsMod) {
|
||||
if (AbsMod && getLexer().peekTok().is(AsmToken::Pipe) &&
|
||||
(getLexer().getKind() == AsmToken::Integer ||
|
||||
getLexer().getKind() == AsmToken::Real)) {
|
||||
|
||||
// This is a workaround for handling operands like these:
|
||||
// |1.0|
|
||||
// |-1|
|
||||
// This syntax is not compatible with syntax of standard
|
||||
// MC expressions (due to the trailing '|').
|
||||
|
||||
SMLoc EndLoc;
|
||||
const MCExpr *Expr;
|
||||
|
||||
if (getParser().parsePrimaryExpr(Expr, EndLoc)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return !Expr->evaluateAsAbsolute(Val);
|
||||
}
|
||||
|
||||
return getParser().parseAbsoluteExpression(Val);
|
||||
}
|
||||
|
||||
OperandMatchResultTy
|
||||
AMDGPUAsmParser::parseImm(OperandVector &Operands) {
|
||||
AMDGPUAsmParser::parseImm(OperandVector &Operands, bool AbsMod) {
|
||||
// TODO: add syntactic sugar for 1/(2*PI)
|
||||
bool Minus = false;
|
||||
if (getLexer().getKind() == AsmToken::Minus) {
|
||||
|
@ -1669,7 +1695,7 @@ AMDGPUAsmParser::parseImm(OperandVector &Operands) {
|
|||
switch(getLexer().getKind()) {
|
||||
case AsmToken::Integer: {
|
||||
int64_t IntVal;
|
||||
if (getParser().parseAbsoluteExpression(IntVal))
|
||||
if (parseAbsoluteExpr(IntVal, AbsMod))
|
||||
return MatchOperand_ParseFail;
|
||||
if (Minus)
|
||||
IntVal *= -1;
|
||||
|
@ -1678,7 +1704,7 @@ AMDGPUAsmParser::parseImm(OperandVector &Operands) {
|
|||
}
|
||||
case AsmToken::Real: {
|
||||
int64_t IntVal;
|
||||
if (getParser().parseAbsoluteExpression(IntVal))
|
||||
if (parseAbsoluteExpr(IntVal, AbsMod))
|
||||
return MatchOperand_ParseFail;
|
||||
|
||||
APFloat F(BitsToDouble(IntVal));
|
||||
|
@ -1706,8 +1732,8 @@ AMDGPUAsmParser::parseReg(OperandVector &Operands) {
|
|||
}
|
||||
|
||||
OperandMatchResultTy
|
||||
AMDGPUAsmParser::parseRegOrImm(OperandVector &Operands) {
|
||||
auto res = parseImm(Operands);
|
||||
AMDGPUAsmParser::parseRegOrImm(OperandVector &Operands, bool AbsMod) {
|
||||
auto res = parseImm(Operands, AbsMod);
|
||||
if (res != MatchOperand_NoMatch) {
|
||||
return res;
|
||||
}
|
||||
|
@ -1780,7 +1806,7 @@ AMDGPUAsmParser::parseRegOrImmWithFPInputMods(OperandVector &Operands,
|
|||
|
||||
OperandMatchResultTy Res;
|
||||
if (AllowImm) {
|
||||
Res = parseRegOrImm(Operands);
|
||||
Res = parseRegOrImm(Operands, Abs);
|
||||
} else {
|
||||
Res = parseReg(Operands);
|
||||
}
|
||||
|
|
|
@ -389,3 +389,15 @@ v_mqsad_u32_u8 v[0:3], s[2:3], v4, v[0:3]
|
|||
// CI: v_mqsad_u32_u8 v[0:3], s[2:3], v4, v[0:3] ; encoding: [0x00,0x00,0xe8,0xd2,0x02,0x08,0x02,0x04]
|
||||
// VI: v_mqsad_u32_u8 v[0:3], s[2:3], v4, v[0:3] ; encoding: [0x00,0x00,0xe7,0xd1,0x02,0x08,0x02,0x04]
|
||||
// NOSI: error: instruction not supported on this GPU
|
||||
|
||||
//
|
||||
// Modifier tests:
|
||||
//
|
||||
|
||||
v_mul_f64 v[0:1], |0|, |0|
|
||||
// SICI: v_mul_f64 v[0:1], |0|, |0| ; encoding: [0x00,0x03,0xca,0xd2,0x80,0x00,0x01,0x00]
|
||||
// VI: v_mul_f64 v[0:1], |0|, |0| ; encoding: [0x00,0x03,0x81,0xd2,0x80,0x00,0x01,0x00]
|
||||
|
||||
v_cubeid_f32 v0, |-1|, |-1.0|, |1.0|
|
||||
// SICI: v_cubeid_f32 v0, |-1|, |-1.0|, |1.0| ; encoding: [0x00,0x07,0x88,0xd2,0xc1,0xe6,0xc9,0x03]
|
||||
// VI: v_cubeid_f32 v0, |-1|, |-1.0|, |1.0| ; encoding: [0x00,0x07,0xc4,0xd1,0xc1,0xe6,0xc9,0x03]
|
||||
|
|
Loading…
Reference in New Issue