Quick compiler: more refactoring

Focus on header file cleanup here.  Note: target_list.h
is transitional, and upcoming CLs will do additional header
file reorganization.

Change-Id: If86e1a8c1c43305762fe37b157a9d3c17d911ea7
diff --git a/build/Android.libart-compiler-llvm.mk b/build/Android.libart-compiler-llvm.mk
index 4f89883..a36962d 100644
--- a/build/Android.libart-compiler-llvm.mk
+++ b/build/Android.libart-compiler-llvm.mk
@@ -42,7 +42,7 @@
     src/compiler/intermediate_rep.cc \
     src/compiler/ralloc.cc \
     src/compiler/ssa_transformation.cc \
-    src/compiler/utility.cc \
+    src/compiler/compiler_utility.cc \
     src/compiler/codegen/ralloc_util.cc \
     src/compiler/codegen/arm/target_arm.cc \
     src/compiler/codegen/arm/assemble_arm.cc \
diff --git a/build/Android.libart-compiler.mk b/build/Android.libart-compiler.mk
index fa51a99..f94b8b6 100644
--- a/build/Android.libart-compiler.mk
+++ b/build/Android.libart-compiler.mk
@@ -20,7 +20,7 @@
 	src/compiler/intermediate_rep.cc \
 	src/compiler/ralloc.cc \
 	src/compiler/ssa_transformation.cc \
-	src/compiler/utility.cc \
+	src/compiler/compiler_utility.cc \
 	src/compiler/codegen/ralloc_util.cc \
 	src/oat/jni/calling_convention.cc \
 	src/oat/jni/jni_compiler.cc \
diff --git a/src/compiler/codegen/arm/arm_lir.h b/src/compiler/codegen/arm/arm_lir.h
index a068502..503fbda 100644
--- a/src/compiler/codegen/arm/arm_lir.h
+++ b/src/compiler/codegen/arm/arm_lir.h
@@ -17,7 +17,6 @@
 #ifndef ART_SRC_COMPILER_CODEGEN_ARM_ARMLIR_H_
 #define ART_SRC_COMPILER_CODEGEN_ARM_ARMLIR_H_
 
-#include "../../dalvik.h"
 #include "../../compiler_internals.h"
 
 namespace art {
@@ -135,11 +134,11 @@
   kArmRegEnd   = 48,
 };
 
-#define ENCODE_ARM_REG_LIST(N)      ((u8) N)
+#define ENCODE_ARM_REG_LIST(N)      ((uint64_t) N)
 #define ENCODE_ARM_REG_SP           (1ULL << kArmRegSP)
 #define ENCODE_ARM_REG_LR           (1ULL << kArmRegLR)
 #define ENCODE_ARM_REG_PC           (1ULL << kArmRegPC)
