diff options
| author | 2012-10-30 15:48:42 -0700 | |
|---|---|---|
| committer | 2012-11-01 12:05:35 -0700 | |
| commit | b046e16d8b8da318d6055f9308950131f1255e08 (patch) | |
| tree | d4472622967d02fcc87bb422bddea9a9140c75f9 /src/compiler/codegen/x86 | |
| parent | 6e30145f1ed992be8d4e5a9973410c19f3de59f9 (diff) | |
Remove all TARGET_[ARM|X86|MIPS] #ifdefs
Two steps forward, one step back towards elimination of the
"#include" build model for target-specific compilers. This CL
does some restructuring to eliminate all of the TARGET_xxx #ifdefs
and convert them to run-time tests.
Considerable work is still required to fully eliminate the multiple
builds. In particular, much of the "common" codegen code relies on
macros defined by the target-specific [Arm|X86|Mips]Lir.h include file.
Next step is more restructuring to better isolate target-independent
code generation code.
Change-Id: If6efbde65c48031a48423344d8dc3e2ff2c4ad9d
Diffstat (limited to 'src/compiler/codegen/x86')
| -rw-r--r-- | src/compiler/codegen/x86/ArchFactory.cc | 33 | ||||
| -rw-r--r-- | src/compiler/codegen/x86/ArchUtility.cc | 26 | ||||
| -rw-r--r-- | src/compiler/codegen/x86/Assemble.cc | 4 | ||||
| -rw-r--r-- | src/compiler/codegen/x86/Codegen.h | 10 | ||||
| -rw-r--r-- | src/compiler/codegen/x86/X86/Factory.cc | 8 | ||||
| -rw-r--r-- | src/compiler/codegen/x86/X86/Gen.cc | 143 | ||||
| -rw-r--r-- | src/compiler/codegen/x86/X86/Ralloc.cc | 8 | ||||
| -rw-r--r-- | src/compiler/codegen/x86/X86LIR.h | 73 | ||||
| -rw-r--r-- | src/compiler/codegen/x86/x86/Codegen.cc | 1 |
9 files changed, 185 insertions, 121 deletions
diff --git a/src/compiler/codegen/x86/ArchFactory.cc b/src/compiler/codegen/x86/ArchFactory.cc index 001a93d199..1fc10340bd 100644 --- a/src/compiler/codegen/x86/ArchFactory.cc +++ b/src/compiler/codegen/x86/ArchFactory.cc @@ -14,13 +14,7 @@ * limitations under the License. */ -/* - * This file contains x86-specific codegen factory support. - * It is included by - * - * Codegen-$(TARGET_ARCH_VARIANT).c - * - */ +/* This file contains x86-specific codegen factory support. */ namespace art { @@ -120,8 +114,6 @@ bool genNegLong(CompilationUnit* cUnit, RegLocation rlDest, return false; } -void genDebuggerUpdate(CompilationUnit* cUnit, int32_t offset); - void spillCoreRegs(CompilationUnit* cUnit) { if (cUnit->numCoreSpills == 0) { return; @@ -202,16 +194,6 @@ void genEntrySequence(CompilationUnit* cUnit, RegLocation* argLocs, flushIns(cUnit, argLocs, rlMethod); - if (cUnit->genDebugger) { - // Refresh update debugger callout - UNIMPLEMENTED(WARNING) << "genDebugger"; -#if 0 - loadWordDisp(cUnit, rSELF, - OFFSETOF_MEMBER(Thread, pUpdateDebuggerFromCode), rSUSPEND); - genDebuggerUpdate(cUnit, DEBUGGER_METHOD_ENTRY); -#endif - } - oatFreeTemp(cUnit, rARG0); oatFreeTemp(cUnit, rARG1); oatFreeTemp(cUnit, rARG2); @@ -226,10 +208,6 @@ void genExitSequence(CompilationUnit* cUnit) { oatLockTemp(cUnit, rRET1); newLIR0(cUnit, kPseudoMethodExit); - /* If we're compiling for the debugger, generate an update callout */ - if (cUnit->genDebugger) { - genDebuggerUpdate(cUnit, DEBUGGER_METHOD_EXIT); - } unSpillCoreRegs(cUnit); /* Remove frame except for return address */ opRegImm(cUnit, kOpAdd, rSP, cUnit->frameSize - 4); @@ -292,4 +270,13 @@ bool oatArchInit() { return oatArchVariantInit(); } +// Not used in x86 +int loadHelper(CompilationUnit* cUnit, int offset) +{ + LOG(FATAL) << "Unexpected use of loadHelper in x86"; + return INVALID_REG; +} + + + } // namespace art diff --git a/src/compiler/codegen/x86/ArchUtility.cc b/src/compiler/codegen/x86/ArchUtility.cc index 4e75ef2a70..4c28b35e03 100644 --- a/src/compiler/codegen/x86/ArchUtility.cc +++ b/src/compiler/codegen/x86/ArchUtility.cc @@ -22,6 +22,32 @@ namespace art { +void setupTargetResourceMasks(CompilationUnit* cUnit, LIR* lir) +{ + DCHECK_EQ(cUnit->instructionSet, kX86); + + // X86-specific resource map setup here. + int flags = EncodingMap[lir->opcode].flags; + if (flags & REG_DEFA) { + oatSetupRegMask(cUnit, &lir->defMask, rAX); + } + + if (flags & REG_DEFD) { + oatSetupRegMask(cUnit, &lir->defMask, rDX); + } + if (flags & REG_USEA) { + oatSetupRegMask(cUnit, &lir->useMask, rAX); + } + + if (flags & REG_USEC) { + oatSetupRegMask(cUnit, &lir->useMask, rCX); + } + + if (flags & REG_USED) { + oatSetupRegMask(cUnit, &lir->useMask, rDX); + } +} + /* For dumping instructions */ static const char* x86RegName[] = { "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi", diff --git a/src/compiler/codegen/x86/Assemble.cc b/src/compiler/codegen/x86/Assemble.cc index 252228344f..c47711cab3 100644 --- a/src/compiler/codegen/x86/Assemble.cc +++ b/src/compiler/codegen/x86/Assemble.cc @@ -1225,7 +1225,7 @@ AssemblerStatus oatAssembleInstructions(CompilationUnit *cUnit, intptr_t startAd << " delta: " << delta << " old delta: " << lir->operands[0]; } lir->opcode = kX86Jcc32; - oatSetupResourceMasks(lir); + oatSetupResourceMasks(cUnit, lir); res = kRetryAll; } if (kVerbosePcFixup) { @@ -1278,7 +1278,7 @@ AssemblerStatus oatAssembleInstructions(CompilationUnit *cUnit, intptr_t startAd LOG(INFO) << "Retry for JMP growth at " << lir->offset; } lir->opcode = kX86Jmp32; - oatSetupResourceMasks(lir); + oatSetupResourceMasks(cUnit, lir); res = kRetryAll; } lir->operands[0] = delta; diff --git a/src/compiler/codegen/x86/Codegen.h b/src/compiler/codegen/x86/Codegen.h index 568a3888b5..3755e500aa 100644 --- a/src/compiler/codegen/x86/Codegen.h +++ b/src/compiler/codegen/x86/Codegen.h @@ -14,13 +14,7 @@ * limitations under the License. */ -/* - * This file contains register alloction support and is intended to be - * included by: - * - * Codegen-$(TARGET_ARCH_VARIANT).c - * - */ +/* This file contains register alloction support */ #include "../../CompilerIR.h" @@ -101,7 +95,7 @@ inline s4 s4FromSwitchData(const void* switchData) { #endif -extern void oatSetupResourceMasks(LIR* lir); +extern void oatSetupResourceMasks(CompilationUnit* cUnit, LIR* lir); extern LIR* oatRegCopyNoInsert(CompilationUnit* cUnit, int rDest, int rSrc); diff --git a/src/compiler/codegen/x86/X86/Factory.cc b/src/compiler/codegen/x86/X86/Factory.cc index 291b761d85..3da7672408 100644 --- a/src/compiler/codegen/x86/X86/Factory.cc +++ b/src/compiler/codegen/x86/X86/Factory.cc @@ -16,13 +16,7 @@ namespace art { -/* - * This file contains codegen for the X86 ISA and is intended to be - * includes by: - * - * Codegen-$(TARGET_ARCH_VARIANT).c - * - */ +/* This file contains codegen for the X86 ISA */ //FIXME: restore "static" when usage uncovered /*static*/ int coreRegs[] = { diff --git a/src/compiler/codegen/x86/X86/Gen.cc b/src/compiler/codegen/x86/X86/Gen.cc index 28c691403f..b57acac271 100644 --- a/src/compiler/codegen/x86/X86/Gen.cc +++ b/src/compiler/codegen/x86/X86/Gen.cc @@ -14,13 +14,7 @@ * limitations under the License. */ -/* - * This file contains codegen for the X86 ISA and is intended to be - * includes by: - * - * Codegen-$(TARGET_ARCH_VARIANT).c - * - */ +/* This file contains codegen for the X86 ISA */ namespace art { @@ -418,5 +412,140 @@ void genFusedLongCmpBranch(CompilationUnit* cUnit, BasicBlock* bb, MIR* mir) { } opCondBranch(cUnit, ccode, taken); } +RegLocation genDivRemLit(CompilationUnit* cUnit, RegLocation rlDest, int regLo, int lit, bool isDiv) +{ + LOG(FATAL) << "Unexpected use of genDivRemLit for x86"; + return rlDest; +} + +RegLocation genDivRem(CompilationUnit* cUnit, RegLocation rlDest, int regLo, int regHi, bool isDiv) +{ + LOG(FATAL) << "Unexpected use of genDivRem for x86"; + return rlDest; +} + +/* + * Mark garbage collection card. Skip if the value we're storing is null. + */ +void markGCCard(CompilationUnit* cUnit, int valReg, int tgtAddrReg) +{ + int regCardBase = oatAllocTemp(cUnit); + int regCardNo = oatAllocTemp(cUnit); + LIR* branchOver = opCmpImmBranch(cUnit, kCondEq, valReg, 0, NULL); + newLIR2(cUnit, kX86Mov32RT, regCardBase, Thread::CardTableOffset().Int32Value()); + opRegRegImm(cUnit, kOpLsr, regCardNo, tgtAddrReg, CardTable::kCardShift); + storeBaseIndexed(cUnit, regCardBase, regCardNo, regCardBase, 0, + kUnsignedByte); + LIR* target = newLIR0(cUnit, kPseudoTargetLabel); + branchOver->target = (LIR*)target; + oatFreeTemp(cUnit, regCardBase); + oatFreeTemp(cUnit, regCardNo); +} + +bool genInlinedMinMaxInt(CompilationUnit *cUnit, CallInfo* info, bool isMin) +{ + DCHECK_EQ(cUnit->instructionSet, kX86); + RegLocation rlSrc1 = info->args[0]; + RegLocation rlSrc2 = info->args[1]; + rlSrc1 = loadValue(cUnit, rlSrc1, kCoreReg); + rlSrc2 = loadValue(cUnit, rlSrc2, kCoreReg); + RegLocation rlDest = inlineTarget(cUnit, info); + RegLocation rlResult = oatEvalLoc(cUnit, rlDest, kCoreReg, true); + opRegReg(cUnit, kOpCmp, rlSrc1.lowReg, rlSrc2.lowReg); + DCHECK_EQ(cUnit->instructionSet, kX86); + LIR* branch = newLIR2(cUnit, kX86Jcc8, 0, isMin ? kX86CondG : kX86CondL); + opRegReg(cUnit, kOpMov, rlResult.lowReg, rlSrc1.lowReg); + LIR* branch2 = newLIR1(cUnit, kX86Jmp8, 0); + branch->target = newLIR0(cUnit, kPseudoTargetLabel); + opRegReg(cUnit, kOpMov, rlResult.lowReg, rlSrc2.lowReg); + branch2->target = newLIR0(cUnit, kPseudoTargetLabel); + storeValue(cUnit, rlDest, rlResult); + return true; +} + +void opLea(CompilationUnit* cUnit, int rBase, int reg1, int reg2, int scale, int offset) +{ + newLIR5(cUnit, kX86Lea32RA, rBase, reg1, reg2, scale, offset); +} + +void opTlsCmp(CompilationUnit* cUnit, int offset, int val) +{ + newLIR2(cUnit, kX86Cmp16TI8, offset, val); +} + +bool genInlinedCas32(CompilationUnit* cUnit, CallInfo* info, bool need_write_barrier) { + DCHECK_NE(cUnit->instructionSet, kThumb2); + return false; +} + +bool genInlinedSqrt(CompilationUnit* cUnit, CallInfo* info) { + DCHECK_NE(cUnit->instructionSet, kThumb2); + return false; +} + +LIR* opPcRelLoad(CompilationUnit* cUnit, int reg, LIR* target) { + LOG(FATAL) << "Unexpected use of opPcRelLoad for x86"; + return NULL; +} + +LIR* opVldm(CompilationUnit* cUnit, int rBase, int count) +{ + LOG(FATAL) << "Unexpected use of opVldm for x86"; + return NULL; +} + +LIR* opVstm(CompilationUnit* cUnit, int rBase, int count) +{ + LOG(FATAL) << "Unexpected use of opVstm for x86"; + return NULL; +} + +void genMultiplyByTwoBitMultiplier(CompilationUnit* cUnit, RegLocation rlSrc, + RegLocation rlResult, int lit, + int firstBit, int secondBit) +{ + int tReg = oatAllocTemp(cUnit); + opRegRegImm(cUnit, kOpLsl, tReg, rlSrc.lowReg, secondBit - firstBit); + opRegRegReg(cUnit, kOpAdd, rlResult.lowReg, rlSrc.lowReg, tReg); + oatFreeTemp(cUnit, tReg); + if (firstBit != 0) { + opRegRegImm(cUnit, kOpLsl, rlResult.lowReg, rlResult.lowReg, firstBit); + } +} + +void genDivZeroCheck(CompilationUnit* cUnit, int regLo, int regHi) +{ + int tReg = oatAllocTemp(cUnit); + opRegRegReg(cUnit, kOpOr, tReg, regLo, regHi); + genImmedCheck(cUnit, kCondEq, tReg, 0, kThrowDivZero); + oatFreeTemp(cUnit, tReg); +} + +// Test suspend flag, return target of taken suspend branch +LIR* opTestSuspend(CompilationUnit* cUnit, LIR* target) +{ + opTlsCmp(cUnit, Thread::ThreadFlagsOffset().Int32Value(), 0); + return opCondBranch(cUnit, (target == NULL) ? kCondNe : kCondEq, target); +} + +// Decrement register and branch on condition +LIR* opDecAndBranch(CompilationUnit* cUnit, ConditionCode cCode, int reg, LIR* target) +{ + opRegImm(cUnit, kOpSub, reg, 1); + return opCmpImmBranch(cUnit, cCode, reg, 0, target); +} + +bool smallLiteralDivide(CompilationUnit* cUnit, Instruction::Code dalvikOpcode, + RegLocation rlSrc, RegLocation rlDest, int lit) +{ + LOG(FATAL) << "Unexpected use of smallLiteralDive in x86"; + return false; +} + +LIR* opIT(CompilationUnit* cUnit, ArmConditionCode cond, const char* guide) +{ + LOG(FATAL) << "Unexpected use of opIT in x86"; + return NULL; +} } // namespace art diff --git a/src/compiler/codegen/x86/X86/Ralloc.cc b/src/compiler/codegen/x86/X86/Ralloc.cc index 2886b8f057..ef72e52515 100644 --- a/src/compiler/codegen/x86/X86/Ralloc.cc +++ b/src/compiler/codegen/x86/X86/Ralloc.cc @@ -16,13 +16,7 @@ namespace art { -/* - * This file contains codegen for the X86 ISA and is intended to be - * includes by: - * - * Codegen-$(TARGET_ARCH_VARIANT).c - * - */ +/* This file contains codegen for the X86 ISA */ /* * Alloc a pair of core registers, or a double. Low reg in low byte, diff --git a/src/compiler/codegen/x86/X86LIR.h b/src/compiler/codegen/x86/X86LIR.h index 8ad014ac85..9a5d63058a 100644 --- a/src/compiler/codegen/x86/X86LIR.h +++ b/src/compiler/codegen/x86/X86LIR.h @@ -175,6 +175,8 @@ enum ResourceEncodingPos { #define DECODE_ALIAS_INFO_REG(X) (X & 0xffff) #define DECODE_ALIAS_INFO_WIDE(X) ((X & 0x80000000) ? 1 : 0) +/* Not used for x86 */ +#define ENCODE_REG_PC (ENCODE_ALL) /* * Annotate special-purpose core registers: @@ -245,81 +247,20 @@ enum NativeRegisterPool { #define rRET0 rAX #define rRET1 rDX #define rINVOKE_TGT rAX +#define rLR INVALID_REG +#define rSUSPEND INVALID_REG +#define rSELF INVALID_REG +#define rCOUNT rCX #define isPseudoOpcode(opCode) ((int)(opCode) < 0) -/* X86 condition encodings */ -enum X86ConditionCode { - kX86CondO = 0x0, // overflow - kX86CondNo = 0x1, // not overflow - - kX86CondB = 0x2, // below - kX86CondNae = kX86CondB, // not-above-equal - kX86CondC = kX86CondB, // carry - - kX86CondNb = 0x3, // not-below - kX86CondAe = kX86CondNb, // above-equal - kX86CondNc = kX86CondNb, // not-carry - - kX86CondZ = 0x4, // zero - kX86CondEq = kX86CondZ, // equal - - kX86CondNz = 0x5, // not-zero - kX86CondNe = kX86CondNz, // not-equal - - kX86CondBe = 0x6, // below-equal - kX86CondNa = kX86CondBe, // not-above - - kX86CondNbe = 0x7, // not-below-equal - kX86CondA = kX86CondNbe,// above - - kX86CondS = 0x8, // sign - kX86CondNs = 0x9, // not-sign - - kX86CondP = 0xA, // 8-bit parity even - kX86CondPE = kX86CondP, - - kX86CondNp = 0xB, // 8-bit parity odd - kX86CondPo = kX86CondNp, - - kX86CondL = 0xC, // less-than - kX86CondNge = kX86CondL, // not-greater-equal - - kX86CondNl = 0xD, // not-less-than - kX86CondGe = kX86CondNl, // not-greater-equal - - kX86CondLe = 0xE, // less-than-equal - kX86CondNg = kX86CondLe, // not-greater - - kX86CondNle = 0xF, // not-less-than - kX86CondG = kX86CondNle,// greater -}; - /* * The following enum defines the list of supported X86 instructions by the * assembler. Their corresponding EncodingMap positions will be defined in * Assemble.cc. */ enum X86OpCode { - kPseudoExportedPC = -18, - kPseudoSafepointPC = -17, - kPseudoIntrinsicRetry = -16, - kPseudoSuspendTarget = -15, - kPseudoThrowTarget = -14, - kPseudoCaseLabel = -13, - kPseudoMethodEntry = -12, - kPseudoMethodExit = -11, - kPseudoBarrier = -10, - kPseudoExtended = -9, - kPseudoSSARep = -8, - kPseudoEntryBlock = -7, - kPseudoExitBlock = -6, - kPseudoTargetLabel = -5, - kPseudoDalvikByteCodeBoundary = -4, - kPseudoPseudoAlign4 = -3, - kPseudoEHBlockLabel = -2, - kPseudoNormalBlockLabel = -1, - kX86First, + kX86First = 0, kX8632BitData = kX86First, /* data [31..0] */ kX86Bkpt, kX86Nop, diff --git a/src/compiler/codegen/x86/x86/Codegen.cc b/src/compiler/codegen/x86/x86/Codegen.cc index 0552ce3416..744a7d2246 100644 --- a/src/compiler/codegen/x86/x86/Codegen.cc +++ b/src/compiler/codegen/x86/x86/Codegen.cc @@ -15,7 +15,6 @@ */ #define _CODEGEN_C -#define TARGET_X86 #include "../../../Dalvik.h" #include "../../../CompilerInternals.h" |