Index: tools/bootImageRunner/bootImageRunner.h =================================================================== --- tools/bootImageRunner/bootImageRunner.h (.../fixIA32Asm) (revision 11856) +++ tools/bootImageRunner/bootImageRunner.h (.../fixJTOC) (revision 11856) @@ -87,9 +87,9 @@ #ifdef RVM_FOR_POWERPC /* Used in libvm.C, sys.C. Defined in assembly code: */ -extern void bootThread(int jtoc, int pr, int ti_or_ip, int fp); // assembler routine +extern void bootThread(int jtoc,int pr, int ti_or_ip, int fp); // assembler routine #else -extern int bootThread(int ti_or_ip, int jtoc, int pr, int sp); // assembler routine +extern int bootThread(int ti_or_ip, int pr, int sp); // assembler routine #endif // These are defined in libvm.C. Index: tools/bootImageRunner/syswrap.h =================================================================== --- tools/bootImageRunner/syswrap.h (.../fixIA32Asm) (revision 11856) +++ tools/bootImageRunner/syswrap.h (.../fixJTOC) (revision 11856) @@ -24,10 +24,6 @@ typedef int (*SelectFunc_t)(int, fd_set*, fd_set*, fd_set*, struct timeval*); typedef int (*PollFunc_t)(struct pollfd*, long unsigned int, int); -// Init function for the syscall wrapper library. -extern "C" void initSyscallWrapperLibrary(void *jtoc, VM_Offset processorsOffset, - int vmProcessorId /* Only used in single-virtual-processor mode. */); - // Accessor for real (libc) system call functions; // allows bypassing our wrapper functions. extern "C" SelectFunc_t getLibcSelect(void); Index: tools/bootImageRunner/ia32/libvm.c =================================================================== --- tools/bootImageRunner/ia32/libvm.c (.../fixIA32Asm) (revision 11856) +++ tools/bootImageRunner/ia32/libvm.c (.../fixJTOC) (revision 11856) @@ -137,9 +137,9 @@ * you can set a breakpoint here with gdb. */ int -boot (int ip, int jtoc, int pr, int sp) +boot (int ip, int pr, int sp) { - return bootThread (ip, jtoc, pr, sp); + return bootThread (ip, pr, sp); } #include @@ -214,9 +214,9 @@ } static int -isVmSignal(unsigned int ip, unsigned int jtoc) +isVmSignal(unsigned int ip, unsigned int vpAddress) { - return inRVMAddressSpace(ip) && inRVMAddressSpace(jtoc); + return inRVMAddressSpace(ip) && inRVMAddressSpace(vpAddress); } #if 0 // this isn't needed right now, but may be in @@ -1190,7 +1190,6 @@ *(unsigned int *) (pr + VM_Processor_threadId_offset) = VM_Scheduler_PRIMORDIAL_THREAD_INDEX << VM_ThinLockConstants_TL_THREAD_ID_SHIFT; - *(unsigned int *) (pr + VM_Processor_jtoc_offset) = jtoc; *(unsigned int *) (pr + VM_Processor_framePointer_offset) = (int)sp - 8; } @@ -1201,7 +1200,7 @@ *--sp = 0; /* STACKFRAME_NEXT_INSTRUCTION_OFFSET (for AIX compatability) */ // fprintf(SysTraceFile, "%s: here goes...\n", Me); - int rc = boot (ip, jtoc, pr, (int) sp); + int rc = boot (ip, pr, (int) sp); fprintf(SysErrorFile, "%s: createVM(): boot() returned; failed to create a virtual machine. rc=%d. Bye.\n", Me, rc); return 1; Index: tools/bootImageRunner/ia32/bootThread.S =================================================================== --- tools/bootImageRunner/ia32/bootThread.S (.../fixIA32Asm) (revision 11856) +++ tools/bootImageRunner/ia32/bootThread.S (.../fixJTOC) (revision 11856) @@ -12,10 +12,9 @@ */ /* - * Called as: bootThread(int ip, int jtoc, int pr, int rvm_sp) + * Called as: bootThread(int ip, int pr, int rvm_sp) * * where ip - address in RVM to branch to - * jtoc - RVM table of content * pr - address of the processor object * rvm_sp - address of the RVM stack */ @@ -50,9 +49,8 @@ * switch to the new RVM stack, using ebp to address * the old stack to read parameters. */ - movl 20(%ebp),%esp // new_esp <- parameter sp value - movl 16(%ebp),PR // PR register <- paramater processos obj value - movl 12(%ebp),JTOC // JTOC register <- parameter jtoc value + movl 16(%ebp),%esp // new_esp <- parameter sp value + movl 12(%ebp),PR // PR register <- paramater processos obj value movl 8(%ebp),%eax // eax <- parameter RVM ip /* Index: tools/bootImageRunner/sys.C =================================================================== --- tools/bootImageRunner/sys.C (.../fixIA32Asm) (revision 11856) +++ tools/bootImageRunner/sys.C (.../fixJTOC) (revision 11856) @@ -1026,7 +1026,7 @@ // Returned: virtual processor's o/s handle // extern "C" VM_Address -sysVirtualProcessorCreate(VM_Address jtoc, VM_Address pr, VM_Address ip, VM_Address fp) +sysVirtualProcessorCreate(VM_Address pr, VM_Address ip, VM_Address fp) { VM_Address *sysVirtualProcessorArguments; @@ -1036,11 +1036,10 @@ // create arguments // - sysVirtualProcessorArguments = new VM_Address[4]; - sysVirtualProcessorArguments[0] = jtoc; - sysVirtualProcessorArguments[1] = pr; - sysVirtualProcessorArguments[2] = ip; - sysVirtualProcessorArguments[3] = fp; + sysVirtualProcessorArguments = new VM_Address[3]; + sysVirtualProcessorArguments[0] = pr; + sysVirtualProcessorArguments[1] = ip; + sysVirtualProcessorArguments[2] = fp; // create attributes // @@ -1073,16 +1072,15 @@ static void * sysVirtualProcessorStartup(void *args) { - VM_Address jtoc = ((VM_Address *)args)[0]; - VM_Address pr = ((VM_Address *)args)[1]; - VM_Address ip = ((VM_Address *)args)[2]; - VM_Address fp = ((VM_Address *)args)[3]; + VM_Address pr = ((VM_Address *)args)[0]; + VM_Address ip = ((VM_Address *)args)[1]; + VM_Address fp = ((VM_Address *)args)[2]; if (VERBOSE_PTHREAD) #ifndef RVM_FOR_32_ADDR - fprintf(SysTraceFile, "%s: sysVirtualProcessorStartup: jtoc=0x%016llx pr=0x%016llx ip=0x%016llx fp=0x%016llx\n", Me, jtoc, pr, ip, fp); + fprintf(SysTraceFile, "%s: sysVirtualProcessorStartup: pr=0x%016llx ip=0x%016llx fp=0x%016llx\n", Me, pr, ip, fp); #else - fprintf(SysTraceFile, "%s: sysVirtualProcessorStartup: jtoc=0x%08x pr=0x%08x ip=0x%08x fp=0x%08x\n", Me, jtoc, pr, ip, fp); + fprintf(SysTraceFile, "%s: sysVirtualProcessorStartup: pr=0x%08x ip=0x%08x fp=0x%08x\n", Me, pr, ip, fp); #endif // branch to vm code // @@ -1090,10 +1088,10 @@ { *(VM_Address *) (pr + VM_Processor_framePointer_offset) = fp; VM_Address sp = fp + VM_Constants_STACKFRAME_BODY_OFFSET; - bootThread(ip, jtoc, pr, sp); + bootThread(ip, pr, sp); } #else - bootThread(jtoc, pr, ip, fp); + bootThread((int)(VM_Word)getJTOC(), pr, ip, fp); #endif // not reached Index: tools/bootImageWriter/src/org/jikesrvm/tools/bootImageWriter/BootImageWriter.java =================================================================== --- tools/bootImageWriter/src/org/jikesrvm/tools/bootImageWriter/BootImageWriter.java (.../fixIA32Asm) (revision 11856) +++ tools/bootImageWriter/src/org/jikesrvm/tools/bootImageWriter/BootImageWriter.java (.../fixJTOC) (revision 11856) @@ -48,6 +48,7 @@ import org.jikesrvm.scheduler.VM_Scheduler; import org.jikesrvm.ArchitectureSpecific.VM_CodeArray; import org.jikesrvm.ArchitectureSpecific.VM_LazyCompilationTrampoline; +import org.jikesrvm.ArchitectureSpecific.VM_OutOfLineMachineCode; import org.jikesrvm.jni.*; import org.jikesrvm.classloader.*; @@ -1113,6 +1114,9 @@ bootImage.resetAllocator(); bootRecord.tocRegister = jtocAddress.plus(intArrayType.getInstanceSize(VM_Statics.middleOfTable)); + // set up some stuff we need for compiling + VM_OutOfLineMachineCode.init(); + // // Compile methods and populate jtoc with literals, TIBs, and machine code. // Index: rvm/src-generated/opt-ir/ia32/OperatorList.dat =================================================================== --- rvm/src-generated/opt-ir/ia32/OperatorList.dat (.../fixIA32Asm) (revision 11856) +++ rvm/src-generated/opt-ir/ia32/OperatorList.dat (.../fixJTOC) (revision 11856) @@ -77,14 +77,6 @@ -# Acquire the JTOC from the processor object. -# Make unary operator to simplify CSE. -GET_JTOC -Unary -none - - - # Acquire a pointer to the current processor object. GET_CURRENT_PROCESSOR Nullary Index: rvm/src-generated/opt-burs/ia32/IA32.rules =================================================================== --- rvm/src-generated/opt-burs/ia32/IA32.rules (.../fixIA32Asm) (revision 11856) +++ rvm/src-generated/opt-burs/ia32/IA32.rules (.../fixJTOC) (revision 11856) @@ -1772,15 +1772,6 @@ EMIT(MIR_Move.mutate(P(p), IA32_MOV, Nullary.getResult(P(p)), new RegisterOperand(getESI(), VM_TypeReference.Int))); ##### -# GET_JTOC -##### -r: GET_JTOC(r) -15 -EMIT_INSTRUCTION -EMIT(MIR_Move.mutate(P(p), IA32_MOV, Unary.getResult(P(p)), \\ - MO_BD(Unary.getVal(P(p)), VM_ArchEntrypoints.jtocField.getOffset(), DW, null, null))); - -##### # BYTE_LOAD ##### r: BYTE_LOAD(riv, riv) Index: rvm/src-generated/opt-burs/ia32/IA32_x87.rules =================================================================== --- rvm/src-generated/opt-burs/ia32/IA32_x87.rules (.../fixIA32Asm) (revision 11856) +++ rvm/src-generated/opt-burs/ia32/IA32_x87.rules (.../fixJTOC) (revision 11856) @@ -337,13 +337,6 @@ EMIT(MIR_Nullary.create(get387_FPC(P(p)), myFP0())); \ EMIT(MIR_Move.mutate(P(p), IA32_FSTP, Binary.getResult(P(p)), myFP0())); -# Use FLD1/FLDZ to avoid loading from the JTOC -r: MATERIALIZE_FP_CONSTANT(GET_JTOC(r)) -is387_FPC(P(p), 26) -EMIT_INSTRUCTION -EMIT(MIR_Nullary.create(get387_FPC(P(p)), myFP0())); \ -EMIT(MIR_Move.mutate(P(p), IA32_FSTP, Binary.getResult(P(p)), myFP0())); - ##### # BOOLEAN_CMP_FLOAT ##### Index: rvm/src/org/jikesrvm/jni/ia32/VM_JNIGCMapIterator.java =================================================================== --- rvm/src/org/jikesrvm/jni/ia32/VM_JNIGCMapIterator.java (.../fixIA32Asm) (revision 11856) +++ rvm/src/org/jikesrvm/jni/ia32/VM_JNIGCMapIterator.java (.../fixJTOC) (revision 11856) @@ -41,7 +41,7 @@ // // 0 + saved FP + <---- FP for Jave to Native C glue frame // -4 | methodID | - // -8 | saved EDI | non-volatile GPR (JTOC for baseline callers or ? for opt callers) + // -8 | saved EDI | non-volatile GPR // -C | saved EBX | non-volatile GPR // -10 | saved EBP | non-volatile GPR // -14 | returnAddr | (for return from OutOfLineMachineCode) @@ -122,7 +122,7 @@ // the JNI transition frame at a fixed negative offset from the callers FP. // the save non-volatiles are EBX EBP and EDI. // - registerLocations.set(JTOC.value(), framePtr.plus(VM_JNICompiler.EDI_SAVE_OFFSET).toWord()); + registerLocations.set(EDI.value(), framePtr.plus(VM_JNICompiler.EDI_SAVE_OFFSET).toWord()); registerLocations.set(EBX.value(), framePtr.plus(VM_JNICompiler.EBX_SAVE_OFFSET).toWord()); registerLocations.set(EBP.value(), framePtr.plus(VM_JNICompiler.EBP_SAVE_OFFSET).toWord()); Index: rvm/src/org/jikesrvm/jni/ia32/VM_JNICompiler.java =================================================================== --- rvm/src/org/jikesrvm/jni/ia32/VM_JNICompiler.java (.../fixIA32Asm) (revision 11856) +++ rvm/src/org/jikesrvm/jni/ia32/VM_JNICompiler.java (.../fixJTOC) (revision 11856) @@ -30,6 +30,7 @@ import org.jikesrvm.runtime.VM_ArchEntrypoints; import org.jikesrvm.runtime.VM_Entrypoints; import org.jikesrvm.runtime.VM_Statics; +import org.jikesrvm.runtime.VM_Magic; import org.jikesrvm.scheduler.VM_Processor; import org.vmmagic.unboxed.Address; import org.vmmagic.unboxed.Offset; @@ -48,7 +49,7 @@ public abstract class VM_JNICompiler implements VM_BaselineConstants { // offsets to saved regs and addresses in java to C glue frames - // EDI (JTOC) and EBX are nonvolatile registers in RVM + // EDI and EBX are nonvolatile registers in RVM // private static final int SAVED_GPRS = 5; public static final Offset EDI_SAVE_OFFSET = Offset.fromIntSignExtend(STACKFRAME_BODY_OFFSET); @@ -63,7 +64,7 @@ // following used in VM_Compiler to compute offset to first local: // includes 5 words: - // SAVED_JAVA_FP, VM_JNIEnvironment, S0 (ECX), EBX, and JTOC (EDI) + // SAVED_JAVA_FP, VM_JNIEnvironment, S0 (ECX), EBX, and EDI public static final int SAVED_GPRS_FOR_JNI = 5; /***************************************************************** @@ -122,10 +123,10 @@ asm.emitMOV_Reg_Imm(S0, nativeIP.toInt()); // branch to outofline code in bootimage - asm.emitCALL_RegDisp(JTOC, VM_ArchEntrypoints.invokeNativeFunctionInstructionsField.getOffset()); + asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(VM_ArchEntrypoints.invokeNativeFunctionInstructionsField.getOffset())); // return here from VM_OutOfLineMachineCode upon return from native code - // PR and RVM JTOC restored, T0,T1 contain return from native call + // PR restored, T0,T1 contain return from native call // If the return type is reference, look up the real value in the JNIref array @@ -148,7 +149,7 @@ globalRef.resolve(asm); asm.emitMOV_Reg_Reg(T1, T0); asm.emitTEST_Reg_Imm(T1, VM_JNIGlobalRefTable.STRONG_REF_BIT); - asm.emitMOV_Reg_RegDisp(T1, JTOC, VM_Entrypoints.JNIGlobalRefsField.getOffset()); + asm.emitMOV_Reg_Abs(T1, VM_Magic.getTocPointer().plus(VM_Entrypoints.JNIGlobalRefsField.getOffset())); VM_ForwardReference weakGlobalRef = asm.forwardJcc(VM_Assembler.EQ); // Strong global references @@ -194,12 +195,12 @@ // if pending exception, discard the return value and current stack frame // then jump to athrow asm.emitMOV_Reg_Reg(T0, EBX); - asm.emitMOV_Reg_RegDisp(T1, - JTOC, - VM_Entrypoints.athrowMethod.getOffset()); // acquire jump addr before restoring nonvolatiles + asm.emitMOV_Reg_Abs(T1, + VM_Magic.getTocPointer().plus( + VM_Entrypoints.athrowMethod.getOffset())); // acquire jump addr before restoring nonvolatiles asm.emitMOV_Reg_Reg(SP, EBP); // discard current stack frame - asm.emitMOV_Reg_RegDisp(JTOC, SP, EDI_SAVE_OFFSET); // restore nonvolatile EDI register + asm.emitMOV_Reg_RegDisp(EDI, SP, EDI_SAVE_OFFSET); // restore nonvolatile EDI register asm.emitMOV_Reg_RegDisp(EBX, SP, EBX_SAVE_OFFSET); // restore nonvolatile EBX register asm.emitMOV_Reg_RegDisp(EBP, SP, EBP_SAVE_OFFSET); // restore nonvolatile EBP register @@ -213,7 +214,7 @@ // no exception, proceed to return to caller asm.emitMOV_Reg_Reg(SP, EBP); // discard current stack frame - asm.emitMOV_Reg_RegDisp(JTOC, SP, EDI_SAVE_OFFSET); // restore nonvolatile EDI register + asm.emitMOV_Reg_RegDisp(EDI, SP, EDI_SAVE_OFFSET); // restore nonvolatile EDI register asm.emitMOV_Reg_RegDisp(EBX, SP, EBX_SAVE_OFFSET); // restore nonvolatile EBX register asm.emitMOV_Reg_RegDisp(EBP, SP, EBP_SAVE_OFFSET); // restore nonvolatile EBP register @@ -257,7 +258,7 @@ * +4 |returnAddr| |returnAddr| * 0 + + +saved FP + <---- FP for glue frame * -4 | | |methodID | - * -8 | | |saved EDI | (EDI == JTOC - for baseline methods) + * -8 | | |saved EDI | * -C | | |saved EBX | * -10 | | | | * @@ -275,14 +276,11 @@ asm.emitMOV_RegDisp_Imm(SP, Offset.fromIntSignExtend(STACKFRAME_METHOD_ID_OFFSET), compiledMethodId); // save nonvolatile registrs: EDI, EBX, EBP - asm.emitMOV_RegDisp_Reg(SP, EDI_SAVE_OFFSET, JTOC); + asm.emitMOV_RegDisp_Reg(SP, EDI_SAVE_OFFSET, EDI); asm.emitMOV_RegDisp_Reg(SP, EBX_SAVE_OFFSET, EBX); asm.emitMOV_RegDisp_Reg(SP, EBP_SAVE_OFFSET, EBP); asm.emitMOV_Reg_Reg(EBP, SP); // Establish EBP as the framepointer for use in the rest of the glue frame - - // restore JTOC with the value saved in VM_Processor.jtoc for use in prolog - VM_ProcessorLocalState.emitMoveFieldToReg(asm, JTOC, VM_ArchEntrypoints.jtocField.getOffset()); } /************************************************************** @@ -422,15 +420,12 @@ asm.emitMOV_RegDisp_Reg(EBP, emptyStackOffset, EBX); // store as 1st arg // Insert the JNI arg at the second entry: class or object as a jref index - // first reload JTOC, baseline compiler assumes JTOC register -> jtoc - // TODO: DAVE: doesn't it already have the JTOC???? - VM_ProcessorLocalState.emitMoveFieldToReg(asm, JTOC, VM_ArchEntrypoints.jtocField.getOffset()); if (method.isStatic()) { // For static method, push on arg stack the VM_Class object // jtoc[tibOffset] -> class TIB ptr -> first TIB entry -> class object -> classForType Offset klassOffset = Offset.fromIntSignExtend(VM_Statics.findOrCreateObjectLiteral(klass.getClassForType())); // push java.lang.Class object for klass - asm.emitMOV_Reg_RegDisp(EBX, JTOC, klassOffset); + asm.emitMOV_Reg_Abs(EBX, VM_Magic.getTocPointer().plus(klassOffset)); } else { // For nonstatic method, "this" pointer should be the first arg in the caller frame, // make it the 2nd arg in the glue frame @@ -628,7 +623,7 @@ * *
    * Expect:
-   *  -JTOC, PR registers are valid
+   *  -PR register is valid
    *  -S0 contains a pointer to the VM_Thread.jniEnv
    *  -EBX and T1 are available as scratch registers
    * Perform these steps:
@@ -677,7 +672,7 @@
    *            |            |           EBP ->  |saved FP    |
    *            |            |                   |methodID    | normal MethodID for JNI function
    *            |            |                   |saved JavaFP| offset to preceeding java frame
-   *            |            |                   |saved edi   | to be used for JTOC
+   *            |            |                   |saved edi   | to be used for nonvolatile
    *            |            |                   |  "   ebx   | to be used for nonvolatile
    *            |            |                   |  "   ecx   | to be used for scrach
    *            |            |                   |  "   esi   | to be used for PR
@@ -710,7 +705,7 @@
     // save registers that will be used in RVM, to be restored on return to C
     // TODO: I don't think we need to do this: C has no nonvolatile registers on Linux/x86 --dave
     // TODO: DAVE
-    asm.emitPUSH_Reg(JTOC);
+    asm.emitPUSH_Reg(EDI);
     asm.emitPUSH_Reg(EBX);
     asm.emitPUSH_Reg(S0);
     VM_ProcessorLocalState.emitPushProcessor(asm);
@@ -748,17 +743,13 @@
     asm.emitMOV_Reg_RegDisp(EBX, EBP, Offset.fromIntSignExtend(2 * WORDSIZE));   // pick up arg 0 (from callers frame)
     VM_ProcessorLocalState.emitLoadProcessor(asm, EBX, VM_Entrypoints.JNIEnvSavedPRField.getOffset());
 
-    // reload JTOC from virtual processor
-    // NOTE: EDI saved in glue frame is just EDI (opt compiled code uses it as normal non-volatile)
-    VM_ProcessorLocalState.emitMoveFieldToReg(asm, JTOC, VM_ArchEntrypoints.jtocField.getOffset());
-
     // T0 gets PR.statusField
     VM_ProcessorLocalState.emitMoveFieldToReg(asm, T0, VM_Entrypoints.vpStatusField.getOffset());
     asm.emitCMP_Reg_Imm(T0, VM_Processor.IN_NATIVE);      // jmp if still IN_NATIVE
     VM_ForwardReference fr = asm.forwardJcc(VM_Assembler.EQ);       // if so, skip 3 instructions
 
     // blocked in native, do pthread yield
-    asm.emitMOV_Reg_RegDisp(T0, JTOC, VM_Entrypoints.the_boot_recordField.getOffset());  // T0<-bootrecord addr
+    asm.emitMOV_Reg_Abs(T0, VM_Magic.getTocPointer().plus(VM_Entrypoints.the_boot_recordField.getOffset()));  // T0<-bootrecord addr
     asm.emitCALL_RegDisp(T0, VM_Entrypoints.sysVirtualProcessorYieldIPField.getOffset());
     asm.emitJMP_Imm(retryLabel);                          // retry from beginning
 
@@ -776,7 +767,7 @@
 
     // status is now IN_JAVA. GC can not occur while we execute on a processor
     // in this state, so it is safe to access fields of objects.
-    // RVM JTOC and PR registers have been restored and EBX contains a pointer to
+    // RVM PR register has been restored and EBX contains a pointer to
     // the thread's VM_JNIEnvironment.
 
     // done saving, bump SP to reserve room for the local variables
@@ -795,7 +786,7 @@
     // put framePointer in VP following Jikes RVM conventions.
     VM_ProcessorLocalState.emitMoveRegToField(asm, VM_ArchEntrypoints.framePointerField.getOffset(), EBP);
 
-    // at this point: JTOC and PR have been restored &
+    // at this point: PR has been restored &
     // processor status = IN_JAVA,
     // arguments for the call have been setup, space on the stack for locals
     // has been acquired.