-#define ENCODE_ARM_REG_FPCS_LIST(N) ((u8)N << kArmFPReg16)
+#define ENCODE_ARM_REG_FPCS_LIST(N) ((uint64_t)N << kArmFPReg16)
 
 enum ArmNativeRegisterPool {
   r0   = 0,
@@ -592,7 +591,7 @@
 
 /* Struct used to define the snippet positions for each Thumb opcode */
 struct ArmEncodingMap {
-  u4 skeleton;
+  uint32_t skeleton;
   struct {
     ArmEncodingKind kind;
     int end;   /* end for kFmtBitBlt, 1-bit slice end for FP regs */
@@ -605,11 +604,6 @@
   int size;   /* Size in bytes */
 };
 
-/* Keys for target-specific scheduling and other optimization hints */
-enum ArmTargetOptHints {
-  kMaxHoistDistance,
-};
-
 extern const ArmEncodingMap EncodingMap[kArmLast];
 
 }  // namespace art
diff --git a/src/compiler/codegen/arm/assemble_arm.cc b/src/compiler/codegen/arm/assemble_arm.cc
index e1b8672..6370f6c 100644
--- a/src/compiler/codegen/arm/assemble_arm.cc
+++ b/src/compiler/codegen/arm/assemble_arm.cc
@@ -14,10 +14,8 @@
  * limitations under the License.
  */
 
-#include "../../dalvik.h"
-#include "../../compiler_internals.h"
 #include "arm_lir.h"
-#include "codegen.h"
+#include "../codegen_util.h"
 
 namespace art {
 
@@ -1252,11 +1250,11 @@
       continue;
     }
     const ArmEncodingMap *encoder = &EncodingMap[lir->opcode];
-    u4 bits = encoder->skeleton;
+    uint32_t bits = encoder->skeleton;
     int i;
     for (i = 0; i < 4; i++) {
-      u4 operand;
-      u4 value;
+      uint32_t operand;
+      uint32_t value;
       operand = lir->operands[i];
       switch (encoder->fieldLoc[i].kind) {
         case kFmtUnused:
@@ -1337,13 +1335,13 @@
           bits |= value;
           break;
         case kFmtOff24: {
-          u4 signbit = (operand >> 31) & 0x1;
-          u4 i1 = (operand >> 22) & 0x1;
-          u4 i2 = (operand >> 21) & 0x1;
-          u4 imm10 = (operand >> 11) & 0x03ff;
-          u4 imm11 = operand & 0x07ff;
-          u4 j1 = (i1 ^ signbit) ? 0 : 1;
-          u4 j2 = (i2 ^ signbit) ? 0 : 1;
+          uint32_t signbit = (operand >> 31) & 0x1;
+          uint32_t i1 = (operand >> 22) & 0x1;
+          uint32_t i2 = (operand >> 21) & 0x1;
+          uint32_t imm10 = (operand >> 11) & 0x03ff;
+          uint32_t imm11 = operand & 0x07ff;
+          uint32_t j1 = (i1 ^ signbit) ? 0 : 1;
+          uint32_t j2 = (i2 ^ signbit) ? 0 : 1;
           value = (signbit << 26) | (j1 << 13) | (j2 << 11) | (imm10 << 16) |
               imm11;
           bits |= value;
diff --git a/src/compiler/codegen/arm/backend_arm.cc b/src/compiler/codegen/arm/backend_arm.cc
index d8f2996..47d1967 100644
--- a/src/compiler/codegen/arm/backend_arm.cc
+++ b/src/compiler/codegen/arm/backend_arm.cc
@@ -16,17 +16,14 @@
 #define _CODEGEN_C
 #define _ARMV7_A
 
-#include "../../dalvik.h"
-#include "../../compiler_internals.h"
 #include "arm_lir.h"
-#include "../ralloc.h"
-#include "codegen.h"
+#include "../ralloc_util.h"
 
 /* Common codegen utility code */
 #include "../codegen_util.cc"
 
 #include "utility_arm.cc"
-#include "../codegen_factory.cc"
+#include "../gen_loadstore.cc"
 #include "../gen_common.cc"
 #include "../gen_invoke.cc"
 #include "call_arm.cc"
diff --git a/src/compiler/codegen/arm/call_arm.cc b/src/compiler/codegen/arm/call_arm.cc
index 3fd5b15..92b067c 100644
--- a/src/compiler/codegen/arm/call_arm.cc
+++ b/src/compiler/codegen/arm/call_arm.cc
@@ -324,7 +324,7 @@
 void genSparseSwitch(CompilationUnit* cUnit, uint32_t tableOffset,
                      RegLocation rlSrc)
 {
-  const u2* table = cUnit->insns + cUnit->currentDalvikOffset + tableOffset;
+  const uint16_t* table = cUnit->insns + cUnit->currentDalvikOffset + tableOffset;
   if (cUnit->printMe) {
     dumpSparseSwitchTable(table);
   }
@@ -372,7 +372,7 @@
 void genPackedSwitch(CompilationUnit* cUnit, uint32_t tableOffset,
                      RegLocation rlSrc)
 {
-  const u2* table = cUnit->insns + cUnit->currentDalvikOffset + tableOffset;
+  const uint16_t* table = cUnit->insns + cUnit->currentDalvikOffset + tableOffset;
   if (cUnit->printMe) {
     dumpPackedSwitchTable(table);
   }
@@ -428,14 +428,14 @@
  */
 void genFillArrayData(CompilationUnit* cUnit, uint32_t tableOffset, RegLocation rlSrc)
 {
-  const u2* table = cUnit->insns + cUnit->currentDalvikOffset + tableOffset;
+  const uint16_t* table = cUnit->insns + cUnit->currentDalvikOffset + tableOffset;
   // Add the table to the list - we'll process it later
   FillArrayData *tabRec = (FillArrayData *)
      oatNew(cUnit, sizeof(FillArrayData), true, kAllocData);
   tabRec->table = table;
   tabRec->vaddr = cUnit->currentDalvikOffset;
-  u2 width = tabRec->table[1];
-  u4 size = tabRec->table[2] | (((u4)tabRec->table[3]) << 16);
+  uint16_t width = tabRec->table[1];
+  uint32_t size = tabRec->table[2] | ((static_cast<uint32_t>(tabRec->table[3])) << 16);
   tabRec->size = (size * width) + 8;
 
   oatInsertGrowableList(cUnit, &cUnit->fillArrayData, (intptr_t)tabRec);
@@ -456,10 +456,10 @@
  * Handle simple case (thin lock) inline.  If it's complicated, bail
  * out to the heavyweight lock/unlock routines.  We'll use dedicated
  * registers here in order to be in the right position in case we
- * to bail to dvm[Lock/Unlock]Object(self, object)
+ * to bail to oat[Lock/Unlock]Object(self, object)
  *
- * r0 -> self pointer [arg0 for dvm[Lock/Unlock]Object
- * r1 -> object [arg1 for dvm[Lock/Unlock]Object
+ * r0 -> self pointer [arg0 for oat[Lock/Unlock]Object
+ * r1 -> object [arg1 for oat[Lock/Unlock]Object
  * r2 -> intial contents of object->lock, later result of strex
  * r3 -> self->threadId
  * r12 -> allow to be used by utilities as general temp
diff --git a/src/compiler/codegen/arm/codegen.h b/src/compiler/codegen/arm/codegen.h
deleted file mode 100644
index 47f45c6..0000000
--- a/src/compiler/codegen/arm/codegen.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/* This file contains register alloction support. */
-
-#include "../../compiler_ir.h"
-
-namespace art {
-
-#if defined(_CODEGEN_C)
-LIR *opRegImm(CompilationUnit* cUnit, OpKind op, int rDestSrc1, int value);
-LIR *opRegReg(CompilationUnit* cUnit, OpKind op, int rDestSrc1, int rSrc2);
-LIR* opCmpImmBranch(CompilationUnit* cUnit, ConditionCode cond, int reg,
-                    int checkValue, LIR* target);
-bool genNegLong(CompilationUnit* cUnit, RegLocation rlDest,
-                RegLocation rlSrc);
-
-/* Forward declaraton the portable versions due to circular dependency */
-bool genArithOpFloatPortable(CompilationUnit* cUnit, Instruction::Code opcode,
-                             RegLocation rlDest, RegLocation rlSrc1,
-                             RegLocation rlSrc2);
-
-bool genArithOpDoublePortable(CompilationUnit* cUnit, Instruction::Code opcode,
-                              RegLocation rlDest, RegLocation rlSrc1,
-                              RegLocation rlSrc2);
-
-bool genConversionPortable(CompilationUnit* cUnit, Instruction::Code opcode,
-                           RegLocation rlDest, RegLocation rlSrc);
-
-ArmConditionCode oatArmConditionEncoding(ConditionCode code);
-
-int loadHelper(CompilationUnit* cUnit, int offset);
-LIR* loadConstant(CompilationUnit* cUnit, int reg, int immVal);
-void opRegCopyWide(CompilationUnit* cUnit, int destLo, int destHi,
-                   int srcLo, int srcHi);
-LIR* opRegCopy(CompilationUnit* cUnit, int rDest, int rSrc);
-void freeRegLocTemps(CompilationUnit* cUnit, RegLocation rlKeep,
-                     RegLocation rlFree);
-
-
-/*
- * Return most flexible allowed register class based on size.
- * Bug: 2813841
- * Must use a core register for data types narrower than word (due
- * to possible unaligned load/store.
- */
-inline RegisterClass oatRegClassBySize(OpSize size)
-{
-  return (size == kUnsignedHalf ||
-          size == kSignedHalf ||
-          size == kUnsignedByte ||
-          size == kSignedByte ) ? kCoreReg : kAnyReg;
-}
-
-/*
- * Construct an s4 from two consecutive half-words of switch data.
- * This needs to check endianness because the DEX optimizer only swaps
- * half-words in instruction stream.
- *
- * "switchData" must be 32-bit aligned.
- */
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-inline s4 s4FromSwitchData(const void* switchData) {
-  return *(s4*) switchData;
-}
-#else
-inline s4 s4FromSwitchData(const void* switchData) {
-  u2* data = switchData;
-  return data[0] | (((s4) data[1]) << 16);
-}
-#endif
-
-#endif
-
-extern void oatSetupResourceMasks(CompilationUnit* cUnit, LIR* lir);
-
-extern LIR* oatRegCopyNoInsert(CompilationUnit* cUnit, int rDest, int rSrc);
-
-bool genAddLong(CompilationUnit* cUnit, RegLocation rlDest,
-                RegLocation rlSrc1, RegLocation rlSrc2);
-bool genSubLong(CompilationUnit* cUnit, RegLocation rlDest,
-                RegLocation rlSrc1, RegLocation rlSrc2);
-bool genAndLong(CompilationUnit* cUnit, RegLocation rlDest,
-                RegLocation rlSrc1, RegLocation rlSrc2);
-bool genOrLong(CompilationUnit* cUnit, RegLocation rlDest,
-               RegLocation rlSrc1, RegLocation rlSrc2);
-bool genXorLong(CompilationUnit* cUnit, RegLocation rlDest,
-               RegLocation rlSrc1, RegLocation rlSrc2);
-
-}  // namespace art
diff --git a/src/compiler/codegen/arm/target_arm.cc b/src/compiler/codegen/arm/target_arm.cc
index fc643ea..5838ca7 100644
--- a/src/compiler/codegen/arm/target_arm.cc
+++ b/src/compiler/codegen/arm/target_arm.cc
@@ -16,7 +16,8 @@
 
 #include "../../compiler_internals.h"
 #include "arm_lir.h"
-#include "../ralloc.h"
+#include "../ralloc_util.h"
+#include "../codegen_util.h"
 
 #include <string>
 
@@ -122,9 +123,9 @@
 /*
  * Decode the register id.
  */
-u8 getRegMaskCommon(CompilationUnit* cUnit, int reg)
+uint64_t getRegMaskCommon(CompilationUnit* cUnit, int reg)
 {
-  u8 seed;
+  uint64_t seed;
   int shift;
   int regId;
 
@@ -206,7 +207,7 @@
   }
   /* Fixup for kThumbPush/lr and kThumbPop/pc */
   if (opcode == kThumbPush || opcode == kThumbPop) {
-    u8 r8Mask = oatGetRegMaskCommon(cUnit, r8);
+    uint64_t r8Mask = oatGetRegMaskCommon(cUnit, r8);
     if ((opcode == kThumbPush) && (lir->useMask & r8Mask)) {
       lir->useMask &= ~r8Mask;
       lir->useMask |= ENCODE_ARM_REG_LR;
@@ -310,7 +311,7 @@
 int expandImmediate(int value)
 {
   int mode = (value & 0xf00) >> 8;
-  u4 bits = value & 0xff;
+  uint32_t bits = value & 0xff;
   switch (mode) {
     case 0:
       return bits;
@@ -472,7 +473,7 @@
   return buf;
 }
 
-void oatDumpResourceMask(LIR* lir, u8 mask, const char* prefix)
+void oatDumpResourceMask(LIR* lir, uint64_t mask, const char* prefix)
 {
   char buf[256];
   buf[0] = 0;
@@ -591,21 +592,6 @@
   return true;
 }
 
-int oatTargetOptHint(int key)
-{
-  int res = 0;
-  switch (key) {
-    case kMaxHoistDistance:
-      res = 7;
-      break;
-    default:
-      LOG(FATAL) << "Unknown target optimization hint key: " << key;
-    }
-  return res;
-}
-
-/* This file contains codegen for the Thumb ISA. */
-
 /*
  * Alloc a pair of core registers, or a double.  Low reg in low byte,
  * high reg in next byte.
@@ -755,8 +741,7 @@
       SRegToVReg(cUnit, info1->sReg))
       info1 = info2;
     int vReg = SRegToVReg(cUnit, info1->sReg);
-    oatFlushRegWideImpl(cUnit, rARM_SP, oatVRegOffset(cUnit, vReg),
-                        info1->reg, info1->partner);
+    storeBaseDispWide(cUnit, rARM_SP, oatVRegOffset(cUnit, vReg), info1->reg, info1->partner);
   }
 }
 
@@ -766,7 +751,7 @@
   if (info->live && info->dirty) {
     info->dirty = false;
     int vReg = SRegToVReg(cUnit, info->sReg);
-    oatFlushRegImpl(cUnit, rARM_SP, oatVRegOffset(cUnit, vReg), reg, kWord);
+    storeBaseDisp(cUnit, rARM_SP, oatVRegOffset(cUnit, vReg), reg, kWord);
   }
 }
 
diff --git a/src/compiler/codegen/arm/utility_arm.cc b/src/compiler/codegen/arm/utility_arm.cc
index e83093b..9069826 100644
--- a/src/compiler/codegen/arm/utility_arm.cc
+++ b/src/compiler/codegen/arm/utility_arm.cc
@@ -59,9 +59,9 @@
   return loadPcRel;
 }
 
-int leadingZeros(u4 val)
+int leadingZeros(uint32_t val)
 {
-  u4 alt;
+  uint32_t alt;
   int n;
   int count;
 
@@ -82,11 +82,11 @@
  * Determine whether value can be encoded as a Thumb2 modified
  * immediate.  If not, return -1.  If so, return i:imm3:a:bcdefgh form.
  */
-int modifiedImmediate(u4 value)
+int modifiedImmediate(uint32_t value)
 {
    int zLeading;
    int zTrailing;
-   u4 b0 = value & 0xff;
+   uint32_t b0 = value & 0xff;
 
    /* Note: case of value==0 must use 0:000:0:0000000 encoding */
    if (value <= 0xFF)
diff --git a/src/compiler/codegen/codegen_util.cc b/src/compiler/codegen/codegen_util.cc
index b0a1e44..6ce48ab 100644
--- a/src/compiler/codegen/codegen_util.cc
+++ b/src/compiler/codegen/codegen_util.cc
@@ -17,13 +17,14 @@
 #include "gc_map.h"
 #include "verifier/dex_gc_map.h"
 #include "verifier/method_verifier.h"
+#include "codegen_util.h"
 
 namespace art {
 
 void setMemRefType(LIR* lir, bool isLoad, int memType)
 {
-  u8 *maskPtr;
-  u8 mask = ENCODE_MEM;;
+  uint64_t *maskPtr;
+  uint64_t mask = ENCODE_MEM;;
   DCHECK(EncodingMap[lir->opcode].flags & (IS_LOAD | IS_STORE));
   if (isLoad) {
     maskPtr = &lir->useMask;
@@ -68,7 +69,7 @@
   lir->aliasInfo = ENCODE_ALIAS_INFO(regId, is64bit);
 }
 
-u8 oatGetRegMaskCommon(CompilationUnit* cUnit, int reg)
+uint64_t oatGetRegMaskCommon(CompilationUnit* cUnit, int reg)
 {
   return getRegMaskCommon(cUnit, reg);
 }
@@ -76,13 +77,13 @@
 /*
  * Mark the corresponding bit(s).
  */
-inline void setupRegMask(CompilationUnit* cUnit, u8* mask, int reg)
+inline void setupRegMask(CompilationUnit* cUnit, uint64_t* mask, int reg)
 {
   *mask |= getRegMaskCommon(cUnit, reg);
 }
 
 /* Exported version of setupRegMask */
-void oatSetupRegMask(CompilationUnit* cUnit, u8* mask, int reg)
+void oatSetupRegMask(CompilationUnit* cUnit, uint64_t* mask, int reg)
 {
   setupRegMask(cUnit, mask, reg);
 }
@@ -493,8 +494,6 @@
 LIR* addWideData(CompilationUnit* cUnit, LIR* *constantListP,
                int valLo, int valHi)
 {
-  //FIXME: hard-coded little endian, need BE variant
-  // Insert high word into list first
   addWordData(cUnit, constantListP, valHi);
   return addWordData(cUnit, constantListP, valLo);
 }
@@ -943,7 +942,7 @@
 
 void markPackedCaseLabels(CompilationUnit* cUnit, SwitchTable *tabRec)
 {
-  const u2* table = tabRec->table;
+  const uint16_t* table = tabRec->table;
   int baseVaddr = tabRec->vaddr;
   int *targets = (int*)&table[4];
   int entries = table[1];
@@ -956,7 +955,7 @@
 
 void markSparseCaseLabels(CompilationUnit* cUnit, SwitchTable *tabRec)
 {
-  const u2* table = tabRec->table;
+  const uint16_t* table = tabRec->table;
   int baseVaddr = tabRec->vaddr;
   int entries = table[1];
   int* keys = (int*)&table[2];
@@ -985,9 +984,7 @@
   }
 }
 
-//FIXME: Do we have endian issues here?
-
-void dumpSparseSwitchTable(const u2* table)
+void dumpSparseSwitchTable(const uint16_t* table)
   /*
    * Sparse switch data format:
    *  ushort ident = 0x0200   magic value
@@ -998,7 +995,7 @@
    * Total size is (2+size*4) 16-bit code units.
    */
 {
-  u2 ident = table[0];
+  uint16_t ident = table[0];
   int entries = table[1];
   int* keys = (int*)&table[2];
   int* targets = &keys[entries];
@@ -1009,7 +1006,7 @@
   }
 }
 
-void dumpPackedSwitchTable(const u2* table)
+void dumpPackedSwitchTable(const uint16_t* table)
   /*
    * Packed switch data format:
    *  ushort ident = 0x0100   magic value
@@ -1020,7 +1017,7 @@
    * Total size is (4+size*2) 16-bit code units.
    */
 {
-  u2 ident = table[0];
+  uint16_t ident = table[0];
   int* targets = (int*)&table[4];
   int entries = table[1];
   int lowKey = s4FromSwitchData(&table[2]);
diff --git a/src/compiler/codegen/codegen_util.h b/src/compiler/codegen/codegen_util.h
new file mode 100644
index 0000000..49d52e8
--- /dev/null
+++ b/src/compiler/codegen/codegen_util.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ART_SRC_COMPILER_CODEGEN_CODEGENUTIL_H_
+#define ART_SRC_COMPILER_CODEGEN_CODEGENUTIL_H_
+
+namespace art {
+
+inline int32_t s4FromSwitchData(const void* switchData) { return *(int32_t*) switchData; }
+inline RegisterClass oatRegClassBySize(OpSize size) { return (size == kUnsignedHalf || size == kSignedHalf || size == kUnsignedByte || size == kSignedByte ) ? kCoreReg : kAnyReg; }
+void oatAssembleLIR(CompilationUnit* cUnit);
+void setMemRefType(LIR* lir, bool isLoad, int memType);
+void annotateDalvikRegAccess(LIR* lir, int regId, bool isLoad, bool is64bit);
+uint64_t oatGetRegMaskCommon(CompilationUnit* cUnit, int reg);
+void oatSetupRegMask(CompilationUnit* cUnit, uint64_t* mask, int reg);
+void setupResourceMasks(CompilationUnit* cUnit, LIR* lir);
+void oatDumpLIRInsn(CompilationUnit* cUnit, LIR* arg, unsigned char* baseAddr);
+void oatDumpPromotionMap(CompilationUnit *cUnit);
+void dumpMappingTable(const char* table_name, const std::string& descriptor, const std::string& name, const std::string& signature, const std::vector<uint32_t>& v);
+void oatCodegenDump(CompilationUnit* cUnit);
+// TODO: remove default parameters
+LIR* rawLIR(CompilationUnit* cUnit, int dalvikOffset, int opcode, int op0 = 0, int op1 = 0, int op2 = 0, int op3 = 0, int op4 = 0, LIR* target = NULL);
+LIR* newLIR0(CompilationUnit* cUnit, int opcode);
+LIR* newLIR1(CompilationUnit* cUnit, int opcode, int dest);
+LIR* newLIR2(CompilationUnit* cUnit, int opcode, int dest, int src1);
+LIR* newLIR3(CompilationUnit* cUnit, int opcode, int dest, int src1, int src2);
+LIR* newLIR4(CompilationUnit* cUnit, int opcode, int dest, int src1, int src2, int info);
+LIR* newLIR5(CompilationUnit* cUnit, int opcode, int dest, int src1, int src2, int info1, int info2);
+LIR* scanLiteralPool(LIR* dataTarget, int value, unsigned int delta);
+LIR* scanLiteralPoolWide(LIR* dataTarget, int valLo, int valHi);
+LIR* addWordData(CompilationUnit* cUnit, LIR* *constantListP, int value);
+LIR* addWideData(CompilationUnit* cUnit, LIR* *constantListP, int valLo, int valHi);
+void oatProcessSwitchTables(CompilationUnit* cUnit);
+void dumpSparseSwitchTable(const uint16_t* table);
+void dumpPackedSwitchTable(const uint16_t* table);
+LIR* markBoundary(CompilationUnit* cUnit, int offset, const char* instStr);
+
+}  // namespace art
+
+#endif // ART_SRC_COMPILER_CODEGEN_CODEGENUTIL_H_
diff --git a/src/compiler/codegen/compiler_codegen.h b/src/compiler/codegen/compiler_codegen.h
index 45838c1..2d13965 100644
--- a/src/compiler/codegen/compiler_codegen.h
+++ b/src/compiler/codegen/compiler_codegen.h
@@ -21,7 +21,6 @@
 
 namespace art {
 
-
 // Set to 1 to measure cost of suspend check
 #define NO_SUSPEND 0
 
@@ -127,123 +126,11 @@
 #define REG_USE12            (REG_USE1 | REG_USE2)
 #define REG_USE23            (REG_USE2 | REG_USE3)
 
-LIR* rawLIR(CompilationUnit* cUnit, int dalvikOffset, int opcode, int op0 = 0,
-            int op1 = 0, int op2 = 0, int op3 = 0, int op4 = 0,
-            LIR* target = NULL);
-
-int oatGetInsnSize(LIR* lir);
-
-void genFusedLongCmpBranch(CompilationUnit* cUnit, BasicBlock* bb, MIR* mir);
-void genFusedFPCmpBranch(CompilationUnit* cUnit, BasicBlock* bb, MIR* mir,
-                         bool gtBias, bool isDouble);
-
-CallInfo* oatNewCallInfo(CompilationUnit* cUnit, BasicBlock* bb, MIR* mir,
-                         InvokeType type, bool isRange);
-
-/* Lower middle-level IR to low-level IR for the whole method */
-void oatMethodMIR2LIR(CompilationUnit* cUnit);
-
-/* Bitcode conversions */
-void oatMethodMIR2Bitcode(CompilationUnit* cUnit);
-void oatMethodBitcode2LIR(CompilationUnit* cUnit);
-
-/* Lower middle-level IR to low-level IR for the simple methods */
-void oatSpecialMIR2LIR(CompilationUnit* cUnit, SpecialCaseHandler specialCase );
-
-/* Assemble LIR into machine code */
-void oatAssembleLIR(CompilationUnit* cUnit);
-AssemblerStatus oatAssembleInstructions(CompilationUnit* cUnit,
-                                        intptr_t startAddr);
-void oatAssignOffsets(CompilationUnit* cUnit);
-int oatAssignInsnOffsets(CompilationUnit* cUnit);
-
-/* Implemented in the codegen/<target>/ArchUtility.c */
-void oatCodegenDump(CompilationUnit* cUnit);
-void oatDumpPromotionMap(CompilationUnit* cUnit);
-std::string buildInsnString(const char* fmt, LIR* lir,
-                            unsigned char* baseAddr);
-
-
-/* Implemented in codegen/<target>/Ralloc.c */
-void oatSimpleRegAlloc(CompilationUnit* cUnit);
-
-/* Implemented in codegen/<target>/Thumb<version>Util.c */
-void oatInitializeRegAlloc(CompilationUnit* cUnit);
-
-/* Implemented in codegen/<target>/<target_variant>/ArchVariant.c */
-InstructionSet oatInstructionSet();
-
-/*
- * Implemented in codegen/<target>/<target_variant>/ArchVariant.c
- * Architecture-specific initializations and checks
- */
-bool oatArchVariantInit(void);
-
-/* Implemented in codegen/<target>/<target_variant>/ArchVariant.c */
-int oatTargetOptHint(int key);
-
-/* Implemented in codegen/<target>/<target_variant>/ArchVariant.c */
-void oatGenMemBarrier(CompilationUnit* cUnit, int barrierKind);
-
-LIR* genRegMemCheck(CompilationUnit* cUnit, ConditionCode cCode,
-                    int reg1, int base, int offset, ThrowKind kind);
-LIR* opThreadMem(CompilationUnit* cUnit, OpKind op, int threadOffset);
-LIR* opMem(CompilationUnit* cUnit, OpKind op, int rBase, int disp);
-LIR* storeBaseIndexedDisp(CompilationUnit *cUnit,
-                          int rBase, int rIndex, int scale, int displacement,
-                          int rSrc, int rSrcHi, OpSize size, int sReg);
-LIR* opRegMem(CompilationUnit *cUnit, OpKind op, int rDest, int rBase, int offset);
-LIR* opCmpBranch(CompilationUnit* cUnit, ConditionCode cond, int src1,
-                 int src2, LIR* target);
-void oatSetupRegMask(CompilationUnit* cUnit, u8* mask, int reg);
-u8 oatGetRegMaskCommon(CompilationUnit* cUnit, int reg);
-void setupTargetResourceMasks(CompilationUnit* cUnit, LIR* lir);
-RegLocation genDivRem(CompilationUnit* cUnit, RegLocation rlDest, int regLo, int regHi, bool isDiv);
-RegLocation genDivRemLit(CompilationUnit* cUnit, RegLocation rlDest, int regLo, int lit, bool isDiv);
-void markGCCard(CompilationUnit* cUnit, int valReg, int tgtAddrReg);
-bool genInlinedMinMaxInt(CompilationUnit *cUnit, CallInfo* info, bool isMin);
-void opLea(CompilationUnit* cUnit, int rBase, int reg1, int reg2, int scale, int offset);
-void opTlsCmp(CompilationUnit* cUnit, int offset, int val);
-bool genInlinedSqrt(CompilationUnit* cUnit, CallInfo* info);
-bool genInlinedCas32(CompilationUnit* cUnit, CallInfo* info, bool need_write_barrier);
-LIR* opPcRelLoad(CompilationUnit* cUnit, int reg, LIR* target);
-LIR* opVldm(CompilationUnit* cUnit, int rBase, int count);
-LIR* opVstm(CompilationUnit* cUnit, int rBase, int count);
-void genMultiplyByTwoBitMultiplier(CompilationUnit* cUnit, RegLocation rlSrc,
-                                   RegLocation rlResult, int lit,
-                                   int firstBit, int secondBit);
-RegLocation inlineTarget(CompilationUnit* cUnit, CallInfo* info);
-RegLocation inlineTargetWide(CompilationUnit* cUnit, CallInfo* info);
-void genDivZeroCheck(CompilationUnit* cUnit, int regLo, int regHi);
-LIR* genImmedCheck(CompilationUnit* cUnit, ConditionCode cCode,
-                   int reg, int immVal, ThrowKind kind);
-LIR* opTestSuspend(CompilationUnit* cUnit, LIR* target);
-LIR* opDecAndBranch(CompilationUnit* cUnit, ConditionCode cCode, int reg, LIR* target);
-LIR* opIT(CompilationUnit* cUnit, ArmConditionCode cond, const char* guide);
-uint64_t getPCUseDefEncoding();
-uint64_t getRegMaskCommon(CompilationUnit* cUnit, int reg);
-// TODO: clean up include files
-int s2d(int lowReg, int highReg);
-bool fpReg(int reg);
-bool singleReg(int reg);
-bool doubleReg(int reg);
-uint32_t fpRegMask();
-bool sameRegType(int reg1, int reg2);
-int targetReg(SpecialTargetRegister reg);
-RegLocation locCReturn();
-RegLocation locCReturnWide();
-RegLocation locCReturnFloat();
-RegLocation locCReturnDouble();
-LIR* loadWordDisp(CompilationUnit* cUnit, int rBase, int displacement, int rDest);
-LIR *storeWordDisp(CompilationUnit *cUnit, int rBase,
-                       int displacement, int rSrc);
-void removeRedundantBranches(CompilationUnit* cUnit);
-LIR* newLIR0(CompilationUnit* cUnit, int opcode);
-LIR* newLIR1(CompilationUnit* cUnit, int opcode, int dest);
-LIR *opRegImm(CompilationUnit *cUnit, OpKind op, int rDestSrc1, int value);
-void spillCoreRegs(CompilationUnit* cUnit);
-void unSpillCoreRegs(CompilationUnit* cUnit);
-void opRegThreadMem(CompilationUnit* cUnit, OpKind op, int rDest, int threadOffset);
+// TEMP
+#include "gen_loadstore.h"
+#include "gen_common.h"
+#include "gen_invoke.h"
+#include "target_list.h"
 
 }  // namespace art
 
diff --git a/src/compiler/codegen/gen_common.cc b/src/compiler/codegen/gen_common.cc
index bc61c54..fe10fe4 100644
--- a/src/compiler/codegen/gen_common.cc
+++ b/src/compiler/codegen/gen_common.cc
@@ -18,14 +18,14 @@
 
 namespace art {
 
+//TODO: remove decl.
+void genInvoke(CompilationUnit* cUnit, CallInfo* info);
+
 /*
  * This source files contains "gen" codegen routines that should
  * be applicable to most targets.  Only mid-level support utilities
  * and "op" calls may be used here.
  */
-void genInvoke(CompilationUnit* cUnit, CallInfo* info);
-bool smallLiteralDivide(CompilationUnit* cUnit, Instruction::Code dalvikOpcode,
-                        RegLocation rlSrc, RegLocation rlDest, int lit);
 
 void markSafepointPC(CompilationUnit* cUnit, LIR* inst)
 {
@@ -2161,7 +2161,6 @@
   return false;
 }
 
-void genNegFloat(CompilationUnit* cUnit, RegLocation rlDest, RegLocation rlSrc);
 bool genArithOpFloatPortable(CompilationUnit* cUnit, Instruction::Code opcode,
                              RegLocation rlDest, RegLocation rlSrc1,
                              RegLocation rlSrc2)
@@ -2204,7 +2203,6 @@
   return false;
 }
 
-void genNegDouble(CompilationUnit* cUnit, RegLocation rlDst, RegLocation rlSrc);
 bool genArithOpDoublePortable(CompilationUnit* cUnit, Instruction::Code opcode,
                               RegLocation rlDest, RegLocation rlSrc1,
                               RegLocation rlSrc2)
diff --git a/src/compiler/codegen/gen_common.h b/src/compiler/codegen/gen_common.h
new file mode 100644
index 0000000..db4b74c
--- /dev/null
+++ b/src/compiler/codegen/gen_common.h
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ART_SRC_COMPILER_CODEGEN_GENCOMMON_H_
+#define ART_SRC_COMPILER_CODEGEN_GENCOMMON_H_
+
+void markSafepointPC(CompilationUnit* cUnit, LIR* inst);
+void callRuntimeHelperImm(CompilationUnit* cUnit, int helperOffset, int arg0, bool safepointPC);
+void callRuntimeHelperReg(CompilationUnit* cUnit, int helperOffset, int arg0, bool safepointPC);
+void callRuntimeHelperRegLocation(CompilationUnit* cUnit, int helperOffset, RegLocation arg0, bool safepointPC);
+void callRuntimeHelperImmImm(CompilationUnit* cUnit, int helperOffset, int arg0, int arg1, bool safepointPC);
+void callRuntimeHelperImmRegLocation(CompilationUnit* cUnit, int helperOffset, int arg0, RegLocation arg1, bool safepointPC);
+void callRuntimeHelperRegLocationImm(CompilationUnit* cUnit, int helperOffset, RegLocation arg0, int arg1, bool safepointPC);
+void callRuntimeHelperImmReg(CompilationUnit* cUnit, int helperOffset, int arg0, int arg1, bool safepointPC);
+void callRuntimeHelperRegImm(CompilationUnit* cUnit, int helperOffset, int arg0, int arg1, bool safepointPC);
+void callRuntimeHelperImmMethod(CompilationUnit* cUnit, int helperOffset, int arg0, bool safepointPC);
+void callRuntimeHelperRegLocationRegLocation(CompilationUnit* cUnit, int helperOffset, RegLocation arg0, RegLocation arg1, bool safepointPC);
+void callRuntimeHelperRegReg(CompilationUnit* cUnit, int helperOffset, int arg0, int arg1, bool safepointPC);
+void callRuntimeHelperRegRegImm(CompilationUnit* cUnit, int helperOffset, int arg0, int arg1, int arg2, bool safepointPC);
+void callRuntimeHelperImmMethodRegLocation(CompilationUnit* cUnit, int helperOffset, int arg0, RegLocation arg2, bool safepointPC);
+void callRuntimeHelperImmMethodImm(CompilationUnit* cUnit, int helperOffset, int arg0, int arg2, bool safepointPC);
+void callRuntimeHelperImmRegLocationRegLocation(CompilationUnit* cUnit, int helperOffset, int arg0, RegLocation arg1, RegLocation arg2, bool safepointPC);
+void genBarrier(CompilationUnit* cUnit);
+LIR* opUnconditionalBranch(CompilationUnit* cUnit, LIR* target);
+LIR* genCheck(CompilationUnit* cUnit, ConditionCode cCode, ThrowKind kind);
+LIR* genImmedCheck(CompilationUnit* cUnit, ConditionCode cCode, int reg, int immVal, ThrowKind kind);
+LIR* genNullCheck(CompilationUnit* cUnit, int sReg, int mReg, int optFlags);
+LIR* genRegRegCheck(CompilationUnit* cUnit, ConditionCode cCode, int reg1, int reg2, ThrowKind kind);
+void genCompareAndBranch(CompilationUnit* cUnit, Instruction::Code opcode, RegLocation rlSrc1, RegLocation rlSrc2, LIR* taken, LIR* fallThrough);
+void genCompareZeroAndBranch(CompilationUnit* cUnit, Instruction::Code opcode, RegLocation rlSrc, LIR* taken, LIR* fallThrough);
+void genIntToLong(CompilationUnit* cUnit, RegLocation rlDest, RegLocation rlSrc);
+void genIntNarrowing(CompilationUnit* cUnit, Instruction::Code opcode, RegLocation rlDest, RegLocation rlSrc);
+void genNewArray(CompilationUnit* cUnit, uint32_t type_idx, RegLocation rlDest, RegLocation rlSrc);
+void genFilledNewArray(CompilationUnit* cUnit, CallInfo* info);
+void genSput(CompilationUnit* cUnit, uint32_t fieldIdx, RegLocation rlSrc, bool isLongOrDouble, bool isObject);
+void genSget(CompilationUnit* cUnit, uint32_t fieldIdx, RegLocation rlDest, bool isLongOrDouble, bool isObject);
+void genShowTarget(CompilationUnit* cUnit);
+void handleSuspendLaunchpads(CompilationUnit *cUnit);
+void handleIntrinsicLaunchpads(CompilationUnit *cUnit);
+void handleThrowLaunchpads(CompilationUnit *cUnit);
+void oatSetupResourceMasks(CompilationUnit* cUnit, LIR* lir);
+bool fastInstance(CompilationUnit* cUnit,  uint32_t fieldIdx, int& fieldOffset, bool& isVolatile, bool isPut);
+void genIGet(CompilationUnit* cUnit, uint32_t fieldIdx, int optFlags, OpSize size, RegLocation rlDest, RegLocation rlObj, bool isLongOrDouble, bool isObject);
+void genIPut(CompilationUnit* cUnit, uint32_t fieldIdx, int optFlags, OpSize size, RegLocation rlSrc, RegLocation rlObj, bool isLongOrDouble, bool isObject);
+void genConstClass(CompilationUnit* cUnit, uint32_t type_idx, RegLocation rlDest);
+void genConstString(CompilationUnit* cUnit, uint32_t string_idx, RegLocation rlDest);
+void genNewInstance(CompilationUnit* cUnit, uint32_t type_idx, RegLocation rlDest);
+void genMoveException(CompilationUnit* cUnit, RegLocation rlDest);
+void genThrow(CompilationUnit* cUnit, RegLocation rlSrc);
+void genInstanceof(CompilationUnit* cUnit, uint32_t type_idx, RegLocation rlDest, RegLocation rlSrc);
+void genCheckCast(CompilationUnit* cUnit, uint32_t type_idx, RegLocation rlSrc);
+void genArrayObjPut(CompilationUnit* cUnit, int optFlags, RegLocation rlArray, RegLocation rlIndex, RegLocation rlSrc, int scale);
+void genArrayGet(CompilationUnit* cUnit, int optFlags, OpSize size, RegLocation rlArray, RegLocation rlIndex, RegLocation rlDest, int scale);
+void genArrayPut(CompilationUnit* cUnit, int optFlags, OpSize size, RegLocation rlArray, RegLocation rlIndex, RegLocation rlSrc, int scale);
+void genLong3Addr(CompilationUnit* cUnit, OpKind firstOp, OpKind secondOp, RegLocation rlDest, RegLocation rlSrc1, RegLocation rlSrc2);
+bool genShiftOpLong(CompilationUnit* cUnit, Instruction::Code opcode, RegLocation rlDest, RegLocation rlSrc1, RegLocation rlShift);
+bool genArithOpInt(CompilationUnit* cUnit, Instruction::Code opcode, RegLocation rlDest, RegLocation rlSrc1, RegLocation rlSrc2);
+bool handleEasyDivide(CompilationUnit* cUnit, Instruction::Code dalvikOpcode, RegLocation rlSrc, RegLocation rlDest, int lit);
+bool handleEasyMultiply(CompilationUnit* cUnit, RegLocation rlSrc, RegLocation rlDest, int lit);
+bool genArithOpIntLit(CompilationUnit* cUnit, Instruction::Code opcode, RegLocation rlDest, RegLocation rlSrc, int lit);
+bool genArithOpLong(CompilationUnit* cUnit, Instruction::Code opcode, RegLocation rlDest, RegLocation rlSrc1, RegLocation rlSrc2);
+bool genConversionCall(CompilationUnit* cUnit, int funcOffset, RegLocation rlDest, RegLocation rlSrc);
+bool genArithOpFloatPortable(CompilationUnit* cUnit, Instruction::Code opcode, RegLocation rlDest, RegLocation rlSrc1, RegLocation rlSrc2);
+bool genArithOpDoublePortable(CompilationUnit* cUnit, Instruction::Code opcode, RegLocation rlDest, RegLocation rlSrc1, RegLocation rlSrc2);
+bool genConversionPortable(CompilationUnit* cUnit, Instruction::Code opcode, RegLocation rlDest, RegLocation rlSrc);
+void genSuspendTest(CompilationUnit* cUnit, int optFlags);
+void genSuspendTestAndBranch(CompilationUnit* cUnit, int optFlags, LIR* target);
+
+#endif // ART_SRC_COMPILER_CODEGEN_GENCOMMON_H_
diff --git a/src/compiler/codegen/gen_invoke.cc b/src/compiler/codegen/gen_invoke.cc
index efd4f5a..bac6a76 100644
--- a/src/compiler/codegen/gen_invoke.cc
+++ b/src/compiler/codegen/gen_invoke.cc
@@ -24,11 +24,6 @@
  * and "op" calls may be used here.
  */
 
-typedef int (*NextCallInsn)(CompilationUnit*, CallInfo*, int, uint32_t dexIdx,
-                            uint32_t methodIdx, uintptr_t directCode,
-                            uintptr_t directMethod, InvokeType type);
-LIR* opCondBranch(CompilationUnit* cUnit, ConditionCode cc, LIR* target);
-
 /*
  * If there are any ins passed in registers that have not been promoted
  * to a callee-save register, flush them to the frame.  Perform intial
@@ -112,7 +107,8 @@
   }
 }
 
-void scanMethodLiteralPool(CompilationUnit* cUnit, LIR** methodTarget, LIR** codeTarget, const DexFile* dexFile, uint32_t dexMethodIdx)
+void scanMethodLiteralPool(CompilationUnit* cUnit, LIR** methodTarget, LIR** codeTarget,
+                           const DexFile* dexFile, uint32_t dexMethodIdx)
 {
   LIR* curTarget = cUnit->methodLiteralList;
   LIR* nextTarget = curTarget != NULL ? curTarget->next : NULL;
diff --git a/src/compiler/codegen/gen_invoke.h b/src/compiler/codegen/gen_invoke.h
new file mode 100644
index 0000000..d4a348c
--- /dev/null
+++ b/src/compiler/codegen/gen_invoke.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ART_SRC_COMPILER_CODEGEN_GENINVOKE_H_
+#define ART_SRC_COMPILER_CODEGEN_GENINVOKE_H_
+
+typedef int (*NextCallInsn)(CompilationUnit*, CallInfo*, int, uint32_t dexIdx,
+                            uint32_t methodIdx, uintptr_t directCode,
+                            uintptr_t directMethod, InvokeType type);
+
+void flushIns(CompilationUnit* cUnit, RegLocation* argLocs, RegLocation rlMethod);
+int genDalvikArgsNoRange(CompilationUnit* cUnit, CallInfo* info, int callState, LIR** pcrLabel, NextCallInsn nextCallInsn, uint32_t dexIdx, uint32_t methodIdx, uintptr_t directCode, uintptr_t directMethod, InvokeType type, bool skipThis);
+int genDalvikArgsRange(CompilationUnit* cUnit, CallInfo* info, int callState, LIR** pcrLabel, NextCallInsn nextCallInsn, uint32_t dexIdx, uint32_t methodIdx, uintptr_t directCode, uintptr_t directMethod, InvokeType type, bool skipThis);
+RegLocation inlineTarget(CompilationUnit* cUnit, CallInfo* info);
+RegLocation inlineTargetWide(CompilationUnit* cUnit, CallInfo* info);
+bool genInlinedCharAt(CompilationUnit* cUnit, CallInfo* info);
+bool genInlinedStringIsEmptyOrLength(CompilationUnit* cUnit, CallInfo* info, bool isEmpty);
+bool genInlinedAbsInt(CompilationUnit *cUnit, CallInfo* info);
+bool genInlinedAbsLong(CompilationUnit *cUnit, CallInfo* info);
+bool genInlinedFloatCvt(CompilationUnit *cUnit, CallInfo* info);
+bool genInlinedDoubleCvt(CompilationUnit *cUnit, CallInfo* info);
+bool genInlinedIndexOf(CompilationUnit* cUnit, CallInfo* info, bool zeroBased);
+bool genInlinedStringCompareTo(CompilationUnit* cUnit, CallInfo* info);
+bool genIntrinsic(CompilationUnit* cUnit, CallInfo* info);
+
+#endif // ART_SRC_COMPILER_CODEGEN_GENINVOKE_H_
diff --git a/src/compiler/codegen/codegen_factory.cc b/src/compiler/codegen/gen_loadstore.cc
similarity index 100%
rename from src/compiler/codegen/codegen_factory.cc
rename to src/compiler/codegen/gen_loadstore.cc
diff --git a/src/compiler/codegen/gen_loadstore.h b/src/compiler/codegen/gen_loadstore.h
new file mode 100644
index 0000000..a06ed79
--- /dev/null
+++ b/src/compiler/codegen/gen_loadstore.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ART_SRC_COMPILER_CODEGEN_GENLOADSTORE_H_
+#define ART_SRC_COMPILER_CODEGEN_GENLOADSTORE_H_
+
+LIR* loadConstant(CompilationUnit* cUnit, int rDest, int value);
+LIR* loadWordDisp(CompilationUnit* cUnit, int rBase, int displacement, int rDest);
+LIR* storeWordDisp(CompilationUnit* cUnit, int rBase, int displacement, int rSrc);
+void loadValueDirect(CompilationUnit* cUnit, RegLocation rlSrc, int rDest);
+void loadValueDirectFixed(CompilationUnit* cUnit, RegLocation rlSrc, int rDest);
+void loadValueDirectWide(CompilationUnit* cUnit, RegLocation rlSrc, int regLo, int regHi);
+void loadValueDirectWideFixed(CompilationUnit* cUnit, RegLocation rlSrc, int regLo, int regHi);
+RegLocation loadValue(CompilationUnit* cUnit, RegLocation rlSrc, RegisterClass opKind);
+void storeValue(CompilationUnit* cUnit, RegLocation rlDest, RegLocation rlSrc);
+RegLocation loadValueWide(CompilationUnit* cUnit, RegLocation rlSrc, RegisterClass opKind);
+void storeValueWide(CompilationUnit* cUnit, RegLocation rlDest, RegLocation rlSrc);
+void loadCurrMethodDirect(CompilationUnit *cUnit, int rTgt);
+RegLocation loadCurrMethod(CompilationUnit *cUnit);
+bool methodStarInReg(CompilationUnit* cUnit);
+
+#endif // ART_SRC_COMPILER_CODEGEN_GENLOADSTORE_H_
diff --git a/src/compiler/codegen/local_optimizations.cc b/src/compiler/codegen/local_optimizations.cc
index 2688d65..e485f03 100644
--- a/src/compiler/codegen/local_optimizations.cc
+++ b/src/compiler/codegen/local_optimizations.cc
@@ -43,7 +43,7 @@
 {
   /* Insert a move to replace the load */
   LIR* moveLIR;
-  moveLIR = oatRegCopyNoInsert( cUnit, dest, src);
+  moveLIR = opRegCopyNoInsert( cUnit, dest, src);
   /*
    * Insert the converted instruction after the original since the
    * optimization is scannng in the top-down order and the new instruction
@@ -102,7 +102,7 @@
     bool isThisLIRLoad = EncodingMap[thisLIR->opcode].flags & IS_LOAD;
     LIR* checkLIR;
     /* Use the mem mask to determine the rough memory location */
-    u8 thisMemMask = (thisLIR->useMask | thisLIR->defMask) & ENCODE_MEM;
+    uint64_t thisMemMask = (thisLIR->useMask | thisLIR->defMask) & ENCODE_MEM;
 
     /*
      * Currently only eliminate redundant ld/st for constant and Dalvik
@@ -110,8 +110,8 @@
      */
     if (!(thisMemMask & (ENCODE_LITERAL | ENCODE_DALVIK_REG))) continue;
 
-    u8 stopDefRegMask = thisLIR->defMask & ~ENCODE_MEM;
-    u8 stopUseRegMask;
+    uint64_t stopDefRegMask = thisLIR->defMask & ~ENCODE_MEM;
+    uint64_t stopUseRegMask;
     if (cUnit->instructionSet == kX86) {
       stopUseRegMask = (IS_BRANCH | thisLIR->useMask) & ~ENCODE_MEM;
     } else {
@@ -134,8 +134,8 @@
        */
       if (checkLIR->flags.isNop) continue;
 
-      u8 checkMemMask = (checkLIR->useMask | checkLIR->defMask) & ENCODE_MEM;
-      u8 aliasCondition = thisMemMask & checkMemMask;
+      uint64_t checkMemMask = (checkLIR->useMask | checkLIR->defMask) & ENCODE_MEM;
+      uint64_t aliasCondition = thisMemMask & checkMemMask;
       bool stopHere = false;
 
       /*
@@ -287,7 +287,7 @@
       continue;
     }
 
-    u8 stopUseAllMask = thisLIR->useMask;
+    uint64_t stopUseAllMask = thisLIR->useMask;
 
     if (cUnit->instructionSet != kX86) {
       /*
@@ -302,8 +302,8 @@
     }
 
     /* Similar as above, but just check for pure register dependency */
-    u8 stopUseRegMask = stopUseAllMask & ~ENCODE_MEM;
-    u8 stopDefRegMask = thisLIR->defMask & ~ENCODE_MEM;
+    uint64_t stopUseRegMask = stopUseAllMask & ~ENCODE_MEM;
+    uint64_t stopDefRegMask = thisLIR->defMask & ~ENCODE_MEM;
 
     int nextSlot = 0;
     bool stopHere = false;
@@ -319,8 +319,8 @@
        */
       if (checkLIR->flags.isNop) continue;
 
-      u8 checkMemMask = checkLIR->defMask & ENCODE_MEM;
-      u8 aliasCondition = stopUseAllMask & checkMemMask;
+      uint64_t checkMemMask = checkLIR->defMask & ENCODE_MEM;
+      uint64_t aliasCondition = stopUseAllMask & checkMemMask;
       stopHere = false;
 
       /* Potential WAR alias seen - check the exact relation */
diff --git a/src/compiler/codegen/optimizer.h b/src/compiler/codegen/local_optimizations.h
similarity index 73%
rename from src/compiler/codegen/optimizer.h
rename to src/compiler/codegen/local_optimizations.h
index f5c81a6..440090f 100644
--- a/src/compiler/codegen/optimizer.h
+++ b/src/compiler/codegen/local_optimizations.h
@@ -14,19 +14,13 @@
  * limitations under the License.
  */
 
-#ifndef ART_SRC_COMPILER_COMPILER_OPTIMIZATION_H_
-#define ART_SRC_COMPILER_COMPILER_OPTIMIZATION_H_
-
-#include "../dalvik.h"
+#ifndef ART_SRC_COMPILER_CODEGEN_LOCALOPTIMIZATIONS_H_
+#define ART_SRC_COMPILER_CODEGEN_LOCALOPTIMIZATIONS_H_
 
 namespace art {
 
-/* Forward declarations */
-struct CompilationUnit;
-struct LIR;
-
-void oatApplyLocalOptimizations(CompilationUnit* cUnit, LIR* head, LIR* tail);
+void oatApplyLocalOptimizations(CompilationUnit* cUnit, LIR* headLIR, LIR* tailLIR);
 
 }  // namespace art
 
-#endif  // ART_SRC_COMPILER_COMPILER_OPTIMIZATION_H_
+#endif // ART_SRC_COMPILER_CODEGEN_LOCALOPTIMIZATIONS_H_
diff --git a/src/compiler/codegen/method_bitcode.cc b/src/compiler/codegen/method_bitcode.cc
index 1e81458..d6f1ae9 100644
--- a/src/compiler/codegen/method_bitcode.cc
+++ b/src/compiler/codegen/method_bitcode.cc
@@ -27,6 +27,9 @@
 #include <llvm/Support/Casting.h>
 #include <llvm/Support/InstIterator.h>
 
+#include "method_codegen_driver.h"
+#include "local_optimizations.h"
+
 static const char* kLabelFormat = "%c0x%x_%d";
 static const char kInvalidBlock = 0xff;
 static const char kNormalBlock = 'L';
@@ -2819,8 +2822,8 @@
           static_cast<llvm::ConstantInt*>(tableOffsetNode->getOperand(0));
   int32_t tableOffset = tableOffsetValue->getSExtValue();
   RegLocation rlSrc = getLoc(cUnit, testVal);
-  const u2* table = cUnit->insns + cUnit->currentDalvikOffset + tableOffset;
-  u2 tableMagic = *table;
+  const uint16_t* table = cUnit->insns + cUnit->currentDalvikOffset + tableOffset;
+  uint16_t tableMagic = *table;
   if (tableMagic == 0x100) {
     genPackedSwitch(cUnit, tableOffset, rlSrc);
   } else {
diff --git a/src/compiler/codegen/optimizer.h b/src/compiler/codegen/method_bitcode.h
similarity index 67%
copy from src/compiler/codegen/optimizer.h
copy to src/compiler/codegen/method_bitcode.h
index f5c81a6..8b14286 100644
--- a/src/compiler/codegen/optimizer.h
+++ b/src/compiler/codegen/method_bitcode.h
@@ -14,19 +14,14 @@
  * limitations under the License.
  */
 
-#ifndef ART_SRC_COMPILER_COMPILER_OPTIMIZATION_H_
-#define ART_SRC_COMPILER_COMPILER_OPTIMIZATION_H_
-
-#include "../dalvik.h"
+#ifndef ART_SRC_COMPILER_CODEGEN_METHODBITCODE_H_
+#define ART_SRC_COMPILER_CODEGEN_METHODBITCODE_H_
 
 namespace art {
 
-/* Forward declarations */
-struct CompilationUnit;
-struct LIR;
-
-void oatApplyLocalOptimizations(CompilationUnit* cUnit, LIR* head, LIR* tail);
+void oatMethodMIR2Bitcode(CompilationUnit* cUnit);
+void oatMethodBitcode2LIR(CompilationUnit* cUnit);
 
 }  // namespace art
 
-#endif  // ART_SRC_COMPILER_COMPILER_OPTIMIZATION_H_
+#endif // ART_SRC_COMPILER_CODEGEN_METHODBITCODE_H_
diff --git a/src/compiler/codegen/method_codegen_driver.cc b/src/compiler/codegen/method_codegen_driver.cc
index 3170abc..4ca06b7 100644
--- a/src/compiler/codegen/method_codegen_driver.cc
+++ b/src/compiler/codegen/method_codegen_driver.cc
@@ -16,6 +16,8 @@
 
 #include "object_utils.h"
 
+#include "local_optimizations.h"
+
 namespace art {
 
 const RegLocation badLoc = {kLocDalvikFrame, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -50,6 +52,7 @@
   return res;
 }
 
+// TODO: move to gen_invoke.cc
 void genInvoke(CompilationUnit* cUnit, CallInfo* info)
 {
   if (genIntrinsic(cUnit, info)) {
@@ -177,6 +180,7 @@
  * high-word loc for wide arguments.  Also pull up any following
  * MOVE_RESULT and incorporate it into the invoke.
  */
+//TODO: move to gen_invoke.cc or utils
 CallInfo* oatNewCallInfo(CompilationUnit* cUnit, BasicBlock* bb, MIR* mir,
                          InvokeType type, bool isRange)
 {
@@ -1032,35 +1036,4 @@
   }
 }
 
-/* Needed by the ld/st optmizatons */
-LIR* oatRegCopyNoInsert(CompilationUnit* cUnit, int rDest, int rSrc)
-{
-  return opRegCopyNoInsert(cUnit, rDest, rSrc);
-}
-
-/* Needed by the register allocator */
-void oatRegCopy(CompilationUnit* cUnit, int rDest, int rSrc)
-{
-  opRegCopy(cUnit, rDest, rSrc);
-}
-
-/* Needed by the register allocator */
-void oatRegCopyWide(CompilationUnit* cUnit, int destLo, int destHi,
-              int srcLo, int srcHi)
-{
-  opRegCopyWide(cUnit, destLo, destHi, srcLo, srcHi);
-}
-
-void oatFlushRegImpl(CompilationUnit* cUnit, int rBase,
-               int displacement, int rSrc, OpSize size)
-{
-  storeBaseDisp(cUnit, rBase, displacement, rSrc, size);
-}
-
-void oatFlushRegWideImpl(CompilationUnit* cUnit, int rBase,
-                 int displacement, int rSrcLo, int rSrcHi)
-{
-  storeBaseDispWide(cUnit, rBase, displacement, rSrcLo, rSrcHi);
-}
-
 }  // namespace art
diff --git a/src/compiler/codegen/method_codegen_driver.h b/src/compiler/codegen/method_codegen_driver.h
new file mode 100644
index 0000000..dbed049
--- /dev/null
+++ b/src/compiler/codegen/method_codegen_driver.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ART_SRC_COMPILER_CODEGEN_METHODCODEGENDRIVER_H_
+#define ART_SRC_COMPILER_CODEGEN_METHODCODEGENDRIVER_H_
+
+namespace art {
+// TODO: move genInvoke to gen_invoke.cc
+void genInvoke(CompilationUnit* cUnit, CallInfo* info);
+// TODO: move genInvoke to gen_invoke.cc or utils
+CallInfo* oatNewCallInfo(CompilationUnit* cUnit, BasicBlock* bb, MIR* mir, InvokeType type, bool isRange);
+void oatSpecialMIR2LIR(CompilationUnit* cUnit, SpecialCaseHandler specialCase);
+void oatMethodMIR2LIR(CompilationUnit* cUnit);
+
+
+}  // namespace art
+
+#endif // ART_SRC_COMPILER_CODEGEN_METHODCODEGENDRIVER_H_
diff --git a/src/compiler/codegen/mips/assemble_mips.cc b/src/compiler/codegen/mips/assemble_mips.cc
index ab7a677..1fa3a6b 100644
--- a/src/compiler/codegen/mips/assemble_mips.cc
+++ b/src/compiler/codegen/mips/assemble_mips.cc
@@ -14,10 +14,8 @@
  * limitations under the License.
  */
 
-#include "../../dalvik.h"
-#include "../../compiler_internals.h"
 #include "mips_lir.h"
-#include "codegen.h"
+#include "../codegen_util.h"
 
 namespace art {
 
@@ -653,11 +651,11 @@
       continue;
     }
     const MipsEncodingMap *encoder = &EncodingMap[lir->opcode];
-    u4 bits = encoder->skeleton;
+    uint32_t bits = encoder->skeleton;
     int i;
     for (i = 0; i < 4; i++) {
-      u4 operand;
-      u4 value;
+      uint32_t operand;
+      uint32_t value;
       operand = lir->operands[i];
       switch (encoder->fieldLoc[i].kind) {
         case kFmtUnused:
@@ -703,7 +701,7 @@
     // TUNING: replace with proper delay slot handling
     if (encoder->size == 8) {
       const MipsEncodingMap *encoder = &EncodingMap[kMipsNop];
-      u4 bits = encoder->skeleton;
+      uint32_t bits = encoder->skeleton;
       cUnit->codeBuffer.push_back(bits & 0xff);
       cUnit->codeBuffer.push_back((bits >> 8) & 0xff);
       cUnit->codeBuffer.push_back((bits >> 16) & 0xff);
diff --git a/src/compiler/codegen/mips/backend_mips.cc b/src/compiler/codegen/mips/backend_mips.cc
index 023d613..596a5f7 100644
--- a/src/compiler/codegen/mips/backend_mips.cc
+++ b/src/compiler/codegen/mips/backend_mips.cc
@@ -16,17 +16,14 @@
 
 #define _CODEGEN_C
 
-#include "../../dalvik.h"
-#include "../../compiler_internals.h"
 #include "mips_lir.h"
-#include "../ralloc.h"
-#include "codegen.h"
+#include "../ralloc_util.h"
 
 /* Common codegen building blocks */
 #include "../codegen_util.cc"
 
 #include "utility_mips.cc"
-#include "../codegen_factory.cc"
+#include "../gen_loadstore.cc"
 #include "../gen_common.cc"
 #include "../gen_invoke.cc"
 #include "call_mips.cc"
diff --git a/src/compiler/codegen/mips/call_mips.cc b/src/compiler/codegen/mips/call_mips.cc
index 50cb594..bf67b42 100644
--- a/src/compiler/codegen/mips/call_mips.cc
+++ b/src/compiler/codegen/mips/call_mips.cc
@@ -60,7 +60,7 @@
 void genSparseSwitch(CompilationUnit* cUnit, uint32_t tableOffset,
                      RegLocation rlSrc)
 {
-  const u2* table = cUnit->insns + cUnit->currentDalvikOffset + tableOffset;
+  const uint16_t* table = cUnit->insns + cUnit->currentDalvikOffset + tableOffset;
   if (cUnit->printMe) {
     dumpSparseSwitchTable(table);
   }
@@ -139,7 +139,7 @@
 void genPackedSwitch(CompilationUnit* cUnit, uint32_t tableOffset,
                      RegLocation rlSrc)
 {
-  const u2* table = cUnit->insns + cUnit->currentDalvikOffset + tableOffset;
+  const uint16_t* table = cUnit->insns + cUnit->currentDalvikOffset + tableOffset;
   if (cUnit->printMe) {
     dumpPackedSwitchTable(table);
   }
@@ -223,14 +223,14 @@
 void genFillArrayData(CompilationUnit* cUnit, uint32_t tableOffset,
                       RegLocation rlSrc)
 {
-  const u2* table = cUnit->insns + cUnit->currentDalvikOffset + tableOffset;
+  const uint16_t* table = cUnit->insns + cUnit->currentDalvikOffset + tableOffset;
   // Add the table to the list - we'll process it later
   FillArrayData *tabRec = (FillArrayData *)
      oatNew(cUnit, sizeof(FillArrayData), true, kAllocData);
   tabRec->table = table;
   tabRec->vaddr = cUnit->currentDalvikOffset;
-  u2 width = tabRec->table[1];
-  u4 size = tabRec->table[2] | (((u4)tabRec->table[3]) << 16);
+  uint16_t width = tabRec->table[1];
+  uint32_t size = tabRec->table[2] | ((static_cast<uint32_t>(tabRec->table[3])) << 16);
   tabRec->size = (size * width) + 8;
 
   oatInsertGrowableList(cUnit, &cUnit->fillArrayData, (intptr_t)tabRec);
diff --git a/src/compiler/codegen/mips/codegen.h b/src/compiler/codegen/mips/codegen.h
deleted file mode 100644
index 0b3a01e..0000000
--- a/src/compiler/codegen/mips/codegen.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/* This file contains register alloction support */
-
-#include "../../compiler_ir.h"
-
-namespace art {
-
-#if defined(_CODEGEN_C)
-bool genAddLong(CompilationUnit* cUnit, RegLocation rlDest,
-                RegLocation rlSrc1, RegLocation rlSrc2);
-bool genSubLong(CompilationUnit* cUnit, RegLocation rlDest,
-                RegLocation rlSrc1, RegLocation rlSrc2);
-bool genNegLong(CompilationUnit* cUnit, RegLocation rlDest,
-                RegLocation rlSrc);
-LIR *opRegImm(CompilationUnit* cUnit, OpKind op, int rDestSrc1, int value);
-LIR *opRegReg(CompilationUnit* cUnit, OpKind op, int rDestSrc1, int rSrc2);
-LIR* opCmpBranch(CompilationUnit* cUnit, ConditionCode cond, int src1,
-                 int src2, LIR* target);
-LIR* opCmpImmBranch(CompilationUnit* cUnit, ConditionCode cond, int reg,
-                    int checkValue, LIR* target);
-
-/* Forward declaraton the portable versions due to circular dependency */
-bool genArithOpFloatPortable(CompilationUnit* cUnit, Instruction::Code opcode,
-                                    RegLocation rlDest, RegLocation rlSrc1,
-                                    RegLocation rlSrc2);
-
-bool genArithOpDoublePortable(CompilationUnit* cUnit, Instruction::Code opcode,
-                                     RegLocation rlDest, RegLocation rlSrc1,
-                                     RegLocation rlSrc2);
-
-bool genConversionPortable(CompilationUnit* cUnit, Instruction::Code opcode,
-                           RegLocation rlDest, RegLocation rlSrc);
-
-int loadHelper(CompilationUnit* cUnit, int offset);
-LIR* loadConstant(CompilationUnit* cUnit, int reg, int immVal);
-void opRegCopyWide(CompilationUnit* cUnit, int destLo, int destHi,
-                   int srcLo, int srcHi);
-LIR* opRegCopy(CompilationUnit* cUnit, int rDest, int rSrc);
-void freeRegLocTemps(CompilationUnit* cUnit, RegLocation rlKeep,
-                     RegLocation rlFree);
-
-
-/*
- * Return most flexible allowed register class based on size.
- * Bug: 2813841
- * Must use a core register for data types narrower than word (due
- * to possible unaligned load/store.
- */
-inline RegisterClass oatRegClassBySize(OpSize size) {
-  return (size == kUnsignedHalf ||
-          size == kSignedHalf ||
-          size == kUnsignedByte ||
-          size == kSignedByte) ? kCoreReg : kAnyReg;
-}
-
-/*
- * Construct an s4 from two consecutive half-words of switch data.
- * This needs to check endianness because the DEX optimizer only swaps
- * half-words in instruction stream.
- *
- * "switchData" must be 32-bit aligned.
- */
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-inline s4 s4FromSwitchData(const void* switchData) {
-  return *reinterpret_cast<const s4*>(switchData);
-}
-#else
-inline s4 s4FromSwitchData(const void* switchData) {
-  u2* data = switchData;
-  return data[0] | (((s4) data[1]) << 16);
-}
-#endif
-
-#endif
-
-extern void oatSetupResourceMasks(CompilationUnit* cUnit, LIR* lir);
-
-extern LIR* oatRegCopyNoInsert(CompilationUnit* cUnit, int rDest, int rSrc);
-
-bool genAddLong(CompilationUnit* cUnit, RegLocation rlDest,
-                RegLocation rlSrc1, RegLocation rlSrc2);
-bool genSubLong(CompilationUnit* cUnit, RegLocation rlDest,
-                RegLocation rlSrc1, RegLocation rlSrc2);
-bool genAndLong(CompilationUnit* cUnit, RegLocation rlDest,
-                RegLocation rlSrc1, RegLocation rlSrc2);
-bool genOrLong(CompilationUnit* cUnit, RegLocation rlDest,
-               RegLocation rlSrc1, RegLocation rlSrc2);
-bool genXorLong(CompilationUnit* cUnit, RegLocation rlDest,
-               RegLocation rlSrc1, RegLocation rlSrc2);
-
-}  // namespace art
diff --git a/src/compiler/codegen/mips/fp_mips.cc b/src/compiler/codegen/mips/fp_mips.cc
index 04056ad..5ee5de4 100644
--- a/src/compiler/codegen/mips/fp_mips.cc
+++ b/src/compiler/codegen/mips/fp_mips.cc
@@ -67,9 +67,8 @@
 #endif
 }
 
-static bool genArithOpDouble(CompilationUnit *cUnit, Instruction::Code opcode,
-                             RegLocation rlDest, RegLocation rlSrc1,
-                             RegLocation rlSrc2)
+bool genArithOpDouble(CompilationUnit *cUnit, Instruction::Code opcode,
+                      RegLocation rlDest, RegLocation rlSrc1, RegLocation rlSrc2)
 {
 #ifdef __mips_hard_float
   int op = kMipsNop;
@@ -117,8 +116,8 @@
 #endif
 }
 
-static bool genConversion(CompilationUnit *cUnit, Instruction::Code opcode,
-                          RegLocation rlDest, RegLocation rlSrc)
+bool genConversion(CompilationUnit *cUnit, Instruction::Code opcode, RegLocation rlDest,
+                   RegLocation rlSrc)
 {
 #ifdef __mips_hard_float
   int op = kMipsNop;
@@ -170,8 +169,8 @@
 #endif
 }
 
-static bool genCmpFP(CompilationUnit *cUnit, Instruction::Code opcode, RegLocation rlDest,
-                     RegLocation rlSrc1, RegLocation rlSrc2)
+bool genCmpFP(CompilationUnit *cUnit, Instruction::Code opcode, RegLocation rlDest,
+              RegLocation rlSrc1, RegLocation rlSrc2)
 {
   bool wide = true;
   int offset;
diff --git a/src/compiler/codegen/mips/mips_lir.h b/src/compiler/codegen/mips/mips_lir.h
index 03dd714..4b604d2 100644
--- a/src/compiler/codegen/mips/mips_lir.h
+++ b/src/compiler/codegen/mips/mips_lir.h
@@ -17,7 +17,6 @@
 #ifndef ART_COMPILER_COMPILER_CODEGEN_MIPS_MIPSLIR_H_
 #define ART_COMPILER_COMPILER_CODEGEN_MIPS_MIPSLIR_H_
 
-#include "../../dalvik.h"
 #include "../../compiler_internals.h"
 
 namespace art {
@@ -164,7 +163,7 @@
   kMipsRegEnd   = 51,
 };
 
-#define ENCODE_MIPS_REG_LIST(N)      ((u8) N)
+#define ENCODE_MIPS_REG_LIST(N)      ((uint64_t) N)
 #define ENCODE_MIPS_REG_SP           (1ULL << kMipsRegSP)
 #define ENCODE_MIPS_REG_LR           (1ULL << kMipsRegLR)
 #define ENCODE_MIPS_REG_PC           (1ULL << kMipsRegPC)
@@ -420,7 +419,7 @@
 
 /* Struct used to define the snippet positions for each MIPS opcode */
 struct MipsEncodingMap {
-  u4 skeleton;
+  uint32_t skeleton;
   struct {
     MipsEncodingKind kind;
     int end;   /* end for kFmtBitBlt, 1-bit slice end for FP regs */
@@ -433,11 +432,6 @@
   int size;   /* Size in bytes */
 };
 
-/* Keys for target-specific scheduling and other optimization hints */
-enum MipsTargetOptHints {
-  kMaxHoistDistance,
-};
-
 extern MipsEncodingMap EncodingMap[kMipsLast];
 
 #define IS_UIMM16(v) ((0 <= (v)) && ((v) <= 65535))
diff --git a/src/compiler/codegen/mips/target_mips.cc b/src/compiler/codegen/mips/target_mips.cc
index f32f6c2..a5a8d7e 100644
--- a/src/compiler/codegen/mips/target_mips.cc
+++ b/src/compiler/codegen/mips/target_mips.cc
@@ -16,7 +16,8 @@
 
 #include "../../compiler_internals.h"
 #include "mips_lir.h"
-#include "../ralloc.h"
+#include "../ralloc_util.h"
+#include "../codegen_util.h"
 
 #include <string>
 
@@ -125,9 +126,9 @@
 /*
  * Decode the register id.
  */
-u8 getRegMaskCommon(CompilationUnit* cUnit, int reg)
+uint64_t getRegMaskCommon(CompilationUnit* cUnit, int reg)
 {
-  u8 seed;
+  uint64_t seed;
   int shift;
   int regId;
 
@@ -274,7 +275,7 @@
 }
 
 // FIXME: need to redo resource maps for MIPS - fix this at that time
-void oatDumpResourceMask(LIR *lir, u8 mask, const char *prefix)
+void oatDumpResourceMask(LIR *lir, uint64_t mask, const char *prefix)
 {
   char buf[256];
   buf[0] = 0;
@@ -361,8 +362,7 @@
     if (SRegToVReg(cUnit, info2->sReg) < SRegToVReg(cUnit, info1->sReg))
       info1 = info2;
     int vReg = SRegToVReg(cUnit, info1->sReg);
-    oatFlushRegWideImpl(cUnit, rMIPS_SP, oatVRegOffset(cUnit, vReg), info1->reg,
-                        info1->partner);
+    storeBaseDispWide(cUnit, rMIPS_SP, oatVRegOffset(cUnit, vReg), info1->reg, info1->partner);
   }
 }
 
@@ -372,7 +372,7 @@
   if (info->live && info->dirty) {
     info->dirty = false;
     int vReg = SRegToVReg(cUnit, info->sReg);
-    oatFlushRegImpl(cUnit, rMIPS_SP, oatVRegOffset(cUnit, vReg), reg, kWord);
+    storeBaseDisp(cUnit, rMIPS_SP, oatVRegOffset(cUnit, vReg), reg, kWord);
   }
 }
 
@@ -488,19 +488,6 @@
   return true;
 }
 
-int dvmCompilerTargetOptHint(int key)
-{
-  int res;
-  switch (key) {
-    case kMaxHoistDistance:
-      res = 2;
-      break;
-    default:
-      LOG(FATAL) << "Unknown target optimization hint key: " << key;
-  }
-  return res;
-}
-
 void oatGenMemBarrier(CompilationUnit *cUnit, int barrierKind)
 {
 #if ANDROID_SMP != 0
diff --git a/src/compiler/codegen/ralloc_util.cc b/src/compiler/codegen/ralloc_util.cc
index 059d1c3..4b66ddf 100644
--- a/src/compiler/codegen/ralloc_util.cc
+++ b/src/compiler/codegen/ralloc_util.cc
@@ -19,7 +19,8 @@
 #include "../compiler_utility.h"
 #include "../compiler_ir.h"
 #include "../dataflow.h"
-#include "ralloc.h"
+#include "ralloc_util.h"
+#include "codegen_util.h"
 
 namespace art {
 
@@ -935,8 +936,8 @@
       newRegs = oatAllocTypedTempPair(cUnit, loc.fp, regClass);
       lowReg = newRegs & 0xff;
       highReg = (newRegs >> 8) & 0xff;
-      oatRegCopyWide(cUnit, lowReg, highReg, loc.lowReg,
-                   loc.highReg);
+      opRegCopyWide(cUnit, lowReg, highReg, loc.lowReg,
+                    loc.highReg);
       copyRegInfo(cUnit, lowReg, loc.lowReg);
       copyRegInfo(cUnit, highReg, loc.highReg);
       oatClobber(cUnit, loc.lowReg);
@@ -980,7 +981,7 @@
     if (!regClassMatches(regClass, loc.lowReg)) {
       /* Wrong register class.  Realloc, copy and transfer ownership */
       newReg = oatAllocTypedTemp(cUnit, loc.fp, regClass);
-      oatRegCopy(cUnit, newReg, loc.lowReg);
+      opRegCopy(cUnit, newReg, loc.lowReg);
       copyRegInfo(cUnit, newReg, loc.lowReg);
       oatClobber(cUnit, loc.lowReg);
       loc.lowReg = newReg;
@@ -1006,24 +1007,28 @@
   RegLocation res = cUnit->regLocation[mir->ssaRep->uses[num]];
   return res;
 }
+
 extern RegLocation oatGetRawDest(CompilationUnit* cUnit, MIR* mir)
 {
   DCHECK_GT(mir->ssaRep->numDefs, 0);
   RegLocation res = cUnit->regLocation[mir->ssaRep->defs[0]];
   return res;
 }
+
 extern RegLocation oatGetDest(CompilationUnit* cUnit, MIR* mir)
 {
   RegLocation res = oatGetRawDest(cUnit, mir);
   DCHECK(!res.wide);
   return res;
 }
+
 extern RegLocation oatGetSrc(CompilationUnit* cUnit, MIR* mir, int num)
 {
   RegLocation res = oatGetRawSrc(cUnit, mir, num);
   DCHECK(!res.wide);
   return res;
 }
+
 extern RegLocation oatGetDestWide(CompilationUnit* cUnit, MIR* mir)
 {
   RegLocation res = oatGetRawDest(cUnit, mir);
diff --git a/src/compiler/codegen/ralloc.h b/src/compiler/codegen/ralloc_util.h
similarity index 92%
rename from src/compiler/codegen/ralloc.h
rename to src/compiler/codegen/ralloc_util.h
index 8c327e4..56b1e22 100644
--- a/src/compiler/codegen/ralloc.h
+++ b/src/compiler/codegen/ralloc_util.h
@@ -14,8 +14,8 @@
  * limitations under the License.
  */
 
-#ifndef ART_SRC_COMPILER_RALLOC_H_
-#define ART_SRC_COMPILER_RALLOC_H_
+#ifndef ART_SRC_COMPILER_CODEGEN_RALLOCUTIL_H_
+#define ART_SRC_COMPILER_CODEGEN_RALLOCUTIL_H_
 
 /*
  * This file contains target independent register alloction support.
@@ -208,15 +208,6 @@
 
 extern int oatAllocTypedTemp(CompilationUnit* cUnit, bool fpHint, int regClass);
 
-extern void oatRegCopyWide(CompilationUnit* cUnit, int destLo,
-                           int destHi, int srcLo, int srcHi);
-
-extern void oatFlushRegImpl(CompilationUnit* cUnit, int rBase,
-                            int displacement, int rSrc, OpSize size);
-
-extern void oatFlushRegWideImpl(CompilationUnit* cUnit, int rBase,
-                                int displacement, int rSrcLo, int rSrcHi);
-
 extern void oatDumpCoreRegPool(CompilationUnit* cUint);
 extern void oatDumpFPRegPool(CompilationUnit* cUint);
 extern bool oatCheckCorePoolSanity(CompilationUnit* cUnit);
@@ -226,9 +217,8 @@
 extern uint32_t oatFPRegMask(void);
 extern void oatAdjustSpillMask(CompilationUnit* cUnit);
 void oatMarkPreservedSingle(CompilationUnit* cUnit, int vReg, int reg);
-void oatRegCopy(CompilationUnit* cUnit, int rDest, int rSrc);
 int oatComputeFrameSize(CompilationUnit* cUnit);
 
 }  // namespace art
 
-#endif // ART_SRC_COMPILER_RALLOC_H_
+#endif // ART_SRC_COMPILER_CODEGEN_RALLOCUTIL_H_
diff --git a/src/compiler/codegen/target_list.h b/src/compiler/codegen/target_list.h
new file mode 100644
index 0000000..2ada073
--- /dev/null
+++ b/src/compiler/codegen/target_list.h
@@ -0,0 +1,143 @@
+ArmConditionCode oatArmConditionEncoding(ConditionCode code);
+AssemblerStatus oatAssembleInstructions(CompilationUnit* cUnit, intptr_t startAddr);
+bool doubleReg(int reg);
+bool fpReg(int reg);
+bool genAddLong(CompilationUnit* cUnit, RegLocation rlDest, RegLocation rlSrc1, RegLocation rlSrc2);
+bool genAndLong(CompilationUnit* cUnit, RegLocation rlDest, RegLocation rlSrc1, RegLocation rlSrc2);
+bool genArithOpDouble(CompilationUnit* cUnit, Instruction::Code opcode, RegLocation rlDest, RegLocation rlSrc1, RegLocation rlSrc2);
+bool genArithOpFloat(CompilationUnit *cUnit, Instruction::Code opcode, RegLocation rlDest, RegLocation rlSrc1, RegLocation rlSrc2);
+bool genArithOpFloat(CompilationUnit* cUnit, Instruction::Code opcode, RegLocation rlDest, RegLocation rlSrc1, RegLocation rlSrc2);
+bool genCmpFP(CompilationUnit* cUnit, Instruction::Code opcode, RegLocation rlDest, RegLocation rlSrc1, RegLocation rlSrc2);
+bool genConversion(CompilationUnit* cUnit, Instruction::Code opcode, RegLocation rlDest, RegLocation rlSrc);
+bool genInlinedCas32(CompilationUnit* cUnit, CallInfo* info, bool need_write_barrier);
+bool genInlinedMinMaxInt(CompilationUnit *cUnit, CallInfo* info, bool isMin);
+bool genInlinedSqrt(CompilationUnit* cUnit, CallInfo* info);
+bool genNegLong(CompilationUnit* cUnit, RegLocation rlDest, RegLocation rlSrc);
+bool genOrLong(CompilationUnit* cUnit, RegLocation rlDest, RegLocation rlSrc1, RegLocation rlSrc2);
+bool genSubLong(CompilationUnit* cUnit, RegLocation rlDest, RegLocation rlSrc1, RegLocation rlSrc2);
+bool genXorLong(CompilationUnit* cUnit, RegLocation rlDest, RegLocation rlSrc1, RegLocation rlSrc2);
+bool oatArchInit();
+bool oatArchVariantInit(void);
+bool oatIsFpReg(int reg);
+bool sameRegType(int reg1, int reg2);
+bool singleReg(int reg);
+bool smallLiteralDivide(CompilationUnit* cUnit, Instruction::Code dalvikOpcode, RegLocation rlSrc, RegLocation rlDest, int lit);
+char* decodeFPCSRegList(int count, int base, char* buf);
+char* decodeRegList(int opcode, int vector, char* buf);
+RegisterInfo* oatGetRegInfo(CompilationUnit* cUnit, int reg);
+RegLocation oatGetReturnAlt(CompilationUnit* cUnit);
+RegLocation oatGetReturnWideAlt(CompilationUnit* cUnit);
+void oatClobberCalleeSave(CompilationUnit *cUnit);
+void oatFreeCallTemps(CompilationUnit* cUnit);
+void oatLockCallTemps(CompilationUnit* cUnit);
+InstructionSet oatInstructionSet();
+int encodeImmDoubleHigh(int value);
+int encodeImmDouble(int valLo, int valHi);
+int encodeImmSingle(int value);
+int encodeShift(int code, int amount);
+int expandImmediate(int value);
+int inPosition(CompilationUnit* cUnit, int sReg);
+int leadingZeros(uint32_t val);
+int loadHelper(CompilationUnit* cUnit, int offset);
+int modifiedImmediate(uint32_t value);
+int oatAllocTypedTemp(CompilationUnit* cUnit, bool fpHint, int regClass);
+int oatAllocTypedTempPair(CompilationUnit* cUnit, bool fpHint, int regClass);
+int oatAssignInsnOffsets(CompilationUnit* cUnit);
+int oatGetInsnSize(LIR* lir);
+int s2d(int lowReg, int highReg);
+int targetReg(SpecialTargetRegister reg);
+LIR* fpRegCopy(CompilationUnit* cUnit, int rDest, int rSrc);
+LIR* genRegMemCheck(CompilationUnit* cUnit, ConditionCode cCode, int reg1, int base, int offset, ThrowKind kind);
+LIR* loadBaseDispBody(CompilationUnit* cUnit, int rBase, int displacement, int rDest, int rDestHi, OpSize size, int sReg);
+LIR* loadBaseDisp(CompilationUnit* cUnit, int rBase, int displacement, int rDest, OpSize size, int sReg);
+LIR* loadBaseDispWide(CompilationUnit* cUnit, int rBase, int displacement, int rDestLo, int rDestHi, int sReg);
+LIR* loadBaseIndexed(CompilationUnit* cUnit, int rBase, int rIndex, int rDest, int scale, OpSize size);
+LIR* loadBaseIndexedDisp(CompilationUnit *cUnit, int rBase, int rIndex, int scale, int displacement, int rDest, int rDestHi, OpSize size, int sReg);
+LIR* loadConstantNoClobber(CompilationUnit* cUnit, int rDest, int value);
+LIR* loadConstantValueWide(CompilationUnit* cUnit, int rDestLo, int rDestHi, int valLo, int valHi);
+LIR* loadFPConstantValue(CompilationUnit* cUnit, int rDest, int value);
+LIR* loadMultiple(CompilationUnit *cUnit, int rBase, int rMask);
+LIR* opBranchUnconditional(CompilationUnit* cUnit, OpKind op);
+LIR* opCmpBranch(CompilationUnit* cUnit, ConditionCode cond, int src1, int src2, LIR* target);
+LIR* opCmpImmBranch(CompilationUnit* cUnit, ConditionCode cond, int reg, int checkValue, LIR* target);
+LIR* opCondBranch(CompilationUnit* cUnit, ConditionCode cc, LIR* target);
+LIR* opDecAndBranch(CompilationUnit* cUnit, ConditionCode cCode, int reg, LIR* target);
+LIR* opIT(CompilationUnit* cUnit, ArmConditionCode cond, const char* guide);
+LIR* opMem(CompilationUnit* cUnit, OpKind op, int rBase, int disp);
+LIR* opPcRelLoad(CompilationUnit* cUnit, int reg, LIR* target);
+LIR* opReg(CompilationUnit* cUnit, OpKind op, int rDestSrc);
+LIR* opRegCopy(CompilationUnit* cUnit, int rDest, int rSrc);
+LIR* opRegCopyNoInsert(CompilationUnit* cUnit, int rDest, int rSrc);
+LIR* opRegImm(CompilationUnit* cUnit, OpKind op, int rDestSrc1, int value);
+LIR* opRegMem(CompilationUnit* cUnit, OpKind op, int rDest, int rBase, int offset);
+LIR* opRegReg(CompilationUnit* cUnit, OpKind op, int rDestSrc1, int rSrc2);
+LIR* opRegRegImm(CompilationUnit* cUnit, OpKind op, int rDest, int rSrc1, int value);
+LIR* opRegRegReg(CompilationUnit* cUnit, OpKind op, int rDest, int rSrc1, int rSrc2);
+LIR* opRegRegRegShift(CompilationUnit* cUnit, OpKind op, int rDest, int rSrc1, int rSrc2, int shift);
+LIR* opRegRegShift(CompilationUnit* cUnit, OpKind op, int rDestSrc1, int rSrc2, int shift);
+LIR* opTestSuspend(CompilationUnit* cUnit, LIR* target);
+LIR* opThreadMem(CompilationUnit* cUnit, OpKind op, int threadOffset);
+LIR* opVldm(CompilationUnit* cUnit, int rBase, int count);
+LIR* opVstm(CompilationUnit* cUnit, int rBase, int count);
+LIR* storeBaseDispBody(CompilationUnit* cUnit, int rBase, int displacement, int rSrc, int rSrcHi, OpSize size);
+LIR* storeBaseDisp(CompilationUnit* cUnit, int rBase, int displacement, int rSrc, OpSize size);
+LIR* storeBaseDispWide(CompilationUnit* cUnit, int rBase, int displacement, int rSrcLo, int rSrcHi);
+LIR* storeBaseIndexed(CompilationUnit* cUnit, int rBase, int rIndex, int rSrc, int scale, OpSize size);
+LIR* storeBaseIndexedDisp(CompilationUnit *cUnit, int rBase, int rIndex, int scale, int displacement, int rSrc, int rSrcHi, OpSize size, int sReg);
+LIR* storeMultiple(CompilationUnit *cUnit, int rBase, int rMask);
+MIR* getNextMir(CompilationUnit* cUnit, BasicBlock** pBb, MIR* mir);
+MIR* specialIdentity(CompilationUnit* cUnit, MIR* mir);
+MIR* specialIGet(CompilationUnit* cUnit, BasicBlock** bb, MIR* mir, OpSize size, bool longOrDouble, bool isObject);
+MIR* specialIPut(CompilationUnit* cUnit, BasicBlock** bb, MIR* mir, OpSize size, bool longOrDouble, bool isObject);
+RegLocation argLoc(CompilationUnit* cUnit, RegLocation loc);
+RegLocation genDivRem(CompilationUnit* cUnit, RegLocation rlDest, int regLo, int regHi, bool isDiv);
+RegLocation genDivRemLit(CompilationUnit* cUnit, RegLocation rlDest, int regLo, int lit, bool isDiv);
+RegLocation loadArg(CompilationUnit* cUnit, RegLocation loc);
+RegLocation locCReturn();
+RegLocation locCReturnDouble();
+RegLocation locCReturnFloat();
+RegLocation locCReturnWide();
+std::string buildInsnString(const char* fmt, LIR* lir, unsigned char* baseAddr);
+uint64_t getRegMaskCommon(CompilationUnit* cUnit, int reg);
+uint32_t fpRegMask();
+uint32_t oatFpRegMask();
+uint64_t getPCUseDefEncoding();
+void convertShortToLongBranch(CompilationUnit* cUnit, LIR* lir);
+void freeRegLocTemps(CompilationUnit* cUnit, RegLocation rlKeep, RegLocation rlFree);
+void genCmpLong(CompilationUnit* cUnit, RegLocation rlDest, RegLocation rlSrc1, RegLocation rlSrc2);
+void genDivZeroCheck(CompilationUnit* cUnit, int regLo, int regHi);
+void genEntrySequence(CompilationUnit* cUnit, RegLocation* argLocs, RegLocation rlMethod);
+void genExitSequence(CompilationUnit* cUnit);
+void genFillArrayData(CompilationUnit* cUnit, uint32_t tableOffset, RegLocation rlSrc);
+void genFusedFPCmpBranch(CompilationUnit* cUnit, BasicBlock* bb, MIR* mir, bool gtBias, bool isDouble);
+void genFusedLongCmpBranch(CompilationUnit* cUnit, BasicBlock* bb, MIR* mir);
+void genMonitorEnter(CompilationUnit* cUnit, int optFlags, RegLocation rlSrc);
+void genMonitorExit(CompilationUnit* cUnit, int optFlags, RegLocation rlSrc);
+void genMultiplyByTwoBitMultiplier(CompilationUnit* cUnit, RegLocation rlSrc, RegLocation rlResult, int lit, int firstBit, int secondBit);
+void genNegDouble(CompilationUnit* cUnit, RegLocation rlDest, RegLocation rlSrc);
+void genNegFloat(CompilationUnit* cUnit, RegLocation rlDest, RegLocation rlSrc);
+void genPackedSwitch(CompilationUnit* cUnit, uint32_t tableOffset, RegLocation rlSrc);
+void genPrintLabel(CompilationUnit *cUnit, MIR* mir);
+void genSparseSwitch(CompilationUnit* cUnit, uint32_t tableOffset, RegLocation rlSrc);
+void genSpecialCase(CompilationUnit* cUnit, BasicBlock* bb, MIR* mir, SpecialCaseHandler specialCase);
+void loadPair(CompilationUnit* cUnit, int base, int lowReg, int highReg);
+void lockLiveArgs(CompilationUnit* cUnit, MIR* mir);
+void markGCCard(CompilationUnit* cUnit, int valReg, int tgtAddrReg);
+void oatAdjustSpillMask(CompilationUnit* cUnit);
+void oatClobberCalleeSave(CompilationUnit *cUnit);
+void oatDumpResourceMask(LIR* lir, uint64_t mask, const char* prefix);
+void oatFlushReg(CompilationUnit* cUnit, int reg);
+void oatFlushRegWide(CompilationUnit* cUnit, int reg1, int reg2);
+void oatGenMemBarrier(CompilationUnit* cUnit, int barrierKind);
+void oatInitializeRegAlloc(CompilationUnit* cUnit);
+void oatMarkPreservedSingle(CompilationUnit* cUnit, int vReg, int reg);
+void oatNopLIR( LIR* lir);
+void opLea(CompilationUnit* cUnit, int rBase, int reg1, int reg2, int scale, int offset);
+void opRegCopyWide(CompilationUnit* cUnit, int destLo, int destHi, int srcLo, int srcHi);
+void opRegThreadMem(CompilationUnit* cUnit, OpKind op, int rDest, int threadOffset);
+void opTlsCmp(CompilationUnit* cUnit, int offset, int val);
+void removeRedundantBranches(CompilationUnit* cUnit);
+void setupTargetResourceMasks(CompilationUnit* cUnit, LIR* lir);
+void spillCoreRegs(CompilationUnit* cUnit);
+void unSpillCoreRegs(CompilationUnit* cUnit);
+X86ConditionCode oatX86ConditionEncoding(ConditionCode cond);
diff --git a/src/compiler/codegen/x86/assemble_x86.cc b/src/compiler/codegen/x86/assemble_x86.cc
index 79ed075..63d2b83 100644
--- a/src/compiler/codegen/x86/assemble_x86.cc
+++ b/src/compiler/codegen/x86/assemble_x86.cc
@@ -14,10 +14,8 @@
  * limitations under the License.
  */
 
-#include "../../dalvik.h"
-#include "../../compiler_internals.h"
 #include "x86_lir.h"
-#include "codegen.h"
+#include "../codegen_util.h"
 
 namespace art {
 
diff --git a/src/compiler/codegen/x86/backend_x86.cc b/src/compiler/codegen/x86/backend_x86.cc
index 6abfb23..13388ff 100644
--- a/src/compiler/codegen/x86/backend_x86.cc
+++ b/src/compiler/codegen/x86/backend_x86.cc
@@ -16,17 +16,14 @@
 
 #define _CODEGEN_C
 
-#include "../../dalvik.h"
-#include "../../compiler_internals.h"
 #include "x86_lir.h"
-#include "../ralloc.h"
-#include "codegen.h"
+#include "../ralloc_util.h"
 
 /* Common codegen utility code */
 #include "../codegen_util.cc"
 
 #include "utility_x86.cc"
-#include "../codegen_factory.cc"
+#include "../gen_loadstore.cc"
 #include "../gen_common.cc"
 #include "../gen_invoke.cc"
 #include "call_x86.cc"
diff --git a/src/compiler/codegen/x86/call_x86.cc b/src/compiler/codegen/x86/call_x86.cc
index 0cd9b2d..2b52270 100644
--- a/src/compiler/codegen/x86/call_x86.cc
+++ b/src/compiler/codegen/x86/call_x86.cc
@@ -33,7 +33,7 @@
 void genSparseSwitch(CompilationUnit* cUnit, uint32_t tableOffset,
                      RegLocation rlSrc)
 {
-  const u2* table = cUnit->insns + cUnit->currentDalvikOffset + tableOffset;
+  const uint16_t* table = cUnit->insns + cUnit->currentDalvikOffset + tableOffset;
   if (cUnit->printMe) {
     dumpSparseSwitchTable(table);
   }
@@ -71,7 +71,7 @@
 void genPackedSwitch(CompilationUnit* cUnit, uint32_t tableOffset,
                      RegLocation rlSrc)
 {
-  const u2* table = cUnit->insns + cUnit->currentDalvikOffset + tableOffset;
+  const uint16_t* table = cUnit->insns + cUnit->currentDalvikOffset + tableOffset;
   if (cUnit->printMe) {
     dumpPackedSwitchTable(table);
   }
@@ -134,14 +134,14 @@
 void genFillArrayData(CompilationUnit* cUnit, uint32_t tableOffset,
                       RegLocation rlSrc)
 {
-  const u2* table = cUnit->insns + cUnit->currentDalvikOffset + tableOffset;
+  const uint16_t* table = cUnit->insns + cUnit->currentDalvikOffset + tableOffset;
   // Add the table to the list - we'll process it later
   FillArrayData *tabRec = (FillArrayData *)oatNew(cUnit, sizeof(FillArrayData),
       true, kAllocData);
   tabRec->table = table;
   tabRec->vaddr = cUnit->currentDalvikOffset;
-  u2 width = tabRec->table[1];
-  u4 size = tabRec->table[2] | (((u4)tabRec->table[3]) << 16);
+  uint16_t width = tabRec->table[1];
+  uint32_t size = tabRec->table[2] | ((static_cast<uint32_t>(tabRec->table[3])) << 16);
   tabRec->size = (size * width) + 8;
 
   oatInsertGrowableList(cUnit, &cUnit->fillArrayData, (intptr_t)tabRec);
diff --git a/src/compiler/codegen/x86/codegen.h b/src/compiler/codegen/x86/codegen.h
deleted file mode 100644
index c95fa67..0000000
--- a/src/compiler/codegen/x86/codegen.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/* This file contains register alloction support */
-
-#include "../../compiler_ir.h"
-
-namespace art {
-
-#if defined(_CODEGEN_C)
-bool genAddLong(CompilationUnit* cUnit, RegLocation rlDest,
-                RegLocation rlSrc1, RegLocation rlSrc2);
-bool genSubLong(CompilationUnit* cUnit, RegLocation rlDest,
-                RegLocation rlSrc1, RegLocation rlSrc2);
-bool genAndLong(CompilationUnit* cUnit, RegLocation rlDest,
-                RegLocation rlSrc1, RegLocation rlSrc2);
-bool genOrLong(CompilationUnit* cUnit, RegLocation rlDest,
-                RegLocation rlSrc1, RegLocation rlSrc2);
-bool genXorLong(CompilationUnit* cUnit, RegLocation rlDest,
-                RegLocation rlSrc1, RegLocation rlSrc2);
-bool genNegLong(CompilationUnit* cUnit, RegLocation rlDest,
-                RegLocation rlSrc);
-LIR *opRegImm(CompilationUnit* cUnit, OpKind op, int rDestSrc1, int value);
-LIR *opRegReg(CompilationUnit* cUnit, OpKind op, int rDestSrc1, int rSrc2);
-LIR* opCmpBranch(CompilationUnit* cUnit, ConditionCode cond, int src1,
-                 int src2, LIR* target);
-LIR* opCmpImmBranch(CompilationUnit* cUnit, ConditionCode cond, int reg,
-                    int checkValue, LIR* target);
-
-/* Forward declaration of the portable versions due to circular dependency */
-bool genArithOpFloatPortable(CompilationUnit* cUnit, Instruction::Code opcode,
-                                    RegLocation rlDest, RegLocation rlSrc1,
-                                    RegLocation rlSrc2);
-
-bool genArithOpDoublePortable(CompilationUnit* cUnit, Instruction::Code opcode,
-                                     RegLocation rlDest, RegLocation rlSrc1,
-                                     RegLocation rlSrc2);
-
-bool genConversionPortable(CompilationUnit* cUnit, Instruction::Code opcode,
-                           RegLocation rlDest, RegLocation rlSrc);
-
-int loadHelper(CompilationUnit* cUnit, int offset);
-LIR* loadConstant(CompilationUnit* cUnit, int reg, int immVal);
-void opRegCopyWide(CompilationUnit* cUnit, int destLo, int destHi,
-                   int srcLo, int srcHi);
-LIR* opRegCopy(CompilationUnit* cUnit, int rDest, int rSrc);
-void freeRegLocTemps(CompilationUnit* cUnit, RegLocation rlKeep,
-                     RegLocation rlFree);
-
-
-/*
- * Return most flexible allowed register class based on size.
- * Bug: 2813841
- * Must use a core register for data types narrower than word (due
- * to possible unaligned load/store.
- */
-inline RegisterClass oatRegClassBySize(OpSize size)
-{
-  return (size == kUnsignedHalf ||
-          size == kSignedHalf ||
-          size == kUnsignedByte ||
-          size == kSignedByte ) ? kCoreReg : kAnyReg;
-}
-
-/*
- * Construct an s4 from two consecutive half-words of switch data.
- * This needs to check endianness because the DEX optimizer only swaps
- * half-words in instruction stream.
- *
- * "switchData" must be 32-bit aligned.
- */
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-inline s4 s4FromSwitchData(const void* switchData) {
-  return *(s4*) switchData;
-}
-#else
-inline s4 s4FromSwitchData(const void* switchData) {
-  u2* data = switchData;
-  return data[0] | (((s4) data[1]) << 16);
-}
-#endif
-
-#endif
-
-extern void oatSetupResourceMasks(CompilationUnit* cUnit, LIR* lir);
-
-extern LIR* oatRegCopyNoInsert(CompilationUnit* cUnit, int rDest, int rSrc);
-
-}  // namespace art
diff --git a/src/compiler/codegen/x86/fp_x86.cc b/src/compiler/codegen/x86/fp_x86.cc
index 0a08ab0..411bd1e 100644
--- a/src/compiler/codegen/x86/fp_x86.cc
+++ b/src/compiler/codegen/x86/fp_x86.cc
@@ -16,9 +16,8 @@
 
 namespace art {
 
-static bool genArithOpFloat(CompilationUnit *cUnit, Instruction::Code opcode,
-                            RegLocation rlDest, RegLocation rlSrc1,
-                            RegLocation rlSrc2) {
+bool genArithOpFloat(CompilationUnit *cUnit, Instruction::Code opcode,
+                     RegLocation rlDest, RegLocation rlSrc1, RegLocation rlSrc2) {
   X86OpCode op = kX86Nop;
   RegLocation rlResult;
 
@@ -67,9 +66,8 @@
   return false;
 }
 
-static bool genArithOpDouble(CompilationUnit *cUnit, Instruction::Code opcode,
-                             RegLocation rlDest, RegLocation rlSrc1,
-                             RegLocation rlSrc2) {
+bool genArithOpDouble(CompilationUnit *cUnit, Instruction::Code opcode,
+                      RegLocation rlDest, RegLocation rlSrc1, RegLocation rlSrc2) {
   X86OpCode op = kX86Nop;
   RegLocation rlResult;
 
@@ -117,8 +115,8 @@
   return false;
 }
 
-static bool genConversion(CompilationUnit *cUnit, Instruction::Code opcode,
-                          RegLocation rlDest, RegLocation rlSrc) {
+bool genConversion(CompilationUnit *cUnit, Instruction::Code opcode,
+                   RegLocation rlDest, RegLocation rlSrc) {
   RegisterClass rcSrc = kFPReg;
   X86OpCode op = kX86Nop;
   int srcReg;
@@ -210,8 +208,8 @@
   return false;
 }
 
-static bool genCmpFP(CompilationUnit *cUnit, Instruction::Code code, RegLocation rlDest,
-                     RegLocation rlSrc1, RegLocation rlSrc2) {
+bool genCmpFP(CompilationUnit *cUnit, Instruction::Code code, RegLocation rlDest,
+              RegLocation rlSrc1, RegLocation rlSrc2) {
   bool single = (code == Instruction::CMPL_FLOAT) || (code == Instruction::CMPG_FLOAT);
   bool unorderedGt = (code == Instruction::CMPG_DOUBLE) || (code == Instruction::CMPG_FLOAT);
   int srcReg1;
diff --git a/src/compiler/codegen/x86/target_x86.cc b/src/compiler/codegen/x86/target_x86.cc
index a211c2f..a254876 100644
--- a/src/compiler/codegen/x86/target_x86.cc
+++ b/src/compiler/codegen/x86/target_x86.cc
@@ -16,7 +16,8 @@
 
 #include "../../compiler_internals.h"
 #include "x86_lir.h"
-#include "../ralloc.h"
+#include "../ralloc_util.h"
+#include "../codegen_util.h"
 
 #include <string>
 
@@ -132,9 +133,9 @@
 /*
  * Decode the register id.
  */
-u8 getRegMaskCommon(CompilationUnit* cUnit, int reg)
+uint64_t getRegMaskCommon(CompilationUnit* cUnit, int reg)
 {
-  u8 seed;
+  uint64_t seed;
   int shift;
   int regId;
 
@@ -280,7 +281,7 @@
   return buf;
 }
 
-void oatDumpResourceMask(LIR *lir, u8 mask, const char *prefix)
+void oatDumpResourceMask(LIR *lir, uint64_t mask, const char *prefix)
 {
   char buf[256];
   buf[0] = 0;
@@ -360,8 +361,7 @@
     if (SRegToVReg(cUnit, info2->sReg) < SRegToVReg(cUnit, info1->sReg))
       info1 = info2;
     int vReg = SRegToVReg(cUnit, info1->sReg);
-    oatFlushRegWideImpl(cUnit, rX86_SP, oatVRegOffset(cUnit, vReg),
-                        info1->reg, info1->partner);
+    storeBaseDispWide(cUnit, rX86_SP, oatVRegOffset(cUnit, vReg), info1->reg, info1->partner);
   }
 }
 
@@ -371,7 +371,7 @@
   if (info->live && info->dirty) {
     info->dirty = false;
     int vReg = SRegToVReg(cUnit, info->sReg);
-    oatFlushRegImpl(cUnit, rX86_SP, oatVRegOffset(cUnit, vReg), reg, kWord);
+    storeBaseDisp(cUnit, rX86_SP, oatVRegOffset(cUnit, vReg), reg, kWord);
   }
 }
 
@@ -458,19 +458,6 @@
   return true;
 }
 
-int dvmCompilerTargetOptHint(int key)
-{
-  int res;
-  switch (key) {
-    case kMaxHoistDistance:
-      res = 2;
-      break;
-    default:
-      LOG(FATAL) << "Unknown target optimization hint key: " << key;
-  }
-  return res;
-}
-
 void oatGenMemBarrier(CompilationUnit *cUnit, int /* barrierKind */)
 {
 #if ANDROID_SMP != 0
diff --git a/src/compiler/codegen/x86/x86_lir.h b/src/compiler/codegen/x86/x86_lir.h
index fe6d8cb..3008bc2 100644
--- a/src/compiler/codegen/x86/x86_lir.h
+++ b/src/compiler/codegen/x86/x86_lir.h
@@ -17,7 +17,6 @@
 #ifndef ART_COMPILER_COMPILER_CODEGEN_X86_X86LIR_H_
 #define ART_COMPILER_COMPILER_CODEGEN_X86_X86LIR_H_
 
-#include "../../dalvik.h"
 #include "../../compiler_internals.h"
 
 namespace art {
@@ -143,7 +142,7 @@
   kX86RegEnd   = kX86FPRegEnd,
 };
 
-#define ENCODE_X86_REG_LIST(N)      ((u8) N)
+#define ENCODE_X86_REG_LIST(N)      (static_cast<uint64_t>(N))
 #define ENCODE_X86_REG_SP           (1ULL << kX86RegSP)
 
 /*
@@ -436,11 +435,6 @@
 #define kSY 0
 #define kST 0
 
-/* Keys for target-specific scheduling and other optimization hints */
-enum X86TargetOptHints {
-  kMaxHoistDistance,
-};
-
 /* Offsets of high and low halves of a 64bit value */
 #define LOWORD_OFFSET 0
 #define HIWORD_OFFSET 4
diff --git a/src/compiler/compiler_internals.h b/src/compiler/compiler_internals.h
index 2f81afe..c62d8c6 100644
--- a/src/compiler/compiler_internals.h
+++ b/src/compiler/compiler_internals.h
@@ -17,7 +17,23 @@
 #ifndef ART_SRC_COMPILER_COMPILER_INTERNAL_H_
 #define ART_SRC_COMPILER_COMPILER_INTERNAL_H_
 
-#include "dalvik.h"
+#include <assert.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+
+#include "gc/card_table.h"
+#include "class_linker.h"
+#include "compiler.h"
+#include "dex_cache.h"
+#include "logging.h"
+#include "monitor.h"
+#include "object.h"
+#include "thread.h"
+#include "utils.h"
+
+#include "frontend.h"
+#include "ralloc.h"
 #include "compiler_utility.h"
 #include "compiler_ir.h"
 #include "codegen/compiler_codegen.h"
diff --git a/src/compiler/compiler_ir.h b/src/compiler/compiler_ir.h
index 6c6442d..f73fe92 100644
--- a/src/compiler/compiler_ir.h
+++ b/src/compiler/compiler_ir.h
@@ -18,8 +18,8 @@
 #define ART_SRC_COMPILER_COMPILER_IR_H_
 
 #include <vector>
-
-#include "codegen/optimizer.h"
+#include "dex_instruction.h"
+#include "compiler.h"
 #include "compiler_utility.h"
 #include "oat_compilation_unit.h"
 #include "safe_map.h"
@@ -38,6 +38,10 @@
 // Minimum field size to contain Dalvik vReg number
 #define VREG_NUM_WIDTH 16
 
+struct ArenaBitVector;
+struct LIR;
+class LLVMInfo;
+
 enum RegisterClass {
   kCoreReg,
   kFPReg,
@@ -73,9 +77,9 @@
 
 struct PromotionMap {
   RegLocationType coreLocation:3;
-  u1 coreReg;
+  uint8_t coreReg;
   RegLocationType fpLocation:3;
-  u1 fpReg;
+  uint8_t fpReg;
   bool firstInPair;
 };
 
@@ -89,8 +93,8 @@
   unsigned ref:1;       // Something GC cares about
   unsigned highWord:1;  // High word of pair?
   unsigned home:1;      // Does this represent the home location?
-  u1 lowReg;            // First physical register
-  u1 highReg;           // 2nd physical register (if wide)
+  uint8_t lowReg;            // First physical register
+  uint8_t highReg;           // 2nd physical register (if wide)
   int32_t sRegLow;      // SSA name for low Dalvik word
   int32_t origSReg;     // TODO: remove after Bitcode gen complete
                         // and consolodate usage w/ sRegLow
@@ -229,8 +233,8 @@
     unsigned int unused:25;
   } flags;
   int aliasInfo;              // For Dalvik register & litpool disambiguation
-  u8 useMask;                 // Resource mask for use
-  u8 defMask;                 // Resource mask for def
+  uint64_t useMask;           // Resource mask for use
+  uint64_t defMask;           // Resource mask for def
 };
 
 /* Shared pseudo opcodes - must be < 0 */
@@ -601,8 +605,8 @@
   int currentDalvikOffset;
   GrowableList switchTables;
   GrowableList fillArrayData;
-  const u2* insns;
-  u4 insnsSize;
+  const uint16_t* insns;
+  uint32_t insnsSize;
   bool disableDataflow; // Skip dataflow analysis if possible
   SafeMap<unsigned int, BasicBlock*> blockMap; // findBlock lookup cache
   SafeMap<unsigned int, unsigned int> blockIdMap; // Block collapse lookup cache
@@ -797,7 +801,7 @@
 
 struct SwitchTable {
   int offset;
-  const u2* table;            // Original dex table
+  const uint16_t* table;            // Original dex table
   int vaddr;                  // Dalvik offset of switch opcode
   LIR* anchor;                // Reference instruction for relative offsets
   LIR** targets;              // Array of case targets
@@ -805,7 +809,7 @@
 
 struct FillArrayData {
   int offset;
-  const u2* table;           // Original dex table
+  const uint16_t* table;           // Original dex table
   int size;
   int vaddr;                 // Dalvik offset of FILL_ARRAY_DATA opcode
 };
diff --git a/src/compiler/utility.cc b/src/compiler/compiler_utility.cc
similarity index 92%
rename from src/compiler/utility.cc
rename to src/compiler/compiler_utility.cc
index 4a138c6..8bd4713 100644
--- a/src/compiler/utility.cc
+++ b/src/compiler/compiler_utility.cc
@@ -14,14 +14,13 @@
  * limitations under the License.
  */
 
-#include "dalvik.h"
 #include "compiler_internals.h"
 
 namespace art {
 
 #ifdef WITH_MEMSTATS
 struct Memstats {
-  u4 allocStats[kNumAllocKinds];
+  uint32_t allocStats[kNumAllocKinds];
   int listSizes[kNumListKinds];
   int listWasted[kNumListKinds];
   int listGrows[kNumListKinds];
@@ -82,7 +81,7 @@
 };
 #endif
 
-#define kArenaBitVectorGrowth    4   /* increase by 4 u4s when limit hit */
+#define kArenaBitVectorGrowth    4   /* increase by 4 uint32_ts when limit hit */
 
 /* Allocate the initial memory block for arena-based allocation */
 bool oatHeapInit(CompilationUnit* cUnit)
@@ -264,7 +263,7 @@
 /* Dump memory usage stats */
 void oatDumpMemStats(CompilationUnit* cUnit)
 {
-  u4 total = 0;
+  uint32_t total = 0;
   for (int i = 0; i < kNumAllocKinds; i++) {
     total += cUnit->mstats->allocStats[i];
   }
@@ -369,11 +368,11 @@
 
   bv->storageSize = count;
   bv->expandable = expandable;
-  bv->storage = (u4*) oatNew(cUnit, count * sizeof(u4), true,
-                             kAllocGrowableBitMap);
+  bv->storage = static_cast<uint32_t*>(oatNew(cUnit, count * sizeof(uint32_t), true,
+                                              kAllocGrowableBitMap));
 #ifdef WITH_MEMSTATS
   bv->kind = kind;
-  cUnit->mstats->bitMapSizes[kind] += count * sizeof(u4);
+  cUnit->mstats->bitMapSizes[kind] += count * sizeof(uint32_t);
 #endif
   return bv;
 }
@@ -383,7 +382,7 @@
  */
 bool oatIsBitSet(const ArenaBitVector* pBits, unsigned int num)
 {
-  DCHECK_LT(num, pBits->storageSize * sizeof(u4) * 8);
+  DCHECK_LT(num, pBits->storageSize * sizeof(uint32_t) * 8);
 
   unsigned int val = pBits->storage[num >> 5] & checkMasks[num & 0x1f];
   return (val != 0);
@@ -395,7 +394,7 @@
 void oatClearAllBits(ArenaBitVector* pBits)
 {
   unsigned int count = pBits->storageSize;
-  memset(pBits->storage, 0, count * sizeof(u4));
+  memset(pBits->storage, 0, count * sizeof(uint32_t));
 }
 
 /*
@@ -408,7 +407,7 @@
  */
 bool oatSetBit(CompilationUnit* cUnit, ArenaBitVector* pBits, unsigned int num)
 {
-  if (num >= pBits->storageSize * sizeof(u4) * 8) {
+  if (num >= pBits->storageSize * sizeof(uint32_t) * 8) {
     if (!pBits->expandable) {
       LOG(FATAL) << "Can't expand";
     }
@@ -416,15 +415,15 @@
     /* Round up to word boundaries for "num+1" bits */
     unsigned int newSize = (num + 1 + 31) >> 5;
     DCHECK_GT(newSize, pBits->storageSize);
-    u4 *newStorage = (u4*)oatNew(cUnit, newSize * sizeof(u4), false,
-                                 kAllocGrowableBitMap);
-    memcpy(newStorage, pBits->storage, pBits->storageSize * sizeof(u4));
+    uint32_t *newStorage = static_cast<uint32_t*>(oatNew(cUnit, newSize * sizeof(uint32_t), false,
+                                                         kAllocGrowableBitMap));
+    memcpy(newStorage, pBits->storage, pBits->storageSize * sizeof(uint32_t));
     memset(&newStorage[pBits->storageSize], 0,
-           (newSize - pBits->storageSize) * sizeof(u4));
+           (newSize - pBits->storageSize) * sizeof(uint32_t));
 #ifdef WITH_MEMSTATS
     cUnit->mstats->bitMapWasted[pBits->kind] +=
-        pBits->storageSize * sizeof(u4);
-    cUnit->mstats->bitMapSizes[pBits->kind] += newSize * sizeof(u4);
+        pBits->storageSize * sizeof(uint32_t);
+    cUnit->mstats->bitMapSizes[pBits->kind] += newSize * sizeof(uint32_t);
     cUnit->mstats->bitMapGrows[pBits->kind]++;
 #endif
     pBits->storage = newStorage;
@@ -445,7 +444,7 @@
  */
 bool oatClearBit(ArenaBitVector* pBits, unsigned int num)
 {
-  if (num >= pBits->storageSize * sizeof(u4) * 8) {
+  if (num >= pBits->storageSize * sizeof(uint32_t) * 8) {
     LOG(FATAL) << "Attempt to clear a bit not set in the vector yet";;
   }
 
@@ -459,7 +458,7 @@
 void oatMarkAllBits(ArenaBitVector* pBits, bool set)
 {
   int value = set ? -1 : 0;
-  memset(pBits->storage, value, pBits->storageSize * (int)sizeof(u4));
+  memset(pBits->storage, value, pBits->storageSize * static_cast<int>(sizeof(uint32_t)));
 }
 
 void oatDebugBitVector(char* msg, const ArenaBitVector* bv, int length)
@@ -499,7 +498,7 @@
                             ArenaBitVectorIterator* iterator)
 {
   iterator->pBits = pBits;
-  iterator->bitSize = pBits->storageSize * sizeof(u4) * 8;
+  iterator->bitSize = pBits->storageSize * sizeof(uint32_t) * 8;
   iterator->idx = 0;
 }
 
@@ -523,7 +522,7 @@
   /* if dest is expandable and < src, we could expand dest to match */
   checkSizes(dest, src);
 
-  memcpy(dest->storage, src->storage, sizeof(u4) * dest->storageSize);
+  memcpy(dest->storage, src->storage, sizeof(uint32_t) * dest->storageSize);
 }
 
 /*
@@ -608,7 +607,7 @@
   unsigned int count = 0;
 
   for (word = 0; word < pBits->storageSize; word++) {
-    u4 val = pBits->storage[word];
+    uint32_t val = pBits->storage[word];
 
     if (val != 0) {
       if (val == 0xffffffff) {
@@ -630,23 +629,23 @@
 int oatBitVectorIteratorNext(ArenaBitVectorIterator* iterator)
 {
   ArenaBitVector* pBits = iterator->pBits;
-  u4 bitIndex = iterator->idx;
-  u4 bitSize = iterator->bitSize;
+  uint32_t bitIndex = iterator->idx;
+  uint32_t bitSize = iterator->bitSize;
 
-  DCHECK_EQ(bitSize, pBits->storageSize * sizeof(u4) * 8);
+  DCHECK_EQ(bitSize, pBits->storageSize * sizeof(uint32_t) * 8);
 
   if (bitIndex >= bitSize) return -1;
 
-  u4 wordIndex = bitIndex >> 5;
-  u4 endWordIndex = bitSize >> 5;
-  u4* storage = pBits->storage;
-  u4 word = storage[wordIndex++];
+  uint32_t wordIndex = bitIndex >> 5;
+  uint32_t endWordIndex = bitSize >> 5;
+  uint32_t* storage = pBits->storage;
+  uint32_t word = storage[wordIndex++];
 
   // Mask out any bits in the first word we've already considered
   word &= ~((1 << (bitIndex & 0x1f))-1);
 
   for (; wordIndex <= endWordIndex;) {
-    u4 bitPos = bitIndex & 0x1f;
+    uint32_t bitPos = bitIndex & 0x1f;
     if (word == 0) {
       bitIndex += (32 - bitPos);
       word = storage[wordIndex++];
diff --git a/src/compiler/compiler_utility.h b/src/compiler/compiler_utility.h
index 5dfb95f..2e30380 100644
--- a/src/compiler/compiler_utility.h
+++ b/src/compiler/compiler_utility.h
@@ -17,13 +17,72 @@
 #ifndef ART_SRC_COMPILER_COMPILER_UTILITY_H_
 #define ART_SRC_COMPILER_COMPILER_UTILITY_H_
 
-#include "dalvik.h"
+#include <stdint.h>
+#include <stddef.h>
 
 namespace art {
 
+struct CompilationUnit;
+
 /* Each arena page has some overhead, so take a few bytes off */
 #define ARENA_DEFAULT_SIZE ((2 * 1024 * 1024) - 256)
 
+/* Type of allocation for memory tuning */
+enum oatAllocKind {
+  kAllocMisc,
+  kAllocBB,
+  kAllocLIR,
+  kAllocMIR,
+  kAllocDFInfo,
+  kAllocGrowableList,
+  kAllocGrowableBitMap,
+  kAllocDalvikToSSAMap,
+  kAllocDebugInfo,
+  kAllocSuccessor,
+  kAllocRegAlloc,
+  kAllocData,
+  kAllocPredecessors,
+  kNumAllocKinds
+};
+
+/* Type of growable list for memory tuning */
+enum oatListKind {
+  kListMisc = 0,
+  kListBlockList,
+  kListSSAtoDalvikMap,
+  kListDfsOrder,
+  kListDfsPostOrder,
+  kListDomPostOrderTraversal,
+  kListThrowLaunchPads,
+  kListSuspendLaunchPads,
+  kListSwitchTables,
+  kListFillArrayData,
+  kListSuccessorBlocks,
+  kListPredecessors,
+  kNumListKinds
+};
+
+/* Type of growable bitmap for memory tuning */
+enum oatBitMapKind {
+  kBitMapMisc = 0,
+  kBitMapUse,
+  kBitMapDef,
+  kBitMapLiveIn,
+  kBitMapBMatrix,
+  kBitMapDominators,
+  kBitMapIDominated,
+  kBitMapDomFrontier,
+  kBitMapPhi,
+  kBitMapTmpBlocks,
+  kBitMapInputBlocks,
+  kBitMapRegisterV,
+  kBitMapTempSSARegisterV,
+  kBitMapNullCheck,
+  kBitMapTmpBlockV,
+  kBitMapPredecessors,
+  kNumBitMapKinds
+};
+
 /* Allocate the initial memory block for arena-based allocation */
 bool oatHeapInit(CompilationUnit* cUnit);
 
@@ -66,9 +125,9 @@
  * All operations on a BitVector are unsynchronized.
  */
 struct ArenaBitVector {
-  bool    expandable;     /* expand bitmap if we run out? */
-  u4      storageSize;    /* current size, in 32-bit words */
-  u4*     storage;
+  bool       expandable;     /* expand bitmap if we run out? */
+  uint32_t   storageSize;    /* current size, in 32-bit words */
+  uint32_t*  storage;
 #ifdef WITH_MEMSTATS
   oatBitMapKind kind;      /* for memory use tuning */
 #endif
@@ -77,8 +136,8 @@
 /* Handy iterator to walk through the bit positions set to 1 */
 struct ArenaBitVectorIterator {
   ArenaBitVector* pBits;
-  u4 idx;
-  u4 bitSize;
+  uint32_t idx;
+  uint32_t bitSize;
 };
 
 #define GET_ELEM_N(LIST, TYPE, N) (((TYPE*) LIST->elemList)[N])
@@ -125,7 +184,7 @@
 int oatCountSetBits(const ArenaBitVector* pBits);
 
 void oatDumpLIRInsn(CompilationUnit* cUnit, LIR* lir, unsigned char* baseAddr);
-void oatDumpResourceMask(LIR* lir, u8 mask, const char* prefix);
+void oatDumpResourceMask(LIR* lir, uint64_t mask, const char* prefix);
 void oatDumpBlockBitVector(const GrowableList* blocks, char* msg,
                            const ArenaBitVector* bv, int length);
 void oatGetBlockName(BasicBlock* bb, char* name);
diff --git a/src/compiler/dalvik.h b/src/compiler/dalvik.h
deleted file mode 100644
index 7ceb817..0000000
--- a/src/compiler/dalvik.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * Common defines for all Dalvik code.
- */
-#ifndef DALVIK_COMMON_H_
-#define DALVIK_COMMON_H_
-
-#include <assert.h>
-#include <stdbool.h>
-#include <stdint.h>
-#include <stdio.h>
-
-#include "gc/card_table.h"
-#include "class_linker.h"
-#include "compiler.h"
-#include "dex_cache.h"
-#include "logging.h"
-#include "monitor.h"
-#include "object.h"
-#include "thread.h"
-#include "utils.h"
-
-// From Common.h
-typedef uint8_t             u1;
-typedef uint16_t            u2;
-typedef uint32_t            u4;
-typedef uint64_t            u8;
-typedef int8_t              s1;
-typedef int16_t             s2;
-typedef int32_t             s4;
-typedef int64_t             s8;
-typedef unsigned long long  u8;
-
-#include "frontend.h"
-
-#endif
diff --git a/src/compiler/dataflow.cc b/src/compiler/dataflow.cc
index a20a428..65068ed 100644
--- a/src/compiler/dataflow.cc
+++ b/src/compiler/dataflow.cc
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "dalvik.h"
+#include "compiler_internals.h"
 #include "dataflow.h"
 
 namespace art {
diff --git a/src/compiler/dataflow.h b/src/compiler/dataflow.h
index 44f40c3..ff15939 100644
--- a/src/compiler/dataflow.h
+++ b/src/compiler/dataflow.h
@@ -17,7 +17,6 @@
 #ifndef ART_SRC_COMPILER_DATAFLOW_H_
 #define ART_SRC_COMPILER_DATAFLOW_H_
 
-#include "dalvik.h"
 #include "compiler_internals.h"
 
 namespace art {
@@ -158,19 +157,25 @@
   ArenaBitVector* blocks;
 };
 
-void oatMethodLoopDetection(CompilationUnit*);
-
-void oatMethodUseCount(CompilationUnit*);
-
-void oatMethodNullCheckElimination(CompilationUnit*);
-
-void oatDumpCheckStats(CompilationUnit*);
-
-void oatMethodBasicBlockCombine(CompilationUnit*);
-
-void oatMethodCodeLayout(CompilationUnit*);
-
-void oatMethodBasicBlockOptimization(CompilationUnit*);
+int SRegToVReg(const CompilationUnit* cUnit, int ssaReg);
+char* oatGetDalvikDisassembly(CompilationUnit* cUnit, const DecodedInstruction& insn, const char* note);
+char* oatFullDisassembler(CompilationUnit* cUnit, const MIR* mir);
+char* oatGetSSAString(CompilationUnit* cUnit, SSARepresentation* ssaRep);
+bool oatFindLocalLiveIn(CompilationUnit* cUnit, BasicBlock* bb);
+bool oatDoSSAConversion(CompilationUnit* cUnit, BasicBlock* bb);
+bool oatDoConstantPropagation(CompilationUnit* cUnit, BasicBlock* bb);
+void oatInitializeSSAConversion(CompilationUnit* cUnit);
+bool oatClearVisitedFlag(struct CompilationUnit* cUnit, struct BasicBlock* bb);
+void oatDataFlowAnalysisDispatcher(CompilationUnit* cUnit, bool (*func)(CompilationUnit*, BasicBlock*), DataFlowAnalysisMode dfaMode, bool isIterative);
+MIR* oatFindMoveResult(CompilationUnit* cUnit, BasicBlock* bb, MIR* mir);
+void oatMethodNullCheckElimination(CompilationUnit *cUnit);
+void oatMethodBasicBlockCombine(CompilationUnit* cUnit);
+void oatMethodCodeLayout(CompilationUnit* cUnit);
+void oatDumpCheckStats(CompilationUnit *cUnit);
+void oatMethodBasicBlockOptimization(CompilationUnit *cUnit);
+void oatDumpLoops(CompilationUnit *cUnit);
+void oatMethodLoopDetection(CompilationUnit *cUnit);
+void oatMethodUseCount(CompilationUnit *cUnit);
 
 }  // namespace art
 
diff --git a/src/compiler/frontend.cc b/src/compiler/frontend.cc
index d753cec..134aaa7 100644
--- a/src/compiler/frontend.cc
+++ b/src/compiler/frontend.cc
@@ -14,12 +14,16 @@
  * limitations under the License.
  */
 
-#include "dalvik.h"
+#include "compiler.h"
 #include "compiler_internals.h"
 #include "dataflow.h"
+#include "ssa_transformation.h"
 #include "leb128.h"
 #include "object.h"
 #include "runtime.h"
+#include "codegen/codegen_util.h"
+#include "codegen/method_bitcode.h"
+#include "codegen/method_codegen_driver.h"
 
 #include <llvm/Support/Threading.h>
 
@@ -94,8 +98,8 @@
   //(1 << kDebugVerifyBitcode) |
   0;
 
-inline bool contentIsInsn(const u2* codePtr) {
-  u2 instr = *codePtr;
+inline bool contentIsInsn(const uint16_t* codePtr) {
+  uint16_t instr = *codePtr;
   Instruction::Code opcode = (Instruction::Code)(instr & 0xff);
 
   /*
@@ -108,7 +112,7 @@
 /*
  * Parse an instruction, return the length of the instruction
  */
-inline int parseInsn(CompilationUnit* cUnit, const u2* codePtr,
+inline int parseInsn(CompilationUnit* cUnit, const uint16_t* codePtr,
                    DecodedInstruction* decoded_instruction, bool printMe)
 {
   // Don't parse instruction data
@@ -511,7 +515,7 @@
 /* Process instructions with the kBranch flag */
 BasicBlock* processCanBranch(CompilationUnit* cUnit, BasicBlock* curBlock,
                            MIR* insn, int curOffset, int width, int flags,
-                           const u2* codePtr, const u2* codeEnd)
+                           const uint16_t* codePtr, const uint16_t* codeEnd)
 {
   int target = curOffset;
   switch (insn->dalvikInsn.opcode) {
@@ -595,7 +599,7 @@
 void processCanSwitch(CompilationUnit* cUnit, BasicBlock* curBlock,
                       MIR* insn, int curOffset, int width, int flags)
 {
-  u2* switchData= (u2 *) (cUnit->insns + curOffset + insn->dalvikInsn.vB);
+  uint16_t* switchData= (uint16_t*) (cUnit->insns + curOffset + insn->dalvikInsn.vB);
   int size;
   int* keyTable;
   int* targetTable;
@@ -684,8 +688,8 @@
 /* Process instructions with the kThrow flag */
 BasicBlock* processCanThrow(CompilationUnit* cUnit, BasicBlock* curBlock,
                             MIR* insn, int curOffset, int width, int flags,
-                            ArenaBitVector* tryBlockAddr, const u2* codePtr,
-                            const u2* codeEnd)
+                            ArenaBitVector* tryBlockAddr, const uint16_t* codePtr,
+                            const uint16_t* codeEnd)
 {
   const DexFile::CodeItem* code_item = cUnit->code_item;
   bool inTryBlock = oatIsBitSet(tryBlockAddr, curOffset);
@@ -792,8 +796,8 @@
 {
   VLOG(compiler) << "Compiling " << PrettyMethod(method_idx, dex_file) << "...";
 
-  const u2* codePtr = code_item->insns_;
-  const u2* codeEnd = code_item->insns_ + code_item->insns_size_in_code_units_;
+  const uint16_t* codePtr = code_item->insns_;
+  const uint16_t* codeEnd = code_item->insns_ + code_item->insns_size_in_code_units_;
   int numBlocks = 0;
   unsigned int curOffset = 0;
 
diff --git a/src/compiler/frontend.h b/src/compiler/frontend.h
index 11214cf..049d9d4 100644
--- a/src/compiler/frontend.h
+++ b/src/compiler/frontend.h
@@ -64,62 +64,6 @@
   kPromoteCompilerTemps,
 };
 
-/* Type of allocation for memory tuning */
-enum oatAllocKind {
-  kAllocMisc,
-  kAllocBB,
-  kAllocLIR,
-  kAllocMIR,
-  kAllocDFInfo,
-  kAllocGrowableList,
-  kAllocGrowableBitMap,
-  kAllocDalvikToSSAMap,
-  kAllocDebugInfo,
-  kAllocSuccessor,
-  kAllocRegAlloc,
-  kAllocData,
-  kAllocPredecessors,
-  kNumAllocKinds
-};
-
-/* Type of growable list for memory tuning */
-enum oatListKind {
-  kListMisc = 0,
-  kListBlockList,
-  kListSSAtoDalvikMap,
-  kListDfsOrder,
-  kListDfsPostOrder,
-  kListDomPostOrderTraversal,
-  kListThrowLaunchPads,
-  kListSuspendLaunchPads,
-  kListSwitchTables,
-  kListFillArrayData,
-  kListSuccessorBlocks,
-  kListPredecessors,
-  kNumListKinds
-};
-
-/* Type of growable bitmap for memory tuning */
-enum oatBitMapKind {
-  kBitMapMisc = 0,
-  kBitMapUse,
-  kBitMapDef,
-  kBitMapLiveIn,
-  kBitMapBMatrix,
-  kBitMapDominators,
-  kBitMapIDominated,
-  kBitMapDomFrontier,
-  kBitMapPhi,
-  kBitMapTmpBlocks,
-  kBitMapInputBlocks,
-  kBitMapRegisterV,
-  kBitMapTempSSARegisterV,
-  kBitMapNullCheck,
-  kBitMapTmpBlockV,
-  kBitMapPredecessors,
-  kNumBitMapKinds
-};
-
 /* Force code generation paths for testing */
 enum debugControlVector {
   kDebugDisplayMissingTargets,
@@ -201,40 +145,9 @@
 
 struct CompilationUnit;
 struct BasicBlock;
-struct SSARepresentation;
-struct GrowableList;
-struct MIR;
 
-void oatInit(CompilationUnit* cUnit, const Compiler& compiler);
-bool oatArchInit(void);
-bool oatStartup(void);
-void oatShutdown(void);
-void oatScanAllClassPointers(void (*callback)(void* ptr));
-void oatInitializeSSAConversion(CompilationUnit* cUnit);
-int SRegToVReg(const CompilationUnit* cUnit, int ssaReg);
-int SRegToSubscript(const CompilationUnit* cUnit, int ssaReg);
-bool oatFindLocalLiveIn(CompilationUnit* cUnit, BasicBlock* bb);
-bool oatDoSSAConversion(CompilationUnit* cUnit, BasicBlock* bb);
-bool oatDoConstantPropagation(CompilationUnit* cUnit, BasicBlock* bb);
-bool oatFindInductionVariables(CompilationUnit* cUnit, BasicBlock* bb);
-/* Clear the visited flag for each BB */
-bool oatClearVisitedFlag(CompilationUnit* cUnit, BasicBlock* bb);
-char* oatGetDalvikDisassembly(CompilationUnit* cUnit, const DecodedInstruction& insn,
-                              const char* note);
-char* oatFullDisassembler(CompilationUnit* cUnit, const MIR* mir);
-char* oatGetSSAString(CompilationUnit* cUnit, SSARepresentation* ssaRep);
-void oatDataFlowAnalysisDispatcher(CompilationUnit* cUnit,
-                                   bool (*func)(CompilationUnit* , BasicBlock*),
-                                   DataFlowAnalysisMode dfaMode,
-                                   bool isIterative);
-void oatMethodSSATransformation(CompilationUnit* cUnit);
-u8 oatGetRegResourceMask(int reg);
-void oatDumpCFG(CompilationUnit* cUnit, const char* dirPrefix);
-void oatProcessSwitchTables(CompilationUnit* cUnit);
-bool oatIsFpReg(int reg);
-uint32_t oatFpRegMask(void);
-void oatReplaceSpecialChars(std::string& str);
 BasicBlock* oatFindBlock(CompilationUnit* cUnit, unsigned int codeOffset);
+void oatReplaceSpecialChars(std::string& str);
 
 }  // namespace art
 
diff --git a/src/compiler/intermediate_rep.cc b/src/compiler/intermediate_rep.cc
index 96bec22..2c648d9 100644
--- a/src/compiler/intermediate_rep.cc
+++ b/src/compiler/intermediate_rep.cc
@@ -14,7 +14,6 @@
  * limitations under the License.
  */
 
-#include "dalvik.h"
 #include "compiler_internals.h"
 
 namespace art {
diff --git a/src/compiler/ralloc.cc b/src/compiler/ralloc.cc
index d9c6a57..ffb7fec 100644
--- a/src/compiler/ralloc.cc
+++ b/src/compiler/ralloc.cc
@@ -14,10 +14,9 @@
  * limitations under the License.
  */
 
-#include "dalvik.h"
 #include "compiler_internals.h"
 #include "dataflow.h"
-#include "codegen/ralloc.h"
+#include "codegen/ralloc_util.h"
 
 namespace art {
 
diff --git a/src/compiler/codegen/optimizer.h b/src/compiler/ralloc.h
similarity index 61%
copy from src/compiler/codegen/optimizer.h
copy to src/compiler/ralloc.h
index f5c81a6..be94419 100644
--- a/src/compiler/codegen/optimizer.h
+++ b/src/compiler/ralloc.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 The Android Open Source Project
+ * Copyright (C) 2012 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,19 +14,15 @@
  * limitations under the License.
  */
 
-#ifndef ART_SRC_COMPILER_COMPILER_OPTIMIZATION_H_
-#define ART_SRC_COMPILER_COMPILER_OPTIMIZATION_H_
+#ifndef ART_SRC_COMPILER_RALLOC_H_
+#define ART_SRC_COMPILER_RALLOC_H_
 
-#include "../dalvik.h"
+#include "compiler_internals.h"
 
 namespace art {
 
-/* Forward declarations */
-struct CompilationUnit;
-struct LIR;
-
-void oatApplyLocalOptimizations(CompilationUnit* cUnit, LIR* head, LIR* tail);
+void oatSimpleRegAlloc(CompilationUnit* cUnit);
 
 }  // namespace art
 
-#endif  // ART_SRC_COMPILER_COMPILER_OPTIMIZATION_H_
+#endif  // ART_SRC_COMPILER_RALLOC_H_
diff --git a/src/compiler/ssa_transformation.cc b/src/compiler/ssa_transformation.cc
index 09562fa..e689f6a 100644
--- a/src/compiler/ssa_transformation.cc
+++ b/src/compiler/ssa_transformation.cc
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "dalvik.h"
+#include "compiler_internals.h"
 #include "dataflow.h"
 
 namespace art {
diff --git a/src/compiler/codegen/optimizer.h b/src/compiler/ssa_transformation.h
similarity index 67%
copy from src/compiler/codegen/optimizer.h
copy to src/compiler/ssa_transformation.h
index f5c81a6..4c3ceb3 100644
--- a/src/compiler/codegen/optimizer.h
+++ b/src/compiler/ssa_transformation.h
@@ -14,19 +14,15 @@
  * limitations under the License.
  */
 
-#ifndef ART_SRC_COMPILER_COMPILER_OPTIMIZATION_H_
-#define ART_SRC_COMPILER_COMPILER_OPTIMIZATION_H_
+#ifndef ART_SRC_COMPILER_SSATRANSFORMATION_H_
+#define ART_SRC_COMPILER_SSATRANSFORMATION_H_
 
-#include "../dalvik.h"
+#include "compiler_internals.h"
 
 namespace art {
 
-/* Forward declarations */
-struct CompilationUnit;
-struct LIR;
-
-void oatApplyLocalOptimizations(CompilationUnit* cUnit, LIR* head, LIR* tail);
+void oatMethodSSATransformation(CompilationUnit* cUnit);
 
 }  // namespace art
 
-#endif  // ART_SRC_COMPILER_COMPILER_OPTIMIZATION_H_
+#endif  // ART_SRC_COMPILER_DATAFLOW_H_