Skip to content

Commit

Permalink
Tweaks to IA32 barriers, ensure cheap null test loads from tib offset…
Browse files Browse the repository at this point in the history
… not field 1 (in case not present). Perform barrier null checks for getfield avoiding 1 load.
  • Loading branch information
Ian committed Mar 1, 2009
1 parent 7f3b83f commit 0486d1b
Show file tree
Hide file tree
Showing 2 changed files with 4 additions and 25 deletions.
26 changes: 2 additions & 24 deletions rvm/src/org/jikesrvm/compilers/baseline/ia32/Barriers.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
package org.jikesrvm.compilers.baseline.ia32;

import org.jikesrvm.Configuration;
import org.jikesrvm.VM;
import org.jikesrvm.ArchitectureSpecific.Assembler;
import org.jikesrvm.ia32.BaselineConstants;
import org.jikesrvm.runtime.Entrypoints;
Expand Down Expand Up @@ -104,19 +103,19 @@ static void compileArrayLoadBarrier(Assembler asm, boolean pushResult) {
static void compileGetfieldBarrier(Assembler asm, GPR reg, int locationMetadata) {
// on entry java stack contains ...|target_ref|
// SP -> target_ref
genNullCheck(asm, 0);
asm.emitPUSH_Reg(reg);
asm.emitPUSH_Imm(locationMetadata);
BaselineCompilerImpl.genParameterRegisterLoad(asm, 3);
BaselineCompilerImpl.genNullCheck(asm, T0);
asm.emitCALL_Abs(Magic.getTocPointer().plus(Entrypoints.getfieldReadBarrierMethod.getOffset()));
asm.emitPUSH_Reg(T0);
}

static void compileGetfieldBarrierImm(Assembler asm, Offset fieldOffset, int locationMetadata) {
genNullCheck(asm, 0);
asm.emitPUSH_Imm(fieldOffset.toInt());
asm.emitPUSH_Imm(locationMetadata);
BaselineCompilerImpl.genParameterRegisterLoad(asm, 3);
BaselineCompilerImpl.genNullCheck(asm, T0);
asm.emitCALL_Abs(Magic.getTocPointer().plus(Entrypoints.getfieldReadBarrierMethod.getOffset()));
asm.emitPUSH_Reg(T0);
}
Expand All @@ -137,27 +136,6 @@ static void compileGetstaticBarrierImm(Assembler asm, Offset fieldOffset, int lo
asm.emitPUSH_Reg(T0);
}

/**
* Generate a cheap nullcheck by attempting to load the TIB of the object
* at the given offset to SP.
*/
private static void genNullCheck(Assembler asm, int offset) {
if (VM.BuildFor32Addr) {
if (offset == 0) {
asm.emitMOV_Reg_RegInd(T1, SP);
} else {
asm.emitMOV_Reg_RegDisp(T1, SP, Offset.fromIntZeroExtend(offset));
}
} else {
if (offset == 0) {
asm.emitMOV_Reg_RegInd_Quad(T1, SP);
} else {
asm.emitMOV_Reg_RegDisp_Quad(T1, SP, Offset.fromIntZeroExtend(offset));
}
}
BaselineCompilerImpl.baselineEmitLoadTIB(asm, T1, T1);
}

static void compileModifyCheck(Assembler asm, int offset) {
if (!Configuration.ExtremeAssertions) return;
// on entry java stack contains ... [SP+offset] -> target_ref
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
import org.jikesrvm.jni.ia32.JNICompiler;
import org.jikesrvm.mm.mminterface.MemoryManager;
import org.jikesrvm.mm.mminterface.MemoryManagerConstants;
import org.jikesrvm.objectmodel.JavaHeader;
import org.jikesrvm.objectmodel.JavaHeaderConstants;
import org.jikesrvm.objectmodel.ObjectModel;
import org.jikesrvm.runtime.ArchEntrypoints;
Expand Down Expand Up @@ -3930,7 +3931,7 @@ static void genNullCheck(Assembler asm, GPR objRefReg) {
boolean cheapTest = true;
if (cheapTest) {
// perform load to cause trap
asm.emitTEST_RegInd_Reg(objRefReg, objRefReg);
asm.emitTEST_RegDisp_Reg(objRefReg, JavaHeader.getTibOffset(), objRefReg);
} else {
// compare to zero
asm.emitTEST_Reg_Reg(objRefReg, objRefReg);
Expand Down

0 comments on commit 0486d1b

Please sign in to comment.