@@ -808,8 +799,7 @@
   public static void generateEpilogForJNIMethod(VM_Assembler asm, VM_Method method) {
     // assume RVM PR regs still valid. potentially T1 & T0 contain return
     // values and should not be modified. we use regs saved in prolog and restored
-    // before return to do whatever needs to be done.  does not assume JTOC is valid,
-    // and may use it as scratch reg.
+    // before return to do whatever needs to be done.
 
     // if returning long, switch the order of the hi/lo word in T0 and T1
     if (method.getReturnType().isLongType()) {
@@ -836,9 +826,9 @@
     asm.emitMOV_Reg_RegDisp(S0, S0, VM_Entrypoints.jniEnvField.getOffset());
 
     // set jniEnv TopJavaFP using value saved in frame in prolog
-    asm.emitMOV_Reg_RegDisp(EDI, EBP, SAVED_JAVA_FP_OFFSET);      // JTOC<-saved TopJavaFP (offset)
+    asm.emitMOV_Reg_RegDisp(EDI, EBP, SAVED_JAVA_FP_OFFSET);      // EDI<-saved TopJavaFP (offset)
     asm.emitADD_Reg_Reg(EDI, EBP);                                // change offset from FP into address
-    asm.emitMOV_RegDisp_Reg(S0, VM_Entrypoints.JNITopJavaFPField.getOffset(), EDI); // jniEnv.TopJavaFP <- JTOC
+    asm.emitMOV_RegDisp_Reg(S0, VM_Entrypoints.JNITopJavaFPField.getOffset(), EDI); // jniEnv.TopJavaFP <- EDI
 
     // in case thread has migrated to different PR, reset saved PRs to current PR
     VM_ProcessorLocalState.emitStoreProcessor(asm, S0, VM_Entrypoints.JNIEnvSavedPRField.getOffset());
@@ -852,7 +842,7 @@
     VM_ProcessorLocalState.emitPopProcessor(asm);
     asm.emitPOP_Reg(S0);
     asm.emitPOP_Reg(EBX);
-    asm.emitPOP_Reg(JTOC);
+    asm.emitPOP_Reg(EDI);
 
     // NOTE: C expects the framepointer to be restored to EBP, so
     //       the epilogue for the C to Java glue code must follow that
Index: rvm/src/org/jikesrvm/runtime/VM_SysCall.java
===================================================================
--- rvm/src/org/jikesrvm/runtime/VM_SysCall.java	(.../fixIA32Asm)	(revision 11856)
+++ rvm/src/org/jikesrvm/runtime/VM_SysCall.java	(.../fixJTOC)	(revision 11856)
@@ -152,14 +152,13 @@
 
   /**
    * Create a virtual processor (aka "unix kernel thread", "pthread").
-   * @param jtoc  register values to use for thread startup
    * @param pr
    * @param ip
    * @param fp
    * @return virtual processor's o/s handle
    */
   @SysCallTemplate
-  public abstract int sysVirtualProcessorCreate(Address jtoc, Address pr, Address ip, Address fp);
+  public abstract int sysVirtualProcessorCreate(Address pr, Address ip, Address fp);
 
   /**
    * Bind execution of current virtual processor to specified physical cpu.
Index: rvm/src/org/jikesrvm/runtime/VM_ArchEntrypoints.java
===================================================================
--- rvm/src/org/jikesrvm/runtime/VM_ArchEntrypoints.java	(.../fixIA32Asm)	(revision 11856)
+++ rvm/src/org/jikesrvm/runtime/VM_ArchEntrypoints.java	(.../fixJTOC)	(revision 11856)
@@ -56,10 +56,6 @@
       (VM.BuildForIA32) ? VM_EntrypointHelper.getField("Lorg/jikesrvm/" + arch + "/VM_Registers;",
                                    "fp",
                                    "Lorg/vmmagic/unboxed/Address;") : null;
-  VM_Field jtocField =
-      (VM.BuildForIA32) ? VM_EntrypointHelper.getField("Lorg/jikesrvm/scheduler/VM_Processor;",
-                                   "jtoc",
-                                   "Lorg/vmmagic/unboxed/Address;") : null;
   VM_Field framePointerField =
       (VM.BuildForIA32) ? VM_EntrypointHelper.getField("Lorg/jikesrvm/scheduler/VM_Processor;",
                                    "framePointer",
Index: rvm/src/org/jikesrvm/objectmodel/VM_TIB.java
===================================================================
--- rvm/src/org/jikesrvm/objectmodel/VM_TIB.java	(.../fixIA32Asm)	(revision 11856)
+++ rvm/src/org/jikesrvm/objectmodel/VM_TIB.java	(.../fixJTOC)	(revision 11856)
@@ -43,7 +43,7 @@
    * @return
    */
   public static int lazyMethodInvokerTrampolineWords() {
-    int codeWords = VM.BuildFor32Addr ? 3 : 2;
+    int codeWords = VM.BuildForIA32 ? 2 : (VM.BuildFor32Addr ? 3 : 2);
     if (VM.runningVM && VM.VerifyAssertions) {
       int codeBytes = VM_LazyCompilationTrampoline.instructions.length() << VM_ArchConstants.LG_INSTRUCTION_WIDTH;
       VM._assert(codeWords == ((codeBytes + BYTES_IN_ADDRESS - 1) >>> LOG_BYTES_IN_ADDRESS));
Index: rvm/src/org/jikesrvm/compilers/baseline/ia32/VM_BaselineExceptionDeliverer.java
===================================================================
--- rvm/src/org/jikesrvm/compilers/baseline/ia32/VM_BaselineExceptionDeliverer.java	(.../fixIA32Asm)	(revision 11856)
+++ rvm/src/org/jikesrvm/compilers/baseline/ia32/VM_BaselineExceptionDeliverer.java	(.../fixJTOC)	(revision 11856)
@@ -103,7 +103,7 @@
     }
     // Restore nonvolatile registers used by the baseline compiler.
     if (VM.VerifyAssertions) VM._assert(SAVED_GPRS == 2);
-    registers.gprs.set(JTOC.value(), fp.plus(JTOC_SAVE_OFFSET).loadWord());
+    registers.gprs.set(EDI.value(), fp.plus(EDI_SAVE_OFFSET).loadWord());
     registers.gprs.set(EBX.value(), fp.plus(EBX_SAVE_OFFSET).loadWord());
 
     registers.unwindStackFrame();
Index: rvm/src/org/jikesrvm/compilers/baseline/ia32/VM_BaselineGCMapIterator.java
===================================================================
--- rvm/src/org/jikesrvm/compilers/baseline/ia32/VM_BaselineGCMapIterator.java	(.../fixIA32Asm)	(revision 11856)
+++ rvm/src/org/jikesrvm/compilers/baseline/ia32/VM_BaselineGCMapIterator.java	(.../fixJTOC)	(revision 11856)
@@ -256,7 +256,7 @@
       if (!bridgeRegistersLocationUpdated) {
         // point registerLocations[] to our callers stackframe
         //
-        registerLocations.set(JTOC.value(), framePtr.plus(JTOC_SAVE_OFFSET).toWord());
+        registerLocations.set(EDI.value(), framePtr.plus(EDI_SAVE_OFFSET).toWord());
         registerLocations.set(T0.value(), framePtr.plus(T0_SAVE_OFFSET).toWord());
         registerLocations.set(T1.value(), framePtr.plus(T1_SAVE_OFFSET).toWord());
         registerLocations.set(EBX.value(), framePtr.plus(EBX_SAVE_OFFSET).toWord());
@@ -328,7 +328,7 @@
     } else {
       // point registerLocations[] to our callers stackframe
       //
-      registerLocations.set(JTOC.value(), framePtr.plus(JTOC_SAVE_OFFSET).toWord());
+      registerLocations.set(EDI.value(), framePtr.plus(EDI_SAVE_OFFSET).toWord());
       registerLocations.set(EBX.value(), framePtr.plus(EBX_SAVE_OFFSET).toWord());
     }
 
Index: rvm/src/org/jikesrvm/compilers/baseline/ia32/VM_Barriers.java
===================================================================
--- rvm/src/org/jikesrvm/compilers/baseline/ia32/VM_Barriers.java	(.../fixIA32Asm)	(revision 11856)
+++ rvm/src/org/jikesrvm/compilers/baseline/ia32/VM_Barriers.java	(.../fixJTOC)	(revision 11856)
@@ -16,6 +16,7 @@
 import org.jikesrvm.ArchitectureSpecific.VM_Assembler;
 import org.jikesrvm.ia32.VM_BaselineConstants;
 import org.jikesrvm.runtime.VM_Entrypoints;
+import org.jikesrvm.runtime.VM_Magic;
 import org.vmmagic.unboxed.Offset;
 
 /**
@@ -33,7 +34,7 @@
     asm.emitPUSH_RegDisp(SP, of8);  // Push what was originally (SP, 4)
     asm.emitPUSH_RegDisp(SP, of8);  // Push what was originally (SP, 0)
     genParameterRegisterLoad(asm, 3);
-    asm.emitCALL_RegDisp(JTOC, VM_Entrypoints.arrayStoreWriteBarrierMethod.getOffset());
+    asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(VM_Entrypoints.arrayStoreWriteBarrierMethod.getOffset()));
   }
 
   static void compilePutfieldBarrier(VM_Assembler asm, GPR reg, int locationMetadata) {
@@ -47,7 +48,7 @@
     asm.emitPUSH_RegDisp(SP, of8);  // Push what was originally (SP, 0)
     asm.emitPUSH_Imm(locationMetadata);
     genParameterRegisterLoad(asm, 4);
-    asm.emitCALL_RegDisp(JTOC, VM_Entrypoints.putfieldWriteBarrierMethod.getOffset());
+    asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(VM_Entrypoints.putfieldWriteBarrierMethod.getOffset()));
   }
 
   static void compilePutfieldBarrierImm(VM_Assembler asm, Offset fieldOffset, int locationMetadata) {
@@ -61,7 +62,7 @@
     asm.emitPUSH_RegDisp(SP, of8);  // Push what was originally (SP, 0)
     asm.emitPUSH_Imm(locationMetadata);
     genParameterRegisterLoad(asm, 4);
-    asm.emitCALL_RegDisp(JTOC, VM_Entrypoints.putfieldWriteBarrierMethod.getOffset());
+    asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(VM_Entrypoints.putfieldWriteBarrierMethod.getOffset()));
   }
 
   static void compilePutstaticBarrier(VM_Assembler asm, GPR reg, int locationMetadata) {
@@ -72,7 +73,7 @@
     asm.emitPUSH_RegDisp(SP, of4);
     asm.emitPUSH_Imm(locationMetadata);
     genParameterRegisterLoad(asm, 3);
-    asm.emitCALL_RegDisp(JTOC, VM_Entrypoints.putstaticWriteBarrierMethod.getOffset());
+    asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(VM_Entrypoints.putstaticWriteBarrierMethod.getOffset()));
   }
 
   static void compilePutstaticBarrierImm(VM_Assembler asm, Offset fieldOffset, int locationMetadata) {
@@ -83,14 +84,14 @@
     asm.emitPUSH_RegDisp(SP, of4);
     asm.emitPUSH_Imm(locationMetadata);
     genParameterRegisterLoad(asm, 3);
-    asm.emitCALL_RegDisp(JTOC, VM_Entrypoints.putstaticWriteBarrierMethod.getOffset());
+    asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(VM_Entrypoints.putstaticWriteBarrierMethod.getOffset()));
   }
 
   static void compileArrayLoadBarrier(VM_Assembler asm, boolean pushResult) {
     // on entry java stack contains ...|target_array_ref|array_index|
     // SP -> index, SP+4 -> target_ref
     genParameterRegisterLoad(asm, 2);
-    asm.emitCALL_RegDisp(JTOC, VM_Entrypoints.arrayLoadReadBarrierMethod.getOffset());
+    asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(VM_Entrypoints.arrayLoadReadBarrierMethod.getOffset()));
     if (pushResult) asm.emitPUSH_Reg(T0);
   }
 
@@ -101,7 +102,7 @@
     asm.emitPUSH_Reg(reg);
     asm.emitPUSH_Imm(locationMetadata);
     genParameterRegisterLoad(asm, 3);
-    asm.emitCALL_RegDisp(JTOC, VM_Entrypoints.getfieldReadBarrierMethod.getOffset());
+    asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(VM_Entrypoints.getfieldReadBarrierMethod.getOffset()));
     asm.emitPUSH_Reg(T0);
   }
 
@@ -110,7 +111,7 @@
     asm.emitPUSH_Imm(fieldOffset.toInt());
     asm.emitPUSH_Imm(locationMetadata);
     genParameterRegisterLoad(asm, 3);
-    asm.emitCALL_RegDisp(JTOC, VM_Entrypoints.getfieldReadBarrierMethod.getOffset());
+    asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(VM_Entrypoints.getfieldReadBarrierMethod.getOffset()));
     asm.emitPUSH_Reg(T0);
   }
 
@@ -118,7 +119,7 @@
     asm.emitPUSH_Reg(reg);
     asm.emitPUSH_Imm(locationMetadata);
     genParameterRegisterLoad(asm, 2);
-    asm.emitCALL_RegDisp(JTOC, VM_Entrypoints.getstaticReadBarrierMethod.getOffset());
+    asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(VM_Entrypoints.getstaticReadBarrierMethod.getOffset()));
     asm.emitPUSH_Reg(T0);
   }
 
@@ -126,7 +127,7 @@
     asm.emitPUSH_Imm(fieldOffset.toInt());
     asm.emitPUSH_Imm(locationMetadata);
     genParameterRegisterLoad(asm, 2);
-    asm.emitCALL_RegDisp(JTOC, VM_Entrypoints.getstaticReadBarrierMethod.getOffset());
+    asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(VM_Entrypoints.getstaticReadBarrierMethod.getOffset()));
     asm.emitPUSH_Reg(T0);
   }
 
@@ -145,7 +146,7 @@
     // on exit: stack is the same
     asm.emitPUSH_RegDisp(SP, Offset.fromIntSignExtend(offset));   // dup
     genParameterRegisterLoad(asm, 1);
-    asm.emitCALL_RegDisp(JTOC, VM_Entrypoints.modifyCheckMethod.getOffset());
+    asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(VM_Entrypoints.modifyCheckMethod.getOffset()));
   }
 
   /**
Index: rvm/src/org/jikesrvm/compilers/baseline/ia32/VM_Compiler.java
===================================================================
--- rvm/src/org/jikesrvm/compilers/baseline/ia32/VM_Compiler.java	(.../fixIA32Asm)	(revision 11856)
+++ rvm/src/org/jikesrvm/compilers/baseline/ia32/VM_Compiler.java	(.../fixJTOC)	(revision 11856)
@@ -46,6 +46,7 @@
 import org.jikesrvm.runtime.VM_MagicNames;
 import org.jikesrvm.runtime.VM_Runtime;
 import org.jikesrvm.runtime.VM_Statics;
+import org.jikesrvm.runtime.VM_Magic;
 import org.jikesrvm.scheduler.VM_Thread;
 import org.vmmagic.pragma.Inline;
 import org.vmmagic.pragma.Uninterruptible;
@@ -272,7 +273,7 @@
    */
   @Override
   protected final void emit_ldc(Offset offset, byte type) {
-    asm.emitPUSH_RegDisp(JTOC, offset);
+    asm.emitPUSH_Abs(VM_Magic.getTocPointer().plus(offset));
   }
 
   /**
@@ -283,12 +284,12 @@
   @Override
   protected final void emit_ldc2(Offset offset, byte type) {
     if (SSE2_BASE) {
-      asm.emitMOVQ_Reg_RegDisp(XMM0, JTOC, offset); // XMM0 is constant value
+      asm.emitMOVQ_Reg_Abs(XMM0, VM_Magic.getTocPointer().plus(offset)); // XMM0 is constant value
       asm.emitADD_Reg_Imm(SP, -8);        // adjust stack
       asm.emitMOVQ_RegInd_Reg(SP, XMM0);  // place value on stack
     } else {
-      asm.emitPUSH_RegDisp(JTOC, offset.plus(4)); // high 32 bits
-      asm.emitPUSH_RegDisp(JTOC, offset);   // low 32 bits
+      asm.emitPUSH_Abs(VM_Magic.getTocPointer().plus(offset).plus(4)); // high 32 bits
+      asm.emitPUSH_Abs(VM_Magic.getTocPointer().plus(offset));   // low 32 bits
     }
   }
 
@@ -613,7 +614,7 @@
     asm.emitPUSH_RegDisp(SP, ONE_SLOT);  // duplicate object value
     genParameterRegisterLoad(2);         // pass 2 parameter
     // call checkstore(array ref, value)
-    asm.emitCALL_RegDisp(JTOC, VM_Entrypoints.checkstoreMethod.getOffset());
+    asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(VM_Entrypoints.checkstoreMethod.getOffset()));
     asm.emitMOV_Reg_RegDisp(T0, SP, ONE_SLOT);  // T0 is array index
     asm.emitMOV_Reg_RegDisp(S0, SP, TWO_SLOTS); // S0 is the array ref
     genBoundsCheck(asm, T0, S0);        // T0 is index, S0 is address of array
@@ -824,15 +825,13 @@
     asm.emitPOP_Reg(T0);
     asm.emitPOP_Reg(S0);
     asm.emitPOP_Reg(T1);
-    asm.emitPOP_Reg(JTOC);                  // JTOC is scratch register
+    asm.emitPOP_Reg(S1);
     asm.emitPUSH_Reg(S0);
     asm.emitPUSH_Reg(T0);
-    asm.emitPUSH_Reg(JTOC);
+    asm.emitPUSH_Reg(S1);
     asm.emitPUSH_Reg(T1);
     asm.emitPUSH_Reg(S0);
     asm.emitPUSH_Reg(T0);
-    // restore JTOC register
-    VM_ProcessorLocalState.emitMoveFieldToReg(asm, JTOC, VM_ArchEntrypoints.jtocField.getOffset());
   }
 
   /**
@@ -1087,7 +1086,7 @@
     asm.emitPUSH_RegDisp(SP, off.plus(20));
     asm.emitPUSH_RegDisp(SP, off.plus(20));
     // (4) invoke C function through bootrecord
-    asm.emitMOV_Reg_RegDisp(S0, JTOC, VM_Entrypoints.the_boot_recordField.getOffset());
+    asm.emitMOV_Reg_Abs(S0, VM_Magic.getTocPointer().plus(VM_Entrypoints.the_boot_recordField.getOffset()));
     asm.emitCALL_RegDisp(S0, VM_Entrypoints.sysLongDivideIPField.getOffset());
     // (5) pop space for arguments
     asm.emitADD_Reg_Imm(SP, 4 * WORDSIZE);
@@ -1126,7 +1125,7 @@
     asm.emitPUSH_RegDisp(SP, off.plus(20));
     asm.emitPUSH_RegDisp(SP, off.plus(20));
     // (4) invoke C function through bootrecord
-    asm.emitMOV_Reg_RegDisp(S0, JTOC, VM_Entrypoints.the_boot_recordField.getOffset());
+    asm.emitMOV_Reg_Abs(S0, VM_Magic.getTocPointer().plus(VM_Entrypoints.the_boot_recordField.getOffset()));
     asm.emitCALL_RegDisp(S0, VM_Entrypoints.sysLongRemainderIPField.getOffset());
     // (5) pop space for arguments
     asm.emitADD_Reg_Imm(SP, 4 * WORDSIZE);
@@ -1597,7 +1596,7 @@
   protected final void emit_f2i() {
     if (SSE2_BASE) {
       // Set up max int in XMM0
-      asm.emitMOVSS_Reg_RegDisp(XMM0, JTOC, VM_Entrypoints.maxintFloatField.getOffset());
+      asm.emitMOVSS_Reg_Abs(XMM0, VM_Magic.getTocPointer().plus(VM_Entrypoints.maxintFloatField.getOffset()));
       // Set up value in XMM1
       asm.emitMOVSS_Reg_RegInd(XMM1, SP);
       // if value > maxint or NaN goto fr1; FP0 = value
@@ -1627,7 +1626,7 @@
       // (2) Push arg to C function
       asm.emitPUSH_RegDisp(SP, off);
       // (3) invoke C function through bootrecord
-      asm.emitMOV_Reg_RegDisp(S0, JTOC, VM_Entrypoints.the_boot_recordField.getOffset());
+      asm.emitMOV_Reg_Abs(S0, VM_Magic.getTocPointer().plus(VM_Entrypoints.the_boot_recordField.getOffset()));
       asm.emitCALL_RegDisp(S0, VM_Entrypoints.sysFloatToIntIPField.getOffset());
       // (4) pop argument;
       asm.emitPOP_Reg(S0);
@@ -1651,7 +1650,7 @@
     // Setup value into FP1
     asm.emitFLD_Reg_RegInd(FP0, SP);
     // Setup maxlong into FP0
-    asm.emitFLD_Reg_RegDisp(FP0, JTOC, VM_Entrypoints.maxlongFloatField.getOffset());
+    asm.emitFLD_Reg_Abs(FP0, VM_Magic.getTocPointer().plus(VM_Entrypoints.maxlongFloatField.getOffset()));
     // if value > maxlong or NaN goto fr1; FP0 = value
     asm.emitFUCOMIP_Reg_Reg(FP0, FP1);
     VM_ForwardReference fr1 = asm.forwardJcc(VM_Assembler.LLE);
@@ -1687,7 +1686,7 @@
   protected final void emit_d2i() {
     if (SSE2_BASE) {
       // Set up max int in XMM0
-      asm.emitMOVLPD_Reg_RegDisp(XMM0, JTOC, VM_Entrypoints.maxintField.getOffset());
+      asm.emitMOVLPD_Reg_Abs(XMM0, VM_Magic.getTocPointer().plus(VM_Entrypoints.maxintField.getOffset()));
       // Set up value in XMM1
       asm.emitMOVLPD_Reg_RegInd(XMM1, SP);
       asm.emitADD_Reg_Imm(SP, 4);        // adjust stack
@@ -1718,7 +1717,7 @@
       asm.emitPUSH_RegDisp(SP, off.plus(4));
       asm.emitPUSH_RegDisp(SP, off.plus(4));
       // (3) invoke C function through bootrecord
-      asm.emitMOV_Reg_RegDisp(S0, JTOC, VM_Entrypoints.the_boot_recordField.getOffset());
+      asm.emitMOV_Reg_Abs(S0, VM_Magic.getTocPointer().plus(VM_Entrypoints.the_boot_recordField.getOffset()));
       asm.emitCALL_RegDisp(S0, VM_Entrypoints.sysDoubleToIntIPField.getOffset());
       // (4) pop arguments
       asm.emitPOP_Reg(S0);
@@ -1744,7 +1743,7 @@
      // Setup value into FP1
     asm.emitFLD_Reg_RegInd_Quad(FP0, SP);
     // Setup maxlong into FP0
-    asm.emitFLD_Reg_RegDisp_Quad(FP0, JTOC, VM_Entrypoints.maxlongField.getOffset());
+    asm.emitFLD_Reg_Abs_Quad(FP0, VM_Magic.getTocPointer().plus(VM_Entrypoints.maxlongField.getOffset()));
     // if value > maxlong or NaN goto fr1; FP0 = value
     asm.emitFUCOMIP_Reg_Reg(FP0, FP1);
     VM_ForwardReference fr1 = asm.forwardJcc(VM_Assembler.LLE);
@@ -2381,12 +2380,13 @@
       VM_Barriers.compileGetstaticBarrier(asm, T0, fieldRef.getId());
       return;
     }
+    asm.emitLEA_Reg_Abs(S0,VM_Magic.getTocPointer());
     if (fieldRef.getSize() <= BYTES_IN_INT) {
-      asm.emitPUSH_RegIdx(JTOC, T0, VM_Assembler.BYTE, NO_SLOT);        // get static field
+      asm.emitPUSH_RegIdx(S0, T0, VM_Assembler.BYTE, NO_SLOT);        // get static field
     } else { // field is two words (double or long)
       if (VM.VerifyAssertions) VM._assert(fieldRef.getSize() == BYTES_IN_LONG);
-      asm.emitPUSH_RegIdx(JTOC, T0, VM_Assembler.BYTE, ONE_SLOT); // get high part
-      asm.emitPUSH_RegIdx(JTOC, T0, VM_Assembler.BYTE, NO_SLOT);        // get low part
+      asm.emitPUSH_RegIdx(S0, T0, VM_Assembler.BYTE, ONE_SLOT); // get high part
+      asm.emitPUSH_RegIdx(S0, T0, VM_Assembler.BYTE, NO_SLOT);        // get low part
     }
   }
 
@@ -2403,11 +2403,11 @@
       return;
     }
     if (fieldRef.getSize() <= BYTES_IN_INT) { // field is one word
-      asm.emitPUSH_RegDisp(JTOC, fieldOffset);
+      asm.emitPUSH_Abs(VM_Magic.getTocPointer().plus(fieldOffset));
     } else { // field is two words (double or long)
       if (VM.VerifyAssertions) VM._assert(fieldRef.getSize() == BYTES_IN_LONG);
-      asm.emitPUSH_RegDisp(JTOC, fieldOffset.plus(WORDSIZE)); // get high part
-      asm.emitPUSH_RegDisp(JTOC, fieldOffset);          // get low part
+      asm.emitPUSH_Abs(VM_Magic.getTocPointer().plus(fieldOffset).plus(WORDSIZE)); // get high part
+      asm.emitPUSH_Abs(VM_Magic.getTocPointer().plus(fieldOffset));          // get low part
     }
   }
 
@@ -2422,12 +2422,13 @@
       VM_Barriers.compilePutstaticBarrier(asm, T0, fieldRef.getId());
       asm.emitADD_Reg_Imm(SP, WORDSIZE);
     } else {
+      asm.emitLEA_Reg_Abs(S0,VM_Magic.getTocPointer());
       if (fieldRef.getSize() <= BYTES_IN_INT) { // field is one word
-        asm.emitPOP_RegIdx(JTOC, T0, VM_Assembler.BYTE, NO_SLOT);
+        asm.emitPOP_RegIdx(S0, T0, VM_Assembler.BYTE, NO_SLOT);
       } else { // field is two words (double or long)
         if (VM.VerifyAssertions) VM._assert(fieldRef.getSize() == BYTES_IN_LONG);
-        asm.emitPOP_RegIdx(JTOC, T0, VM_Assembler.BYTE, NO_SLOT);        // store low part
-        asm.emitPOP_RegIdx(JTOC, T0, VM_Assembler.BYTE, ONE_SLOT); // store high part
+        asm.emitPOP_RegIdx(S0, T0, VM_Assembler.BYTE, NO_SLOT);        // store low part
+        asm.emitPOP_RegIdx(S0, T0, VM_Assembler.BYTE, ONE_SLOT); // store high part
       }
     }
   }
@@ -2445,11 +2446,11 @@
       asm.emitADD_Reg_Imm(SP, WORDSIZE);
     } else {
       if (field.getSize() <= BYTES_IN_INT) { // field is one word
-        asm.emitPOP_RegDisp(JTOC, fieldOffset);
+        asm.emitPOP_Abs(VM_Magic.getTocPointer().plus(fieldOffset));
       } else { // field is two words (double or long)
         if (VM.VerifyAssertions) VM._assert(fieldRef.getSize() == BYTES_IN_LONG);
-        asm.emitPOP_RegDisp(JTOC, fieldOffset);          // store low part
-        asm.emitPOP_RegDisp(JTOC, fieldOffset.plus(WORDSIZE)); // store high part
+        asm.emitPOP_Abs(VM_Magic.getTocPointer().plus(fieldOffset));          // store low part
+        asm.emitPOP_Abs(VM_Magic.getTocPointer().plus(fieldOffset).plus(WORDSIZE)); // store high part
       }
     }
   }
@@ -2736,13 +2737,13 @@
   protected final void emit_resolved_invokespecial(VM_MethodReference methodRef, VM_Method target) {
     if (target.isObjectInitializer()) {
       genParameterRegisterLoad(methodRef, true);
-      asm.emitCALL_RegDisp(JTOC, target.getOffset());
+      asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(target.getOffset()));
       genResultRegisterUnload(target.getMemberRef().asMethodReference());
     } else {
       if (VM.VerifyAssertions) VM._assert(!target.isStatic());
       // invoke via class's tib slot
       Offset methodRefOffset = target.getOffset();
-      asm.emitMOV_Reg_RegDisp(S0, JTOC, target.getDeclaringClass().getTibOffset());
+      asm.emitMOV_Reg_Abs(S0, VM_Magic.getTocPointer().plus(target.getDeclaringClass().getTibOffset()));
       genParameterRegisterLoad(methodRef, true);
       asm.emitCALL_RegDisp(S0, methodRefOffset);
       genResultRegisterUnload(methodRef);
@@ -2757,7 +2758,7 @@
   protected final void emit_unresolved_invokespecial(VM_MethodReference methodRef) {
     emitDynamicLinkingSequence(S0, methodRef, true);
     genParameterRegisterLoad(methodRef, true);
-    asm.emitCALL_RegIdx(JTOC, S0, VM_Assembler.BYTE, NO_SLOT);  // call static method
+    asm.emitCALL_RegDisp(S0, VM_Magic.getTocPointer().toWord().toOffset());
     genResultRegisterUnload(methodRef);
   }
 
@@ -2769,7 +2770,7 @@
   protected final void emit_unresolved_invokestatic(VM_MethodReference methodRef) {
     emitDynamicLinkingSequence(S0, methodRef, true);
     genParameterRegisterLoad(methodRef, false);
-    asm.emitCALL_RegIdx(JTOC, S0, VM_Assembler.BYTE, NO_SLOT);
+    asm.emitCALL_RegDisp(S0, VM_Magic.getTocPointer().toWord().toOffset());
     genResultRegisterUnload(methodRef);
   }
 
@@ -2781,7 +2782,7 @@
   protected final void emit_resolved_invokestatic(VM_MethodReference methodRef) {
     Offset methodOffset = methodRef.peekResolvedMethod().getOffset();
     genParameterRegisterLoad(methodRef, false);
-    asm.emitCALL_RegDisp(JTOC, methodOffset);
+    asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(methodOffset));
     genResultRegisterUnload(methodRef);
   }
 
@@ -2814,12 +2815,12 @@
           baselineEmitLoadTIB(asm, S0, T1);
           asm.emitPUSH_Reg(S0);
           genParameterRegisterLoad(2);                                            // pass 2 parameter word
-          asm.emitCALL_RegDisp(JTOC,
-                               VM_Entrypoints.unresolvedInvokeinterfaceImplementsTestMethod.getOffset());// check that "this" class implements the interface
+          asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(
+			     VM_Entrypoints.unresolvedInvokeinterfaceImplementsTestMethod.getOffset()));// check that "this" class implements the interface
         } else {
-          asm.emitMOV_Reg_RegDisp(T0,
-                                  JTOC,
-                                  resolvedMethod.getDeclaringClass().getTibOffset()); // tib of the interface method
+          asm.emitMOV_Reg_Abs(T0,
+			      VM_Magic.getTocPointer().plus(
+				resolvedMethod.getDeclaringClass().getTibOffset())); // tib of the interface method
           asm.emitMOV_Reg_RegDisp(T1,
                                   SP,
                                   Offset.fromIntZeroExtend((count - 1) <<
@@ -2830,8 +2831,8 @@
           baselineEmitLoadTIB(asm, S0, T1);
           asm.emitPUSH_Reg(S0);
           genParameterRegisterLoad(2);                                          // pass 2 parameter word
-          asm.emitCALL_RegDisp(JTOC,
-                               VM_Entrypoints.invokeinterfaceImplementsTestMethod.getOffset());// check that "this" class implements the interface
+          asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(
+			     VM_Entrypoints.invokeinterfaceImplementsTestMethod.getOffset()));// check that "this" class implements the interface
         }
       }
     }
@@ -2884,8 +2885,8 @@
         asm.emitPUSH_Imm(methodRefId);             // id of method to call
         genParameterRegisterLoad(2);               // pass 2 parameter words
         // invokeinterface(obj, id) returns address to call
-        asm.emitCALL_RegDisp(JTOC,
-                             VM_Entrypoints.invokeInterfaceMethod.getOffset());
+        asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(
+			   VM_Entrypoints.invokeInterfaceMethod.getOffset()));
         asm.emitMOV_Reg_Reg(S0, T0);               // S0 has address of method
         genParameterRegisterLoad(methodRef, true);
         asm.emitCALL_Reg(S0);                     // the interface method (its parameters are on stack)
@@ -2899,8 +2900,8 @@
         asm.emitPUSH_Reg(S0);
         asm.emitPUSH_Imm(resolvedMethod.getDeclaringClass().getInterfaceId()); // interface id
         genParameterRegisterLoad(2);                                  // pass 2 parameter words
-        asm.emitCALL_RegDisp(JTOC,
-                             VM_Entrypoints.findItableMethod.getOffset()); // findItableOffset(tib, id) returns iTable
+        asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(
+			   VM_Entrypoints.findItableMethod.getOffset())); // findItableOffset(tib, id) returns iTable
         asm.emitMOV_Reg_Reg(S0, T0);                             // S0 has iTable
         genParameterRegisterLoad(methodRef, true);
         // the interface call
@@ -2927,14 +2928,14 @@
     int offset = VM_ObjectModel.getOffsetForAlignment(typeRef);
     int site = MM_Interface.getAllocationSite(true);
     asm.emitPUSH_Imm(instanceSize);
-    asm.emitPUSH_RegDisp(JTOC, tibOffset);       // put tib on stack
+    asm.emitPUSH_Abs(VM_Magic.getTocPointer().plus(tibOffset));       // put tib on stack
     asm.emitPUSH_Imm(typeRef.hasFinalizer() ? 1 : 0); // does the class have a finalizer?
     asm.emitPUSH_Imm(whichAllocator);
     asm.emitPUSH_Imm(align);
     asm.emitPUSH_Imm(offset);
     asm.emitPUSH_Imm(site);
     genParameterRegisterLoad(7);                  // pass 7 parameter words
-    asm.emitCALL_RegDisp(JTOC, VM_Entrypoints.resolvedNewScalarMethod.getOffset());
+    asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(VM_Entrypoints.resolvedNewScalarMethod.getOffset()));
     asm.emitPUSH_Reg(T0);
   }
 
@@ -2948,7 +2949,7 @@
     asm.emitPUSH_Imm(typeRef.getId());
     asm.emitPUSH_Imm(site);                 // site
     genParameterRegisterLoad(2);            // pass 2 parameter words
-    asm.emitCALL_RegDisp(JTOC, VM_Entrypoints.unresolvedNewScalarMethod.getOffset());
+    asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(VM_Entrypoints.unresolvedNewScalarMethod.getOffset()));
     asm.emitPUSH_Reg(T0);
   }
 
@@ -2968,13 +2969,13 @@
     // count is already on stack- nothing required
     asm.emitPUSH_Imm(width);                 // logElementSize
     asm.emitPUSH_Imm(headerSize);            // headerSize
-    asm.emitPUSH_RegDisp(JTOC, tibOffset);   // tib
+    asm.emitPUSH_Abs(VM_Magic.getTocPointer().plus(tibOffset));   // tib
     asm.emitPUSH_Imm(whichAllocator);        // allocator
     asm.emitPUSH_Imm(align);
     asm.emitPUSH_Imm(offset);
     asm.emitPUSH_Imm(site);
     genParameterRegisterLoad(8);             // pass 8 parameter words
-    asm.emitCALL_RegDisp(JTOC, VM_Entrypoints.resolvedNewArrayMethod.getOffset());
+    asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(VM_Entrypoints.resolvedNewArrayMethod.getOffset()));
     asm.emitPUSH_Reg(T0);
   }
 
@@ -2989,7 +2990,7 @@
     asm.emitPUSH_Imm(tRef.getId());
     asm.emitPUSH_Imm(site);                 // site
     genParameterRegisterLoad(3);            // pass 3 parameter words
-    asm.emitCALL_RegDisp(JTOC, VM_Entrypoints.unresolvedNewArrayMethod.getOffset());
+    asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(VM_Entrypoints.unresolvedNewArrayMethod.getOffset()));
     asm.emitPUSH_Reg(T0);
   }
 
@@ -3013,7 +3014,7 @@
     asm.emitPUSH_Imm((dimensions + OFFSET_WORDS) << LG_WORDSIZE);  // offset to dimensions from FP on entry to newarray
 
     genParameterRegisterLoad(PARAMETERS);
-    asm.emitCALL_RegDisp(JTOC, VM_ArchEntrypoints.newArrayArrayMethod.getOffset());
+    asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(VM_ArchEntrypoints.newArrayArrayMethod.getOffset()));
     for (int i = 0; i < dimensions; i++) {
       asm.emitPOP_Reg(S0); // clear stack of dimensions (todo use and add immediate to do this)
     }
@@ -3036,7 +3037,7 @@
   @Override
   protected final void emit_athrow() {
     genParameterRegisterLoad(1);          // pass 1 parameter word
-    asm.emitCALL_RegDisp(JTOC, VM_Entrypoints.athrowMethod.getOffset());
+    asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(VM_Entrypoints.athrowMethod.getOffset()));
   }
 
   /**
@@ -3048,7 +3049,7 @@
     asm.emitPUSH_RegInd(SP);                        // duplicate the object ref on the stack
     asm.emitPUSH_Imm(typeRef.getId());               // VM_TypeReference id.
     genParameterRegisterLoad(2);                     // pass 2 parameter words
-    asm.emitCALL_RegDisp(JTOC, VM_Entrypoints.checkcastMethod.getOffset()); // checkcast(obj, type reference id);
+    asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(VM_Entrypoints.checkcastMethod.getOffset())); // checkcast(obj, type reference id);
   }
 
   /**
@@ -3060,7 +3061,7 @@
     asm.emitPUSH_RegInd(SP);                        // duplicate the object ref on the stack
     asm.emitPUSH_Imm(type.getId());                  // VM_Type id.
     genParameterRegisterLoad(2);                     // pass 2 parameter words
-    asm.emitCALL_RegDisp(JTOC, VM_Entrypoints.checkcastResolvedClassMethod.getOffset()); // checkcast(obj, type id)
+    asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(VM_Entrypoints.checkcastResolvedClassMethod.getOffset())); // checkcast(obj, type id)
   }
 
   /**
@@ -3072,7 +3073,7 @@
     asm.emitPUSH_RegInd(SP);                        // duplicate the object ref on the stack
     asm.emitPUSH_Imm(type.getTibOffset().toInt());           // JTOC index that identifies klass
     genParameterRegisterLoad(2);                     // pass 2 parameter words
-    asm.emitCALL_RegDisp(JTOC, VM_Entrypoints.checkcastFinalMethod.getOffset()); // checkcast(obj, TIB's JTOC offset)
+    asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(VM_Entrypoints.checkcastFinalMethod.getOffset())); // checkcast(obj, TIB's JTOC offset)
   }
 
   /**
@@ -3083,7 +3084,7 @@
   protected final void emit_instanceof(VM_TypeReference typeRef) {
     asm.emitPUSH_Imm(typeRef.getId());
     genParameterRegisterLoad(2);          // pass 2 parameter words
-    asm.emitCALL_RegDisp(JTOC, VM_Entrypoints.instanceOfMethod.getOffset());
+    asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(VM_Entrypoints.instanceOfMethod.getOffset()));
     asm.emitPUSH_Reg(T0);
   }
 
@@ -3095,7 +3096,7 @@
   protected final void emit_instanceof_resolvedClass(VM_Type type) {
     asm.emitPUSH_Imm(type.getId());
     genParameterRegisterLoad(2);          // pass 2 parameter words
-    asm.emitCALL_RegDisp(JTOC, VM_Entrypoints.instanceOfResolvedClassMethod.getOffset());
+    asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(VM_Entrypoints.instanceOfResolvedClassMethod.getOffset()));
     asm.emitPUSH_Reg(T0);
   }
 
@@ -3107,7 +3108,7 @@
   protected final void emit_instanceof_final(VM_Type type) {
     asm.emitPUSH_Imm(type.getTibOffset().toInt());
     genParameterRegisterLoad(2);          // pass 2 parameter words
-    asm.emitCALL_RegDisp(JTOC, VM_Entrypoints.instanceOfFinalMethod.getOffset());
+    asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(VM_Entrypoints.instanceOfFinalMethod.getOffset()));
     asm.emitPUSH_Reg(T0);
   }
 
@@ -3119,7 +3120,7 @@
     asm.emitMOV_Reg_RegInd(T0, SP);       // T0 is object reference
     genExplicitNullCheck(asm, T0);
     genParameterRegisterLoad(1);          // pass 1 parameter word
-    asm.emitCALL_RegDisp(JTOC, VM_Entrypoints.lockMethod.getOffset());
+    asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(VM_Entrypoints.lockMethod.getOffset()));
   }
 
   /**
@@ -3128,7 +3129,7 @@
   @Override
   protected final void emit_monitorexit() {
     genParameterRegisterLoad(1);          // pass 1 parameter word
-    asm.emitCALL_RegDisp(JTOC, VM_Entrypoints.unlockMethod.getOffset());
+    asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(VM_Entrypoints.unlockMethod.getOffset()));
   }
 
   //----------------//
@@ -3177,16 +3178,13 @@
       /*
       * save registers
       */
-      asm.emitMOV_RegDisp_Reg(SP, JTOC_SAVE_OFFSET, JTOC);          // save nonvolatile JTOC register
+      asm.emitMOV_RegDisp_Reg(SP, EDI_SAVE_OFFSET, EDI);          // save nonvolatile EDI register
       asm.emitMOV_RegDisp_Reg(SP, EBX_SAVE_OFFSET, EBX);            // save nonvolatile EBX register
 
-      // establish the JTOC register
-      VM_ProcessorLocalState.emitMoveFieldToReg(asm, JTOC, VM_ArchEntrypoints.jtocField.getOffset());
-
       int savedRegistersSize = SAVED_GPRS << LG_WORDSIZE;       // default
       /* handle "dynamic brige" methods:
        * save all registers except FP, SP, PR, S0 (scratch), and
-       * JTOC and EBX saved above.
+       * EDI and EBX saved above.
        */
       // TODO: (SJF): When I try to reclaim ESI, I may have to save it here?
       if (klass.hasDynamicBridgeAnnotation()) {
@@ -3241,12 +3239,12 @@
       if (!VM.runningTool && ((VM_BaselineCompiledMethod) compiledMethod).hasCounterArray()) {
         // use (nonvolatile) EBX to hold base of this method's counter array
         if (MM_Constants.NEEDS_READ_BARRIER) {
-          asm.emitPUSH_RegDisp(JTOC, VM_Entrypoints.edgeCountersField.getOffset());
+          asm.emitPUSH_Abs(VM_Magic.getTocPointer().plus(VM_Entrypoints.edgeCountersField.getOffset()));
           asm.emitPUSH_Imm(getEdgeCounterIndex());
           VM_Barriers.compileArrayLoadBarrier(asm, false);
           asm.emitMOV_Reg_Reg(EBX, T0);
         } else {
-          asm.emitMOV_Reg_RegDisp(EBX, JTOC, VM_Entrypoints.edgeCountersField.getOffset());
+          asm.emitMOV_Reg_Abs(EBX, VM_Magic.getTocPointer().plus(VM_Entrypoints.edgeCountersField.getOffset()));
           asm.emitMOV_Reg_RegDisp(EBX, EBX, getEdgeCounterOffset());
         }
       }
@@ -3293,7 +3291,7 @@
     } else {
       // normal method
       asm.emitADD_Reg_Imm(SP, fp2spOffset(NO_SLOT).toInt() - bytesPopped);     // SP becomes frame pointer
-      asm.emitMOV_Reg_RegDisp(JTOC, SP, JTOC_SAVE_OFFSET);           // restore nonvolatile JTOC register
+      asm.emitMOV_Reg_RegDisp(EDI, SP, EDI_SAVE_OFFSET);           // restore nonvolatile EDI register
       asm.emitMOV_Reg_RegDisp(EBX, SP, EBX_SAVE_OFFSET);             // restore nonvolatile EBX register
       asm.emitPOP_RegDisp(PR, VM_ArchEntrypoints.framePointerField.getOffset()); // discard frame
       asm.emitRET_Imm(parameterWords << LG_WORDSIZE);    // return to caller- pop parameters from stack
@@ -3304,14 +3302,14 @@
     if (method.isStatic()) {
       Offset klassOffset = Offset.fromIntSignExtend(VM_Statics.findOrCreateObjectLiteral(klass.getClassForType()));
       // push java.lang.Class object for klass
-      asm.emitPUSH_RegDisp(JTOC, klassOffset);
+      asm.emitPUSH_Abs(VM_Magic.getTocPointer().plus(klassOffset));
     } else {
       // push "this" object
       asm.emitPUSH_RegDisp(ESP, localOffset(0));
     }
     // pass 1 parameter
     genParameterRegisterLoad(1);
-    asm.emitCALL_RegDisp(JTOC, VM_Entrypoints.lockMethod.getOffset());
+    asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(VM_Entrypoints.lockMethod.getOffset()));
     // after this instruction, the method has the monitor
     lockOffset = asm.getMachineCodeIndex();
   }
@@ -3320,12 +3318,12 @@
     if (method.isStatic()) {
       Offset klassOffset = Offset.fromIntSignExtend(VM_Statics.findOrCreateObjectLiteral(klass.getClassForType()));
       // push java.lang.Class object for klass
-      asm.emitPUSH_RegDisp(JTOC, klassOffset);
+      asm.emitPUSH_Abs(VM_Magic.getTocPointer().plus(klassOffset));
     } else {
       asm.emitPUSH_RegDisp(ESP, localOffset(0));                    // push "this" object
     }
     genParameterRegisterLoad(1); // pass 1 parameter
-    asm.emitCALL_RegDisp(JTOC, VM_Entrypoints.unlockMethod.getOffset());
+    asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(VM_Entrypoints.unlockMethod.getOffset()));
   }
 
   /**
@@ -3677,27 +3675,27 @@
     if (whereFrom == VM_Thread.PROLOGUE) {
       // Take yieldpoint if yieldpoint flag is non-zero (either 1 or -1)
       fr1 = asm.forwardJcc(VM_Assembler.EQ);
-      asm.emitCALL_RegDisp(JTOC, VM_Entrypoints.yieldpointFromPrologueMethod.getOffset());
+      asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(VM_Entrypoints.yieldpointFromPrologueMethod.getOffset()));
     } else if (whereFrom == VM_Thread.BACKEDGE) {
       // Take yieldpoint if yieldpoint flag is >0
       fr1 = asm.forwardJcc(VM_Assembler.LE);
-      asm.emitCALL_RegDisp(JTOC, VM_Entrypoints.yieldpointFromBackedgeMethod.getOffset());
+      asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(VM_Entrypoints.yieldpointFromBackedgeMethod.getOffset()));
     } else { // EPILOGUE
       // Take yieldpoint if yieldpoint flag is non-zero (either 1 or -1)
       fr1 = asm.forwardJcc(VM_Assembler.EQ);
-      asm.emitCALL_RegDisp(JTOC, VM_Entrypoints.yieldpointFromEpilogueMethod.getOffset());
+      asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(VM_Entrypoints.yieldpointFromEpilogueMethod.getOffset()));
     }
     fr1.resolve(asm);
 
     if (VM.BuildForAdaptiveSystem && options.INVOCATION_COUNTERS) {
       int id = compiledMethod.getId();
       VM_InvocationCounts.allocateCounter(id);
-      asm.emitMOV_Reg_RegDisp(ECX, JTOC, VM_AosEntrypoints.invocationCountsField.getOffset());
+      asm.emitMOV_Reg_Abs(ECX, VM_Magic.getTocPointer().plus(VM_AosEntrypoints.invocationCountsField.getOffset()));
       asm.emitSUB_RegDisp_Imm(ECX, Offset.fromIntZeroExtend(compiledMethod.getId() << 2), 1);
       VM_ForwardReference notTaken = asm.forwardJcc(VM_Assembler.GT);
       asm.emitPUSH_Imm(id);
       genParameterRegisterLoad(1);
-      asm.emitCALL_RegDisp(JTOC, VM_AosEntrypoints.invocationCounterTrippedMethod.getOffset());
+      asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(VM_AosEntrypoints.invocationCounterTrippedMethod.getOffset()));
       notTaken.resolve(asm);
     }
   }
@@ -3981,21 +3979,21 @@
     if (methodName == VM_MagicNames.saveThreadState) {
       Offset offset = VM_ArchEntrypoints.saveThreadStateInstructionsField.getOffset();
       genParameterRegisterLoad(1); // pass 1 parameter word
-      asm.emitCALL_RegDisp(JTOC, offset);
+      asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(offset));
       return true;
     }
 
     if (methodName == VM_MagicNames.threadSwitch) {
       Offset offset = VM_ArchEntrypoints.threadSwitchInstructionsField.getOffset();
       genParameterRegisterLoad(2); // pass 2 parameter words
-      asm.emitCALL_RegDisp(JTOC, offset);
+      asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(offset));
       return true;
     }
 
     if (methodName == VM_MagicNames.restoreHardwareExceptionState) {
       Offset offset = VM_ArchEntrypoints.restoreHardwareExceptionStateInstructionsField.getOffset();
       genParameterRegisterLoad(1); // pass 1 parameter word
-      asm.emitCALL_RegDisp(JTOC, offset);
+      asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(offset));
       return true;
     }
 
@@ -4106,7 +4104,7 @@
     }
 
     if (methodName == VM_MagicNames.getTocPointer || methodName == VM_MagicNames.getJTOC) {
-      asm.emitPUSH_Reg(JTOC);
+      asm.emitPUSH_Imm((int)VM_Magic.getTocPointer().toWord().toLong());
       return true;
     }
 
@@ -4344,14 +4342,14 @@
     if (methodName == VM_MagicNames.invokeMethodReturningVoid) {
       Offset offset = VM_ArchEntrypoints.reflectiveMethodInvokerInstructionsField.getOffset();
       genParameterRegisterLoad(5); // pass 5 parameter words
-      asm.emitCALL_RegDisp(JTOC, offset);
+      asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(offset));
       return true;
     }
 
     if (methodName == VM_MagicNames.invokeMethodReturningInt) {
       Offset offset = VM_ArchEntrypoints.reflectiveMethodInvokerInstructionsField.getOffset();
       genParameterRegisterLoad(5); // pass 5 parameter words
-      asm.emitCALL_RegDisp(JTOC, offset);
+      asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(offset));
       asm.emitPUSH_Reg(T0);
       return true;
     }
@@ -4359,7 +4357,7 @@
     if (methodName == VM_MagicNames.invokeMethodReturningLong) {
       Offset offset = VM_ArchEntrypoints.reflectiveMethodInvokerInstructionsField.getOffset();
       genParameterRegisterLoad(5); // pass 5 parameter words
-      asm.emitCALL_RegDisp(JTOC, offset);
+      asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(offset));
       asm.emitPUSH_Reg(T0); // high half
       asm.emitPUSH_Reg(T1); // low half
       return true;
@@ -4368,7 +4366,7 @@
     if (methodName == VM_MagicNames.invokeMethodReturningFloat) {
       Offset offset = VM_ArchEntrypoints.reflectiveMethodInvokerInstructionsField.getOffset();
       genParameterRegisterLoad(5); // pass 5 parameter words
-      asm.emitCALL_RegDisp(JTOC, offset);
+      asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(offset));
       asm.emitSUB_Reg_Imm(SP, 4);
       if (SSE2_FULL) {
         asm.emitMOVSS_RegInd_Reg(SP, XMM0);
@@ -4381,7 +4379,7 @@
     if (methodName == VM_MagicNames.invokeMethodReturningDouble) {
       Offset offset = VM_ArchEntrypoints.reflectiveMethodInvokerInstructionsField.getOffset();
       genParameterRegisterLoad(5); // pass 5 parameter words
-      asm.emitCALL_RegDisp(JTOC, offset);
+      asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(offset));
       asm.emitSUB_Reg_Imm(SP, 8);
       if (SSE2_FULL) {
         asm.emitMOVLPD_RegInd_Reg(SP, XMM0);
@@ -4394,7 +4392,7 @@
     if (methodName == VM_MagicNames.invokeMethodReturningObject) {
       Offset offset = VM_ArchEntrypoints.reflectiveMethodInvokerInstructionsField.getOffset();
       genParameterRegisterLoad(5); // pass 5 parameter words
-      asm.emitCALL_RegDisp(JTOC, offset);
+      asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(offset));
       asm.emitPUSH_Reg(T0);
       return true;
     }
@@ -4424,7 +4422,7 @@
       asm.emitMOV_Reg_RegDisp(T0, SP, T0_SAVE_OFFSET);
       asm.emitMOV_Reg_RegDisp(T1, SP, T1_SAVE_OFFSET);
       asm.emitMOV_Reg_RegDisp(EBX, SP, EBX_SAVE_OFFSET);
-      asm.emitMOV_Reg_RegDisp(JTOC, SP, JTOC_SAVE_OFFSET);
+      asm.emitMOV_Reg_RegDisp(EDI, SP, EDI_SAVE_OFFSET);
 
       // pop frame
       asm.emitPOP_RegDisp(PR, VM_ArchEntrypoints.framePointerField.getOffset()); // FP<-previous FP
@@ -4439,7 +4437,7 @@
       asm.emitPOP_Reg(SP);
 
       // restore nonvolatile registers
-      asm.emitMOV_Reg_RegDisp(JTOC, SP, JTOC_SAVE_OFFSET);
+      asm.emitMOV_Reg_RegDisp(EDI, SP, EDI_SAVE_OFFSET);
       asm.emitMOV_Reg_RegDisp(EBX, SP, EBX_SAVE_OFFSET);
 
       // discard current stack frame
@@ -4685,7 +4683,7 @@
     if (couldBeZero) {
       Offset resolverOffset = VM_Entrypoints.resolveMemberMethod.getOffset();
       int retryLabel = asm.getMachineCodeIndex();            // branch here after dynamic class loading
-      asm.emitMOV_Reg_RegDisp(reg, JTOC, tableOffset);      // reg is offsets table
+      asm.emitMOV_Reg_Abs(reg, VM_Magic.getTocPointer().plus(tableOffset));      // reg is offsets table
       asm.emitMOV_Reg_RegDisp(reg,
                               reg,
                               memberOffset);      // reg is offset of member, or 0 if member's class isn't loaded
@@ -4697,11 +4695,11 @@
       VM_ForwardReference fr = asm.forwardJcc(VM_Assembler.NE);       // if so, skip call instructions
       asm.emitPUSH_Imm(memberId);                            // pass member's dictId
       genParameterRegisterLoad(1);                           // pass 1 parameter word
-      asm.emitCALL_RegDisp(JTOC, resolverOffset);            // does class loading as sideffect
+      asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(resolverOffset));            // does class loading as sideffect
       asm.emitJMP_Imm(retryLabel);                          // reload reg with valid value
       fr.resolve(asm);                                       // come from Jcc above.
     } else {
-      asm.emitMOV_Reg_RegDisp(reg, JTOC, tableOffset);      // reg is offsets table
+      asm.emitMOV_Reg_Abs(reg, VM_Magic.getTocPointer().plus(tableOffset));      // reg is offsets table
       asm.emitMOV_Reg_RegDisp(reg, reg, memberOffset);      // reg is offset of member
     }
   }
@@ -4720,7 +4718,7 @@
     boolean takeThis = !cm.method.isStatic();
     VM_MethodReference ref = cm.method.getMemberRef().asMethodReference();
     genParameterRegisterLoad(ref, takeThis);
-    asm.emitCALL_RegDisp(JTOC, methodOffset);
+    asm.emitCALL_Abs(VM_Magic.getTocPointer().plus(methodOffset));
     genResultRegisterUnload(ref);
   }
 
Index: rvm/src/org/jikesrvm/compilers/opt/ir/ia32/MachineSpecificIRIA.java
===================================================================
--- rvm/src/org/jikesrvm/compilers/opt/ir/ia32/MachineSpecificIRIA.java	(.../fixIA32Asm)	(revision 11856)
+++ rvm/src/org/jikesrvm/compilers/opt/ir/ia32/MachineSpecificIRIA.java	(.../fixJTOC)	(revision 11856)
@@ -31,7 +31,6 @@
 import static org.jikesrvm.compilers.opt.ir.Operators.DUMMY_DEF;
 import static org.jikesrvm.compilers.opt.ir.Operators.DUMMY_USE;
 import static org.jikesrvm.compilers.opt.ir.Operators.GET_CURRENT_PROCESSOR_opcode;
-import static org.jikesrvm.compilers.opt.ir.Operators.GET_JTOC_opcode;
 import static org.jikesrvm.compilers.opt.ir.Operators.IA32_FCLEAR;
 import static org.jikesrvm.compilers.opt.ir.Operators.IA32_FMOV;
 import static org.jikesrvm.compilers.opt.ir.Operators.IA32_FMOV_ENDING_LIVE_RANGE;
@@ -74,7 +73,6 @@
       switch (instruction.getOpcode()) {
         case PREFETCH_opcode:
           return false;
-        case GET_JTOC_opcode:
         case GET_CURRENT_PROCESSOR_opcode:
           return true;
         default:
@@ -100,7 +98,6 @@
       switch (instruction.getOpcode()) {
         case PREFETCH_opcode:
           return false;
-        case GET_JTOC_opcode:
         case GET_CURRENT_PROCESSOR_opcode:
         case LONG_OR_opcode:
         case LONG_AND_opcode:
Index: rvm/src/org/jikesrvm/ia32/VM_InterfaceMethodConflictResolver.java
===================================================================
--- rvm/src/org/jikesrvm/ia32/VM_InterfaceMethodConflictResolver.java	(.../fixIA32Asm)	(revision 11856)
+++ rvm/src/org/jikesrvm/ia32/VM_InterfaceMethodConflictResolver.java	(.../fixJTOC)	(revision 11856)
@@ -18,6 +18,7 @@
 import org.jikesrvm.compilers.common.assembler.ia32.VM_Assembler;
 import org.jikesrvm.objectmodel.VM_ObjectModel;
 import org.jikesrvm.runtime.VM_ArchEntrypoints;
+import org.jikesrvm.runtime.VM_Magic;
 import org.vmmagic.unboxed.Offset;
 
 /**
@@ -95,9 +96,10 @@
       // a leaf case; can simply invoke the method directly.
       VM_Method target = targets[middle];
       if (target.isStatic()) { // an error case...
-        VM_ProcessorLocalState.emitMoveFieldToReg(asm, ECX, VM_ArchEntrypoints.jtocField.getOffset());
+	asm.emitJMP_Abs(VM_Magic.getTocPointer().plus(target.getOffset()));
+      } else {
+	asm.emitJMP_RegDisp(ECX, target.getOffset());
       }
-      asm.emitJMP_RegDisp(ECX, target.getOffset());
     } else {
       Offset disp = VM_ArchEntrypoints.hiddenSignatureIdField.getOffset();
       VM_ProcessorLocalState.emitCompareFieldWithImm(asm, disp, sigIds[middle]);
@@ -110,9 +112,10 @@
       // invoke the method for middle.
       VM_Method target = targets[middle];
       if (target.isStatic()) { // an error case...
-        VM_ProcessorLocalState.emitMoveFieldToReg(asm, ECX, VM_ArchEntrypoints.jtocField.getOffset());
+	asm.emitJMP_Abs(VM_Magic.getTocPointer().plus(target.getOffset()));
+      } else {
+	asm.emitJMP_RegDisp(ECX, target.getOffset());
       }
-      asm.emitJMP_RegDisp(ECX, target.getOffset());
       // Recurse.
       if (low < middle) {
         insertStubCase(asm, sigIds, targets, bcIndices, low, middle - 1);
Index: rvm/src/org/jikesrvm/ia32/VM_LazyCompilationTrampoline.java
===================================================================
--- rvm/src/org/jikesrvm/ia32/VM_LazyCompilationTrampoline.java	(.../fixIA32Asm)	(revision 11856)
+++ rvm/src/org/jikesrvm/ia32/VM_LazyCompilationTrampoline.java	(.../fixJTOC)	(revision 11856)
@@ -16,6 +16,7 @@
 import org.jikesrvm.compilers.common.assembler.ia32.VM_Assembler;
 import org.jikesrvm.runtime.VM_ArchEntrypoints;
 import org.jikesrvm.runtime.VM_Entrypoints;
+import org.jikesrvm.runtime.VM_Magic;
 
 /**
  * Generate a "trampoline" that jumps to the shared lazy compilation stub.
@@ -33,10 +34,7 @@
 
   static {
     VM_Assembler asm = new ArchitectureSpecific.VM_Assembler(0);
-    // get JTOC into ECX
-    VM_ProcessorLocalState.emitMoveFieldToReg(asm, ECX, VM_ArchEntrypoints.jtocField.getOffset());
-    // jmp to real lazy mathod invoker
-    asm.emitJMP_RegDisp(ECX, VM_Entrypoints.lazyMethodInvokerMethod.getOffset());
+    asm.emitJMP_Abs(VM_Magic.getTocPointer().plus(VM_Entrypoints.lazyMethodInvokerMethod.getOffset()));
     instructions = asm.getMachineCodes();
   }
 }
Index: rvm/src/org/jikesrvm/ia32/VM_BaselineConstants.java
===================================================================
--- rvm/src/org/jikesrvm/ia32/VM_BaselineConstants.java	(.../fixIA32Asm)	(revision 11856)
+++ rvm/src/org/jikesrvm/ia32/VM_BaselineConstants.java	(.../fixJTOC)	(revision 11856)
@@ -25,7 +25,6 @@
 
   // Dedicated registers.
   //
-  VM_RegisterConstants.GPR JTOC = EDI;
   VM_RegisterConstants.GPR SP = ESP;
   VM_RegisterConstants.GPR PR = PROCESSOR_REGISTER;
 
@@ -36,6 +35,7 @@
 
   // scratch register
   VM_RegisterConstants.GPR S0 = ECX;
+  VM_RegisterConstants.GPR S1 = EDI;
 
   // Mnemonics corresponding to the above constants.
   // These are some alternate names that can be used in the debugger
@@ -54,8 +54,8 @@
   // bridge frames save 3 additional GPRs
   int BRIDGE_FRAME_EXTRA_SIZE = (SSE2_FULL ? XMM_STATE_SIZE : FPU_STATE_SIZE) + 8;
 
-  int SAVED_GPRS = 2; // EDI(JTOC) and EBX are nonvolatile registers used by baseline compiler
-  Offset JTOC_SAVE_OFFSET = Offset.fromIntSignExtend(STACKFRAME_REG_SAVE_OFFSET);
+  int SAVED_GPRS = 2; // EDI and EBX are nonvolatile registers used by baseline compiler
+  Offset EDI_SAVE_OFFSET = Offset.fromIntSignExtend(STACKFRAME_REG_SAVE_OFFSET);
   Offset EBX_SAVE_OFFSET = Offset.fromIntSignExtend(STACKFRAME_REG_SAVE_OFFSET).minus(4);
   Offset T0_SAVE_OFFSET = Offset.fromIntSignExtend(STACKFRAME_FIRST_PARAMETER_OFFSET);
   Offset T1_SAVE_OFFSET = Offset.fromIntSignExtend(STACKFRAME_FIRST_PARAMETER_OFFSET).minus(4);
Index: rvm/src/org/jikesrvm/ia32/VM_OutOfLineMachineCode.java
===================================================================
--- rvm/src/org/jikesrvm/ia32/VM_OutOfLineMachineCode.java	(.../fixIA32Asm)	(revision 11856)
+++ rvm/src/org/jikesrvm/ia32/VM_OutOfLineMachineCode.java	(.../fixJTOC)	(revision 11856)
@@ -20,6 +20,7 @@
 import org.jikesrvm.objectmodel.VM_ObjectModel;
 import org.jikesrvm.runtime.VM_ArchEntrypoints;
 import org.jikesrvm.runtime.VM_Entrypoints;
+import org.jikesrvm.runtime.VM_Magic;
 import org.jikesrvm.scheduler.VM_Processor;
 import org.vmmagic.unboxed.Offset;
 
@@ -457,10 +458,6 @@
     // reload processor register from JNIEnvironment
     VM_ProcessorLocalState.emitLoadProcessor(asm, S0, VM_Entrypoints.JNIEnvSavedPRField.getOffset());
 
-    // reload JTOC from vitual processor
-    // NOTE: EDI saved in glue frame is just EDI (opt compiled code uses it as normal non-volatile)
-    VM_ProcessorLocalState.emitMoveFieldToReg(asm, JTOC, VM_ArchEntrypoints.jtocField.getOffset());
-
     // T0 gets PR.statusField
     VM_ProcessorLocalState.emitMoveFieldToReg(asm, T0, VM_Entrypoints.vpStatusField.getOffset());
 
@@ -468,7 +465,7 @@
     VM_ForwardReference fr = asm.forwardJcc(VM_Assembler.EQ);       // if so, skip over call to pthread yield
 
     // blocked in native, do pthread yield
-    asm.emitMOV_Reg_RegDisp(T0, JTOC, VM_Entrypoints.the_boot_recordField.getOffset());  // T0<-bootrecord addr
+    asm.emitMOV_Reg_Abs(T0, VM_Magic.getTocPointer().plus(VM_Entrypoints.the_boot_recordField.getOffset()));
     asm.emitCALL_RegDisp(T0, VM_Entrypoints.sysVirtualProcessorYieldIPField.getOffset());
     asm.emitJMP_Imm(retryLabel);                          // retry from beginning
 
Index: rvm/src/org/jikesrvm/ia32/VM_MachineSpecificIA.java
===================================================================
--- rvm/src/org/jikesrvm/ia32/VM_MachineSpecificIA.java	(.../fixIA32Asm)	(revision 11856)
+++ rvm/src/org/jikesrvm/ia32/VM_MachineSpecificIA.java	(.../fixJTOC)	(revision 11856)
@@ -86,7 +86,6 @@
 
     sp = sp.minus(VM_SizeConstants.BYTES_IN_ADDRESS);                                 // allow for one local
     contextRegisters.gprs.set(ESP.value(), sp.toWord());
-    contextRegisters.gprs.set(VM_BaselineConstants.JTOC.value(), VM_Magic.objectAsAddress(VM_Magic.getJTOC()).toWord());
     contextRegisters.fp = fp;
     contextRegisters.ip = ip;
   }
Index: rvm/src/org/jikesrvm/tools/header_gen/GenArch_ia32.java
===================================================================
--- rvm/src/org/jikesrvm/tools/header_gen/GenArch_ia32.java	(.../fixIA32Asm)	(revision 11856)
+++ rvm/src/org/jikesrvm/tools/header_gen/GenArch_ia32.java	(.../fixJTOC)	(revision 11856)
@@ -52,8 +52,6 @@
 
     offset = VM_ArchEntrypoints.framePointerField.getOffset();
     pln("VM_Processor_framePointer_offset = ", offset);
-    offset = VM_ArchEntrypoints.jtocField.getOffset();
-    pln("VM_Processor_jtoc_offset = ", offset);
     offset = VM_ArchEntrypoints.arrayIndexTrapParamField.getOffset();
     pln("VM_Processor_arrayIndexTrapParam_offset = ", offset);
 
@@ -61,7 +59,6 @@
   }
 
   public void emitArchAssemblerDeclarations() {
-    p("#define JTOC %" + VM_BaselineConstants.JTOC + ";\n");
     p("#define PR %" + VM_BaselineConstants.ESI + ";\n");
   }
 }
Index: rvm/src/org/jikesrvm/VM.java
===================================================================
--- rvm/src/org/jikesrvm/VM.java	(.../fixIA32Asm)	(revision 11856)
+++ rvm/src/org/jikesrvm/VM.java	(.../fixJTOC)	(revision 11856)
@@ -12,7 +12,6 @@
  */
 package org.jikesrvm;
 
