forked from OSchip/llvm-project
[Hexagon] Fixing compound register printing and reenabling more tests.
llvm-svn: 252574
This commit is contained in:
parent
339c83e27f
commit
13cc3ab785
|
|
@ -96,6 +96,12 @@ void HexagonMCCodeEmitter::EncodeSingleInstruction(
|
||||||
assert(!HexagonMCInstrInfo::isBundle(HMB));
|
assert(!HexagonMCInstrInfo::isBundle(HMB));
|
||||||
uint64_t Binary;
|
uint64_t Binary;
|
||||||
|
|
||||||
|
// Compound instructions are limited to using registers 0-7 and 16-23
|
||||||
|
// and here we make a map 16-23 to 8-15 so they can be correctly encoded.
|
||||||
|
static unsigned RegMap[8] = {Hexagon::R8, Hexagon::R9, Hexagon::R10,
|
||||||
|
Hexagon::R11, Hexagon::R12, Hexagon::R13,
|
||||||
|
Hexagon::R14, Hexagon::R15};
|
||||||
|
|
||||||
// Pseudo instructions don't get encoded and shouldn't be here
|
// Pseudo instructions don't get encoded and shouldn't be here
|
||||||
// in the first place!
|
// in the first place!
|
||||||
assert(!HexagonMCInstrInfo::getDesc(MCII, HMB).isPseudo() &&
|
assert(!HexagonMCInstrInfo::getDesc(MCII, HMB).isPseudo() &&
|
||||||
|
|
@ -104,6 +110,16 @@ void HexagonMCCodeEmitter::EncodeSingleInstruction(
|
||||||
" `" << HexagonMCInstrInfo::getName(MCII, HMB) << "'"
|
" `" << HexagonMCInstrInfo::getName(MCII, HMB) << "'"
|
||||||
"\n");
|
"\n");
|
||||||
|
|
||||||
|
if (llvm::HexagonMCInstrInfo::getType(MCII, HMB) == HexagonII::TypeCOMPOUND) {
|
||||||
|
for (unsigned i = 0; i < HMB.getNumOperands(); ++i)
|
||||||
|
if (HMB.getOperand(i).isReg()) {
|
||||||
|
unsigned Reg =
|
||||||
|
MCT.getRegisterInfo()->getEncodingValue(HMB.getOperand(i).getReg());
|
||||||
|
if ((Reg <= 23) && (Reg >= 16))
|
||||||
|
HMB.getOperand(i).setReg(RegMap[Reg - 16]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (HexagonMCInstrInfo::isNewValue(MCII, HMB)) {
|
if (HexagonMCInstrInfo::isNewValue(MCII, HMB)) {
|
||||||
// Calculate the new value distance to the associated producer
|
// Calculate the new value distance to the associated producer
|
||||||
MCOperand &MCO =
|
MCOperand &MCO =
|
||||||
|
|
|
||||||
|
|
@ -115,8 +115,8 @@ unsigned getCompoundCandidateGroup(MCInst const &MI, bool IsExtended) {
|
||||||
SrcReg = MI.getOperand(1).getReg();
|
SrcReg = MI.getOperand(1).getReg();
|
||||||
if ((Hexagon::P0 == DstReg || Hexagon::P1 == DstReg) &&
|
if ((Hexagon::P0 == DstReg || Hexagon::P1 == DstReg) &&
|
||||||
HexagonMCInstrInfo::isIntRegForSubInst(SrcReg) &&
|
HexagonMCInstrInfo::isIntRegForSubInst(SrcReg) &&
|
||||||
MI.getOperand(2).isImm() && ((isUInt<5>(MI.getOperand(2).getImm())) ||
|
(HexagonMCInstrInfo::inRange<5>(MI, 2) ||
|
||||||
(MI.getOperand(2).getImm() == -1)))
|
HexagonMCInstrInfo::minConstant(MI, 2) == -1))
|
||||||
return HexagonII::HCG_A;
|
return HexagonII::HCG_A;
|
||||||
break;
|
break;
|
||||||
case Hexagon::A2_tfr:
|
case Hexagon::A2_tfr:
|
||||||
|
|
@ -134,8 +134,8 @@ unsigned getCompoundCandidateGroup(MCInst const &MI, bool IsExtended) {
|
||||||
return false;
|
return false;
|
||||||
// Rd = #u6
|
// Rd = #u6
|
||||||
DstReg = MI.getOperand(0).getReg();
|
DstReg = MI.getOperand(0).getReg();
|
||||||
if (MI.getOperand(1).isImm() && MI.getOperand(1).getImm() <= 63 &&
|
if (HexagonMCInstrInfo::minConstant(MI, 1) <= 63 &&
|
||||||
MI.getOperand(1).getImm() >= 0 &&
|
HexagonMCInstrInfo::minConstant(MI, 1) >= 0 &&
|
||||||
HexagonMCInstrInfo::isIntRegForSubInst(DstReg))
|
HexagonMCInstrInfo::isIntRegForSubInst(DstReg))
|
||||||
return HexagonII::HCG_A;
|
return HexagonII::HCG_A;
|
||||||
break;
|
break;
|
||||||
|
|
@ -145,9 +145,8 @@ unsigned getCompoundCandidateGroup(MCInst const &MI, bool IsExtended) {
|
||||||
DstReg = MI.getOperand(0).getReg();
|
DstReg = MI.getOperand(0).getReg();
|
||||||
Src1Reg = MI.getOperand(1).getReg();
|
Src1Reg = MI.getOperand(1).getReg();
|
||||||
if ((Hexagon::P0 == DstReg || Hexagon::P1 == DstReg) &&
|
if ((Hexagon::P0 == DstReg || Hexagon::P1 == DstReg) &&
|
||||||
MI.getOperand(2).isImm() &&
|
|
||||||
HexagonMCInstrInfo::isIntRegForSubInst(Src1Reg) &&
|
HexagonMCInstrInfo::isIntRegForSubInst(Src1Reg) &&
|
||||||
(MI.getOperand(2).getImm() == 0))
|
HexagonMCInstrInfo::minConstant(MI, 2) == 0)
|
||||||
return HexagonII::HCG_A;
|
return HexagonII::HCG_A;
|
||||||
break;
|
break;
|
||||||
// The fact that .new form is used pretty much guarantees
|
// The fact that .new form is used pretty much guarantees
|
||||||
|
|
@ -206,6 +205,8 @@ MCInst *getCompoundInsn(MCContext &Context, MCInst const &L, MCInst const &R) {
|
||||||
MCInst *CompoundInsn = 0;
|
MCInst *CompoundInsn = 0;
|
||||||
unsigned compoundOpcode;
|
unsigned compoundOpcode;
|
||||||
MCOperand Rs, Rt;
|
MCOperand Rs, Rt;
|
||||||
|
int64_t Value;
|
||||||
|
bool Success;
|
||||||
|
|
||||||
switch (L.getOpcode()) {
|
switch (L.getOpcode()) {
|
||||||
default:
|
default:
|
||||||
|
|
@ -277,7 +278,10 @@ MCInst *getCompoundInsn(MCContext &Context, MCInst const &L, MCInst const &R) {
|
||||||
|
|
||||||
case Hexagon::C2_cmpeqi:
|
case Hexagon::C2_cmpeqi:
|
||||||
DEBUG(dbgs() << "CX: C2_cmpeqi\n");
|
DEBUG(dbgs() << "CX: C2_cmpeqi\n");
|
||||||
if (L.getOperand(2).getImm() == -1)
|
Success = L.getOperand(2).getExpr()->evaluateAsAbsolute(Value);
|
||||||
|
(void)Success;
|
||||||
|
assert(Success);
|
||||||
|
if (Value == -1)
|
||||||
compoundOpcode = cmpeqn1BitOpcode[getCompoundOp(R)];
|
compoundOpcode = cmpeqn1BitOpcode[getCompoundOp(R)];
|
||||||
else
|
else
|
||||||
compoundOpcode = cmpeqiBitOpcode[getCompoundOp(R)];
|
compoundOpcode = cmpeqiBitOpcode[getCompoundOp(R)];
|
||||||
|
|
@ -286,14 +290,17 @@ MCInst *getCompoundInsn(MCContext &Context, MCInst const &L, MCInst const &R) {
|
||||||
CompoundInsn = new (Context) MCInst;
|
CompoundInsn = new (Context) MCInst;
|
||||||
CompoundInsn->setOpcode(compoundOpcode);
|
CompoundInsn->setOpcode(compoundOpcode);
|
||||||
CompoundInsn->addOperand(Rs);
|
CompoundInsn->addOperand(Rs);
|
||||||
if (L.getOperand(2).getImm() != -1)
|
if (Value != -1)
|
||||||
CompoundInsn->addOperand(L.getOperand(2));
|
CompoundInsn->addOperand(L.getOperand(2));
|
||||||
CompoundInsn->addOperand(R.getOperand(1));
|
CompoundInsn->addOperand(R.getOperand(1));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Hexagon::C2_cmpgti:
|
case Hexagon::C2_cmpgti:
|
||||||
DEBUG(dbgs() << "CX: C2_cmpgti\n");
|
DEBUG(dbgs() << "CX: C2_cmpgti\n");
|
||||||
if (L.getOperand(2).getImm() == -1)
|
Success = L.getOperand(2).getExpr()->evaluateAsAbsolute(Value);
|
||||||
|
(void)Success;
|
||||||
|
assert(Success);
|
||||||
|
if (Value == -1)
|
||||||
compoundOpcode = cmpgtn1BitOpcode[getCompoundOp(R)];
|
compoundOpcode = cmpgtn1BitOpcode[getCompoundOp(R)];
|
||||||
else
|
else
|
||||||
compoundOpcode = cmpgtiBitOpcode[getCompoundOp(R)];
|
compoundOpcode = cmpgtiBitOpcode[getCompoundOp(R)];
|
||||||
|
|
@ -302,7 +309,7 @@ MCInst *getCompoundInsn(MCContext &Context, MCInst const &L, MCInst const &R) {
|
||||||
CompoundInsn = new (Context) MCInst;
|
CompoundInsn = new (Context) MCInst;
|
||||||
CompoundInsn->setOpcode(compoundOpcode);
|
CompoundInsn->setOpcode(compoundOpcode);
|
||||||
CompoundInsn->addOperand(Rs);
|
CompoundInsn->addOperand(Rs);
|
||||||
if (L.getOperand(2).getImm() != -1)
|
if (Value != -1)
|
||||||
CompoundInsn->addOperand(L.getOperand(2));
|
CompoundInsn->addOperand(L.getOperand(2));
|
||||||
CompoundInsn->addOperand(R.getOperand(1));
|
CompoundInsn->addOperand(R.getOperand(1));
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
; RUN: llc -march=hexagon -filetype=obj -o - %s | llvm-objdump -d - | FileCheck %s
|
; RUN: llc -march=hexagon -filetype=obj -o - %s | llvm-objdump -d - | FileCheck %s
|
||||||
; XFAIL: *
|
|
||||||
|
|
||||||
; CHECK: p0 = cmp.gt(r0,#-1); if (!p0.new) jump:nt
|
; CHECK: p0 = cmp.gt(r0,#-1); if (!p0.new) jump:nt
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
# RUN: llvm-mc -triple hexagon -filetype=obj -o - %s | llvm-objdump -d - | FileCheck %s
|
# RUN: llvm-mc -triple hexagon -filetype=obj -o - %s | llvm-objdump -d - | FileCheck %s
|
||||||
# Hexagon Programmer's Reference Manual 11.4 J
|
# Hexagon Programmer's Reference Manual 11.4 J
|
||||||
# XFAIL: *
|
|
||||||
|
|
||||||
# Call subroutine
|
# Call subroutine
|
||||||
# CHECK: 00 c0 00 5a
|
# CHECK: 00 c0 00 5a
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue