ARM: Fix the implementation of BX to work in thumbEE mode.

This commit is contained in:
Gabe Black 2010-06-02 12:58:09 -05:00
parent bb0d390105
commit eb0823c4f2
2 changed files with 13 additions and 15 deletions

View file

@ -238,9 +238,9 @@ class ArmStaticInst : public StaticInst
Addr newPc = (val & ~PcModeMask); Addr newPc = (val & ~PcModeMask);
if (thumbEE) { if (thumbEE) {
if (bits(newPc, 0)) { if (bits(newPc, 0)) {
warn("Bad thumbEE interworking branch address %#x.\n", newPc);
} else {
newPc = newPc & ~mask(1); newPc = newPc & ~mask(1);
} else {
panic("Bad thumbEE interworking branch address %#x.\n", newPc);
} }
} else { } else {
if (bits(newPc, 0)) { if (bits(newPc, 0)) {

View file

@ -69,15 +69,8 @@ let {{
blxCode = ''' blxCode = '''
Addr PC = readPC(xc); Addr PC = readPC(xc);
Addr tBit = PC & (ULL(1) << PcTBitShift); Addr tBit = PC & (ULL(1) << PcTBitShift);
// Other than the assert below, jBit isn't used.
#if !defined(NDEBUG)
Addr jBit = PC & (ULL(1) << PcJBitShift);
#endif
// X isn't permitted in ThumbEE mode. We shouldn't be in jazzelle mode?
assert(!jBit);
bool arm = !tBit; bool arm = !tBit;
arm = arm; // In case it's not used otherwise. arm = arm; // In case it's not used otherwise.
Addr tempPc = ((%(newPC)s) & mask(32)) | (PC & ~mask(32));
%(link)s %(link)s
// Switch modes // Switch modes
%(branch)s %(branch)s
@ -89,11 +82,6 @@ let {{
for (mnem, imm, link) in blxList: for (mnem, imm, link) in blxList:
Name = mnem.capitalize() Name = mnem.capitalize()
if imm and link: #blx with imm
branchStr = "FNPC = tempPc ^ (ULL(1) << PcTBitShift);"
else:
branchStr = "IWNPC = tempPc ^ (ULL(1) << PcTBitShift);"
if imm: if imm:
Name += "Imm" Name += "Imm"
# Since we're switching ISAs, the target ISA will be the opposite # Since we're switching ISAs, the target ISA will be the opposite
@ -104,7 +92,7 @@ let {{
constructor = BranchImmConstructor constructor = BranchImmConstructor
else: else:
Name += "Reg" Name += "Reg"
newPC = '(PC & PcModeMask) | Op1' newPC = 'Op1'
base = "BranchRegCond" base = "BranchRegCond"
declare = BranchRegCondDeclare declare = BranchRegCondDeclare
constructor = BranchRegCondConstructor constructor = BranchRegCondConstructor
@ -127,6 +115,16 @@ let {{
''' '''
else: else:
linkStr = "" linkStr = ""
if imm and link: #blx with imm
branchStr = '''
Addr tempPc = ((%(newPC)s) & mask(32)) | (PC & ~mask(32));
FNPC = tempPc ^ (ULL(1) << PcTBitShift);
'''
else:
branchStr = "IWNPC = %(newPC)s;"
branchStr = branchStr % { "newPC" : newPC }
code = blxCode % {"link": linkStr, code = blxCode % {"link": linkStr,
"newPC": newPC, "newPC": newPC,
"branch": branchStr} "branch": branchStr}