-import org.jikesrvm.ArchitectureSpecific.VM_OutOfLineMachineCode;
 import org.jikesrvm.ArchitectureSpecific.VM_ProcessorLocalState;
 import org.jikesrvm.adaptive.controller.VM_Controller;
 import org.jikesrvm.adaptive.util.VM_CompilerAdvice;
@@ -2268,7 +2267,6 @@
 
     // initialize remaining subsystems needed for compilation
     //
-    VM_OutOfLineMachineCode.init();
     if (writingBootImage) {
       // initialize compiler that builds boot image
       VM_BootImageCompiler.init(bootCompilerArgs);
Index: rvm/src/org/jikesrvm/osr/ia32/OSR_CodeInstaller.java
===================================================================
--- rvm/src/org/jikesrvm/osr/ia32/OSR_CodeInstaller.java	(.../fixIA32Asm)	(revision 11856)
+++ rvm/src/org/jikesrvm/osr/ia32/OSR_CodeInstaller.java	(.../fixJTOC)	(revision 11856)
@@ -68,15 +68,10 @@
       // unwind stack pointer, SP is FP now
       asm.emitADD_Reg_Imm(SP, sp2fpOffset.toInt());
 
-      // before restoring caller's JTOC (maybe from opt compiler), we need
-      // to use the true JTOC to get target address
-      // use scratch register S0 to hold the address
-      // ASSUMPTION: JTOC is really a JTOC, it is true for baseline compiler
-//        VM_ProcessorLocalState.emitMoveFieldToReg(asm, JTOC, VM_Entrypoints.jtocField.getOffset());
-      asm.emitMOV_Reg_RegDisp(S0, JTOC, cm.getOsrJTOCoffset());
+      asm.emitMOV_Reg_Abs(S0, VM_Magic.getTocPointer().plus(cm.getOsrJTOCoffset()));
 
-      // restore the caller's JTOC
-      asm.emitMOV_Reg_RegDisp(JTOC, SP, JTOC_SAVE_OFFSET); // this is the caller's JTOC
+      // restore saved EDI
+      asm.emitMOV_Reg_RegDisp(EDI, SP, EDI_SAVE_OFFSET);
       // restore saved EBX
       asm.emitMOV_Reg_RegDisp(EBX, SP, EBX_SAVE_OFFSET);
       // restore frame pointer
@@ -110,13 +105,8 @@
       // restore frame pointer
       asm.emitPOP_RegDisp(PR, VM_ArchEntrypoints.framePointerField.getOffset());
 
-      // we need a scratch registers here, using scratch register here
-      // get JTOC content into S0 (ECX)
-      asm.emitMOV_Reg_RegDisp(S0, PR, VM_ArchEntrypoints.jtocField.getOffset());
-      // move the address to S0
-      asm.emitMOV_Reg_RegDisp(S0, S0, cm.getOsrJTOCoffset());
       // branch to the newly compiled instructions
-      asm.emitJMP_Reg(S0);
+      asm.emitJMP_Abs(VM_Magic.getTocPointer().plus(cm.getOsrJTOCoffset()));
     }
 
     if (VM.TraceOnStackReplacement) {
Index: rvm/src/org/jikesrvm/scheduler/VM_Processor.java
===================================================================
--- rvm/src/org/jikesrvm/scheduler/VM_Processor.java	(.../fixIA32Asm)	(revision 11856)
+++ rvm/src/org/jikesrvm/scheduler/VM_Processor.java	(.../fixJTOC)	(revision 11856)
@@ -98,11 +98,6 @@
   // we don't have registers to burn on IA32, so we indirect
   // through the PR register to get them instead.
   /**
-   * Base pointer of JTOC (VM_Statics.slots)
-   * TODO: the JTOC doesn't move so this field is redundant
-   */
-  public Address jtoc;
-  /**
    * FP for current frame, saved in the prologue of every method
    */
   Address framePointer;
@@ -309,10 +304,6 @@
    * this processor.
    */
   protected VM_Processor(int id) {
-    // presave JTOC register contents
-    // (so lintel compiler can us JTOC for scratch)
-    if (VM.BuildForIA32 && VM.runningVM) this.jtoc = VM_Magic.getJTOC();
-
     this.id = id;
     this.lastLockIndex = -1;
     this.vpStatus = IN_JAVA;
Index: rvm/src/org/jikesrvm/scheduler/greenthreads/VM_GreenScheduler.java
===================================================================
--- rvm/src/org/jikesrvm/scheduler/greenthreads/VM_GreenScheduler.java	(.../fixIA32Asm)	(revision 11856)
+++ rvm/src/org/jikesrvm/scheduler/greenthreads/VM_GreenScheduler.java	(.../fixJTOC)	(revision 11856)
@@ -179,10 +179,6 @@
         processors.set(i, new VM_GreenProcessor(i));
       } else {
         processors.set(i, p);
-        if (VM.BuildForIA32) {
-          // TODO: the JTOC doesn't move so this field is redundant
-          p.jtoc = VM_Magic.getJTOC();  // only needed for EXTRA_PROCS
-        }
       }
     }
 
