Complete MIPS code generation support
With this CL code generation for MIPS is complete (though untested on
actual hardware). Core and the boot classpath compile without issue.
The primary thrust here was to support expanding of short branch
sequences to long form during assembly if the displacement field overflowed.
That led to a general cleanup of creation on LIR nodes outside of the
normal flow.
Also introduced is a README to describe the state of MIPS support, as well
as memory barrier handling.
Change-Id: I251a2ef8d74bc7183406dce9493464be24a9d7f7
diff --git a/src/compiler/codegen/arm/Assemble.cc b/src/compiler/codegen/arm/Assemble.cc
index 79a72e7..acd2af5 100644
--- a/src/compiler/codegen/arm/Assemble.cc
+++ b/src/compiler/codegen/arm/Assemble.cc
@@ -1050,13 +1050,8 @@
lir->operands[0] : rLR;
// Add new Adr to generate the address
- LIR *newAdr = (LIR *)oatNew(cUnit, sizeof(LIR),
- true, kAllocLIR);
- newAdr->dalvikOffset = lir->dalvikOffset;
- newAdr->target = lir->target;
- newAdr->opcode = kThumb2Adr;
- newAdr->operands[0] = baseReg;
- oatSetupResourceMasks(newAdr);
+ LIR* newAdr = rawLIR(cUnit, lir->dalvikOffset, kThumb2Adr,
+ baseReg, 0, 0, 0, lir->target);
oatInsertLIRBefore((LIR*)lir, (LIR*)newAdr);
// Convert to normal load
@@ -1083,17 +1078,14 @@
intptr_t target = targetLIR->offset;
int delta = target - pc;
if (delta > 126 || delta < 0) {
- /* Convert to cmp rx,#0 / b[eq/ne] tgt pair */
- LIR *newInst = (LIR *)oatNew(cUnit, sizeof(LIR),
- true, kAllocLIR);
- /* Make new branch instruction and insert after */
- newInst->dalvikOffset = lir->dalvikOffset;
- newInst->opcode = kThumbBCond;
- newInst->operands[0] = 0;
- newInst->operands[1] = (lir->opcode == kThumb2Cbz) ?
- kArmCondEq : kArmCondNe;
- newInst->target = lir->target;
- oatSetupResourceMasks(newInst);
+ /*
+ * Convert to cmp rx,#0 / b[eq/ne] tgt pair
+ * Make new branch instruction and insert after
+ */
+ LIR* newInst =
+ rawLIR(cUnit, lir->dalvikOffset, kThumbBCond, 0,
+ (lir->opcode == kThumb2Cbz) ? kArmCondEq : kArmCondNe,
+ 0, 0, lir->target);
oatInsertLIRAfter((LIR *)lir, (LIR *)newInst);
/* Convert the cb[n]z to a cmp rx, #0 ] */
lir->opcode = kThumbCmpRI8;
@@ -1209,26 +1201,14 @@
} else {
// convert to ldimm16l, ldimm16h, add tgt, pc, operands[0]
LIR *newMov16L =
- (LIR *)oatNew(cUnit, sizeof(LIR), true,
- kAllocLIR);
- newMov16L->dalvikOffset = lir->dalvikOffset;
- newMov16L->target = lir->target;
- newMov16L->opcode = kThumb2MovImm16LST;
- newMov16L->operands[0] = lir->operands[0];
- newMov16L->operands[2] = (intptr_t)lir;
- newMov16L->operands[3] = (intptr_t)tabRec;
- oatSetupResourceMasks(newMov16L);
+ rawLIR(cUnit, lir->dalvikOffset, kThumb2MovImm16LST,
+ lir->operands[0], 0, (intptr_t)lir, (intptr_t)tabRec,
+ lir->target);
oatInsertLIRBefore((LIR*)lir, (LIR*)newMov16L);
LIR *newMov16H =
- (LIR *)oatNew(cUnit, sizeof(LIR), true,
- kAllocLIR);
- newMov16H->dalvikOffset = lir->dalvikOffset;
- newMov16H->target = lir->target;
- newMov16H->opcode = kThumb2MovImm16HST;
- newMov16H->operands[0] = lir->operands[0];
- newMov16H->operands[2] = (intptr_t)lir;
- newMov16H->operands[3] = (intptr_t)tabRec;
- oatSetupResourceMasks(newMov16H);
+ rawLIR(cUnit, lir->dalvikOffset, kThumb2MovImm16HST,
+ lir->operands[0], 0, (intptr_t)lir, (intptr_t)tabRec,
+ lir->target);
oatInsertLIRBefore((LIR*)lir, (LIR*)newMov16H);
lir->opcode = kThumb2AddRRR;
lir->operands[1] = rPC;
diff --git a/src/compiler/codegen/arm/Thumb2/Factory.cc b/src/compiler/codegen/arm/Thumb2/Factory.cc
index 03a69d5..b6df8e3 100644
--- a/src/compiler/codegen/arm/Thumb2/Factory.cc
+++ b/src/compiler/codegen/arm/Thumb2/Factory.cc
@@ -68,14 +68,8 @@
if (dataTarget == NULL) {
dataTarget = addWordData(cUnit, &cUnit->literalList, value);
}
- LIR* loadPcRel = (LIR* ) oatNew(cUnit, sizeof(LIR), true,
- kAllocLIR);
- loadPcRel->dalvikOffset = cUnit->currentDalvikOffset;
- loadPcRel->opcode = kThumb2Vldrs;
- loadPcRel->target = (LIR* ) dataTarget;
- loadPcRel->operands[0] = rDest;
- loadPcRel->operands[1] = r15pc;
- setupResourceMasks(loadPcRel);
+ LIR* loadPcRel = rawLIR(cUnit, cUnit->currentDalvikOffset, kThumb2Vldrs,
+ rDest, r15pc, 0, 0, dataTarget);
setMemRefType(loadPcRel, true, kLiteral);
loadPcRel->aliasInfo = (intptr_t)dataTarget;
oatAppendLIR(cUnit, (LIR* ) loadPcRel);
@@ -177,13 +171,8 @@
if (dataTarget == NULL) {
dataTarget = addWordData(cUnit, &cUnit->literalList, value);
}
- LIR* loadPcRel = (LIR* ) oatNew(cUnit, sizeof(LIR), true,
- kAllocLIR);
- loadPcRel->opcode = kThumb2LdrPcRel12;
- loadPcRel->target = (LIR* ) dataTarget;
- loadPcRel->dalvikOffset = cUnit->currentDalvikOffset;
- loadPcRel->operands[0] = rDest;
- setupResourceMasks(loadPcRel);
+ LIR* loadPcRel = rawLIR(cUnit, cUnit->currentDalvikOffset,
+ kThumb2LdrPcRel12, rDest, 0, 0, 0, dataTarget);
setMemRefType(loadPcRel, true, kLiteral);
loadPcRel->aliasInfo = (intptr_t)dataTarget;
res = loadPcRel;
@@ -643,14 +632,9 @@
dataTarget = addWideData(cUnit, &cUnit->literalList, valLo,
valHi);
}
- LIR* loadPcRel = (LIR* ) oatNew(cUnit, sizeof(LIR), true,
- kAllocLIR);
- loadPcRel->dalvikOffset = cUnit->currentDalvikOffset;
- loadPcRel->opcode = kThumb2Vldrd;
- loadPcRel->target = (LIR* ) dataTarget;
- loadPcRel->operands[0] = S2D(rDestLo, rDestHi);
- loadPcRel->operands[1] = r15pc;
- setupResourceMasks(loadPcRel);
+ LIR* loadPcRel = rawLIR(cUnit, cUnit->currentDalvikOffset,
+ kThumb2Vldrd, S2D(rDestLo, rDestHi),
+ r15pc, 0, 0, dataTarget);
setMemRefType(loadPcRel, true, kLiteral);
loadPcRel->aliasInfo = (intptr_t)dataTarget;
oatAppendLIR(cUnit, (LIR* ) loadPcRel);
@@ -1042,28 +1026,22 @@
LIR* fpRegCopy(CompilationUnit* cUnit, int rDest, int rSrc)
{
- LIR* res = (LIR* ) oatNew(cUnit, sizeof(LIR), true, kAllocLIR);
- res->dalvikOffset = cUnit->currentDalvikOffset;
- res->operands[0] = rDest;
- res->operands[1] = rSrc;
+ int opcode;
+ DCHECK_EQ(DOUBLEREG(rDest), DOUBLEREG(rSrc));
+ if (DOUBLEREG(rDest)) {
+ opcode = kThumb2Vmovd;
+ } else {
+ if (SINGLEREG(rDest)) {
+ opcode = SINGLEREG(rSrc) ? kThumb2Vmovs : kThumb2Fmsr;
+ } else {
+ DCHECK(SINGLEREG(rSrc));
+ opcode = kThumb2Fmrs;
+ }
+ }
+ LIR* res = rawLIR(cUnit, cUnit->currentDalvikOffset, opcode, rDest, rSrc);
if (rDest == rSrc) {
res->flags.isNop = true;
- } else {
- DCHECK_EQ(DOUBLEREG(rDest), DOUBLEREG(rSrc));
- if (DOUBLEREG(rDest)) {
- res->opcode = kThumb2Vmovd;
- } else {
- if (SINGLEREG(rDest)) {
- res->opcode = SINGLEREG(rSrc) ? kThumb2Vmovs : kThumb2Fmsr;
- } else {
- DCHECK(SINGLEREG(rSrc));
- res->opcode = kThumb2Fmrs;
- }
- }
- res->operands[0] = rDest;
- res->operands[1] = rSrc;
}
- setupResourceMasks(res);
return res;
}
diff --git a/src/compiler/codegen/arm/Thumb2/Gen.cc b/src/compiler/codegen/arm/Thumb2/Gen.cc
index cba37b7..1351992 100644
--- a/src/compiler/codegen/arm/Thumb2/Gen.cc
+++ b/src/compiler/codegen/arm/Thumb2/Gen.cc
@@ -428,8 +428,6 @@
ArmOpcode opcode;
if (FPREG(rDest) || FPREG(rSrc))
return fpRegCopy(cUnit, rDest, rSrc);
- res = (LIR* ) oatNew(cUnit, sizeof(LIR), true, kAllocLIR);
- res->dalvikOffset = cUnit->currentDalvikOffset;
if (LOWREG(rDest) && LOWREG(rSrc))
opcode = kThumbMovRR;
else if (!LOWREG(rDest) && !LOWREG(rSrc))
@@ -438,11 +436,7 @@
opcode = kThumbMovRR_H2L;
else
opcode = kThumbMovRR_L2H;
-
- res->operands[0] = rDest;
- res->operands[1] = rSrc;
- res->opcode = opcode;
- setupResourceMasks(res);
+ res = rawLIR(cUnit, cUnit->currentDalvikOffset, opcode, rDest, rSrc);
if (rDest == rSrc) {
res->flags.isNop = true;
}