@@ -236,21 +232,14 @@
       getProcessor(i).activeThreadStackLimit = target.stackLimit;
       target.registerThread(); // let scheduler know that thread is active.
       if (VM.BuildForPowerPC) {
-        // NOTE: It is critical that we acquire the tocPointer explicitly
-        //       before we start the SysCall sequence. This prevents
-        //       the opt compiler from generating code that passes the AIX
-        //       sys toc instead of the RVM jtoc. --dave
-        Address toc = VM_Magic.getTocPointer();
-        sysCall.sysVirtualProcessorCreate(toc,
-                                          VM_Magic.objectAsAddress(getProcessor(i)),
+        sysCall.sysVirtualProcessorCreate(VM_Magic.objectAsAddress(getProcessor(i)),
                                           target.contextRegisters.ip,
                                           target.contextRegisters.getInnermostFramePointer());
         if (cpuAffinity != NO_CPU_AFFINITY) {
           sysCall.sysVirtualProcessorBind(cpuAffinity + i - 1); // bind it to a physical cpu
         }
       } else if (VM.BuildForIA32) {
-        sysCall.sysVirtualProcessorCreate(VM_Magic.getTocPointer(),
-                                          VM_Magic.objectAsAddress(getProcessor(i)),
+        sysCall.sysVirtualProcessorCreate(VM_Magic.objectAsAddress(getProcessor(i)),
                                           target.contextRegisters.ip,
                                           target.contextRegisters.getInnermostFramePointer());
       } else if (VM.VerifyAssertions) {