Revision: 15785
http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=15785&view=revAuthor: steveb-oss
Date: 2009-09-19 02:11:41 +0000 (Sat, 19 Sep 2009)
Log Message:
-----------
Added missing magic methods, as part of another step toward RVM-845
Modified Paths:
--------------
rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineMagic.java
rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ppc/BaselineCompilerImpl.java
rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/bc2ir/GenerateMagic.java
rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/escape/SimpleEscape.java
rvmroot/trunk/rvm/src/org/jikesrvm/runtime/Magic.java
rvmroot/trunk/rvm/src/org/jikesrvm/runtime/MagicNames.java
Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineMagic.java
===================================================================
--- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineMagic.java 2009-09-18 09:03:36 UTC (rev 15784)
+++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineMagic.java 2009-09-19 02:11:41 UTC (rev 15785)
@@ -298,6 +298,7 @@
generators.put(getMethodReference(Address.class, MagicNames.prepareInt, Offset.class, int.class), g);
generators.put(getMethodReference(Address.class, MagicNames.loadFloat, Offset.class, float.class), g);
generators.put(getMethodReference(Magic.class, MagicNames.getIntAtOffset, Object.class, Offset.class, int.class), g);
+ generators.put(getMethodReference(Magic.class, MagicNames.getFloatAtOffset, Object.class, Offset.class, float.class), g);
generators.put(getMethodReference(Magic.class, MagicNames.getWordAtOffset, Object.class, Offset.class, Word.class), g);
generators.put(getMethodReference(Magic.class, MagicNames.prepareInt, Object.class, Offset.class, int.class), g);
generators.put(getMethodReference(Magic.class, MagicNames.prepareAddress, Object.class, Offset.class, Address.class), g);
@@ -578,6 +579,7 @@
static {
MagicGenerator g = new Magic_Store32();
generators.put(getMethodReference(Magic.class, MagicNames.setIntAtOffset, Object.class, Offset.class, int.class, void.class), g);
+ generators.put(getMethodReference(Magic.class, MagicNames.setFloatAtOffset, Object.class, Offset.class, float.class, void.class), g);
generators.put(getMethodReference(Magic.class, MagicNames.setWordAtOffset, Object.class, Offset.class, Word.class, void.class), g);
if (VALIDATE_OBJECT_REFERENCES) {
g = new EarlyReferenceCheckDecorator(NO_SLOT, g);
@@ -695,13 +697,12 @@
MagicGenerator g = new Store16_Offset();
generators.put(getMethodReference(Address.class, MagicNames.store, short.class, Offset.class, void.class), g);
generators.put(getMethodReference(Address.class, MagicNames.store, char.class, Offset.class, void.class), g);
-
}
/**
- * Store a char to an address plus offset in the format used in {@link Magic}
+ * Store a 16 bit quantity to an address plus offset in the format used in {@link Magic}
*/
- private static final class Magic_StoreChar extends MagicGenerator {
+ private static final class Magic_Store16 extends MagicGenerator {
@Override
void generateMagic(Assembler asm, MethodReference m, RVMMethod cm, Offset sd) {
asm.emitPOP_Reg(T0); // value
@@ -711,8 +712,9 @@
}
}
static {
- MagicGenerator g = new Magic_StoreChar();
+ MagicGenerator g = new Magic_Store16();
generators.put(getMethodReference(Magic.class, MagicNames.setCharAtOffset, Object.class, Offset.class, char.class, void.class), g);
+ generators.put(getMethodReference(Magic.class, MagicNames.setShortAtOffset, Object.class, Offset.class, short.class, void.class), g);
}
/**
Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ppc/BaselineCompilerImpl.java
===================================================================
--- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ppc/BaselineCompilerImpl.java 2009-09-18 09:03:36 UTC (rev 15784)
+++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/baseline/ppc/BaselineCompilerImpl.java 2009-09-19 02:11:41 UTC (rev 15785)
@@ -4615,6 +4615,13 @@
popAddr(T0); // pop object
asm.emitLIntX(T0, T1, T0); // *(object+offset)
pushInt(T0); // push *(object+offset)
+ } else if (methodName == MagicNames.getFloatAtOffset) {
+ popInt(T1); // pop offset
+ popAddr(T0); // pop object
+ asm.emitLWZX(T0, T1, T0); // *(object+offset)
+ pushInt(T0); // push *(object+offset),
+// asm.emitLFSX (F0, T1, T0); // *(object+offset)
+// pushFloat(F0);
} else if (methodName == MagicNames.getObjectAtOffset ||
methodName == MagicNames.getWordAtOffset ||
methodName == MagicNames.getTIBAtOffset) {
@@ -4651,6 +4658,11 @@
popInt(T1); // pop offset
popAddr(T0); // pop object
asm.emitSTWX(T2, T1, T0); // *(object+offset) = newvalue
+ } else if (methodName == MagicNames.setFloatAtOffset) {
+ popInt(T2); // pop newvalue
+ popInt(T1); // pop offset
+ popAddr(T0); // pop object
+ asm.emitSTWX(T2, T1, T0); // *(object+offset) = newvalue
} else if (methodName == MagicNames.setObjectAtOffset || methodName == MagicNames.setWordAtOffset) {
if (methodToBeCalled.getParameterTypes().length == 4) {
discardSlot(); // discard locationMetadata parameter
@@ -4664,7 +4676,7 @@
popInt(T1); // pop offset
popAddr(T0); // pop object
asm.emitSTBX(T2, T1, T0); // *(object+offset) = newvalue
- } else if (methodName == MagicNames.setCharAtOffset) {
+ } else if (methodName == MagicNames.setCharAtOffset || methodName == MagicNames.setShortAtOffset) {
popInt(T2); // pop newvalue
popInt(T1); // pop offset
popAddr(T0); // pop object
Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/bc2ir/GenerateMagic.java
===================================================================
--- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/bc2ir/GenerateMagic.java 2009-09-18 09:03:36 UTC (rev 15784)
+++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/bc2ir/GenerateMagic.java 2009-09-19 02:11:41 UTC (rev 15785)
@@ -303,6 +303,17 @@
Operand offset = bc2ir.popAddress();
Operand object = bc2ir.popRef();
bc2ir.appendInstruction(Store.create(INT_STORE, val, object, offset, null));
+ } else if (methodName == MagicNames.getFloatAtOffset) {
+ Operand offset = bc2ir.popAddress();
+ Operand object = bc2ir.popRef();
+ RegisterOperand val = gc.temps.makeTempFloat();
+ bc2ir.appendInstruction(Load.create(FLOAT_LOAD, val, object, offset, null));
+ bc2ir.push(val.copyD2U());
+ } else if (methodName == MagicNames.setFloatAtOffset) {
+ Operand val = bc2ir.popFloat();
+ Operand offset = bc2ir.popAddress();
+ Operand object = bc2ir.popRef();
+ bc2ir.appendInstruction(Store.create(FLOAT_STORE, val, object, offset, null));
} else if (methodName == MagicNames.getWordAtOffset) {
LocationOperand loc = null;
if (meth.getParameterTypes().length == 3) {
@@ -398,7 +409,7 @@
RegisterOperand val = gc.temps.makeTemp(TypeReference.Char);
bc2ir.appendInstruction(Load.create(USHORT_LOAD, val, object, offset, null));
bc2ir.push(val.copyD2U());
- } else if (methodName == MagicNames.setCharAtOffset) {
+ } else if (methodName == MagicNames.setCharAtOffset || methodName == MagicNames.setShortAtOffset) {
Operand val = bc2ir.popInt();
Operand offset = bc2ir.popAddress();
Operand object = bc2ir.popRef();
Modified: rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/escape/SimpleEscape.java
===================================================================
--- rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/escape/SimpleEscape.java 2009-09-18 09:03:36 UTC (rev 15784)
+++ rvmroot/trunk/rvm/src/org/jikesrvm/compilers/opt/escape/SimpleEscape.java 2009-09-19 02:11:41 UTC (rev 15785)
@@ -62,6 +62,8 @@
import static org.jikesrvm.compilers.opt.ir.Operators.DOUBLE_STORE_opcode;
import static org.jikesrvm.compilers.opt.ir.Operators.FLOAT_ALOAD_opcode;
import static org.jikesrvm.compilers.opt.ir.Operators.FLOAT_ASTORE_opcode;
+import static org.jikesrvm.compilers.opt.ir.Operators.FLOAT_LOAD_opcode;
+import static org.jikesrvm.compilers.opt.ir.Operators.FLOAT_STORE_opcode;
import static org.jikesrvm.compilers.opt.ir.Operators.GETFIELD_opcode;
import static org.jikesrvm.compilers.opt.ir.Operators.GETSTATIC_opcode;
import static org.jikesrvm.compilers.opt.ir.Operators.GET_CAUGHT_EXCEPTION_opcode;
@@ -411,6 +413,7 @@
case REF_ALOAD_opcode:
case INT_LOAD_opcode:
case LONG_LOAD_opcode:
+ case FLOAT_LOAD_opcode:
case DOUBLE_LOAD_opcode:
case REF_LOAD_opcode:
// all is OK, unless we load this register from memory
@@ -431,6 +434,7 @@
case REF_STORE_opcode:
case INT_STORE_opcode:
case LONG_STORE_opcode:
+ case FLOAT_STORE_opcode:
case DOUBLE_STORE_opcode:
// as long as we don't store this operand elsewhere, all
// is OK. TODO: add more smarts.
@@ -611,6 +615,7 @@
case REF_ALOAD_opcode:
case INT_LOAD_opcode:
case LONG_LOAD_opcode:
+ case FLOAT_LOAD_opcode:
case DOUBLE_LOAD_opcode:
case REF_LOAD_opcode:
// all is OK, unless we load this register from memory
@@ -631,6 +636,7 @@
case REF_STORE_opcode:
case INT_STORE_opcode:
case LONG_STORE_opcode:
+ case FLOAT_STORE_opcode:
case DOUBLE_STORE_opcode:
// as long as we don't store this operand elsewhere, all
// is OK. TODO: add more smarts.
Modified: rvmroot/trunk/rvm/src/org/jikesrvm/runtime/Magic.java
===================================================================
--- rvmroot/trunk/rvm/src/org/jikesrvm/runtime/Magic.java 2009-09-18 09:03:36 UTC (rev 15784)
+++ rvmroot/trunk/rvm/src/org/jikesrvm/runtime/Magic.java 2009-09-19 02:11:41 UTC (rev 15785)
@@ -197,6 +197,15 @@
}
/**
+ * Get char at arbitrary (byte) offset from object. The most
+ * significant 16bits will be 0.
+ */
+ public static char getCharAtOffset(Object object, Offset offset) {
+ if (VM.VerifyAssertions) VM._assert(VM.NOT_REACHED); // call site should have been hijacked by magic in compiler
+ return (char) -1;
+ }
+
+ /**
* Get short at arbitrary (byte) offset from object. The most
* significant 16bits will be the same as the most significant bit
* in the short.
@@ -207,33 +216,41 @@
}
/**
- * Get char at arbitrary (byte) offset from object. The most
- * significant 16bits will be 0.
+ * Get int at arbitrary (byte) offset from object.
+ * Use getIntAtOffset(obj, ofs) instead of getMemoryInt(objectAsAddress(obj)+ofs)
*/
- public static char getCharAtOffset(Object object, Offset offset) {
+ public static int getIntAtOffset(Object object, Offset offset) {
if (VM.VerifyAssertions) VM._assert(VM.NOT_REACHED); // call site should have been hijacked by magic in compiler
- return (char) -1;
+ return -1;
}
/**
- * Get int at arbitrary (byte) offset from object.
- * Use getIntAtOffset(obj, ofs) instead of getMemoryInt(objectAsAddress(obj)+ofs)
+ * Get long at arbitrary (byte) offset from object.
+ * Use getlongAtOffset(obj, ofs) instead of two getIntAtOffset
*/
- public static int getIntAtOffset(Object object, Offset offset) {
+ public static long getLongAtOffset(Object object, Offset offset) {
if (VM.VerifyAssertions) VM._assert(VM.NOT_REACHED); // call site should have been hijacked by magic in compiler
return -1;
}
/**
- * Get Word at arbitrary (byte) offset from object.
- * Use getWordAtOffset(obj, ofs) instead of getMemoryWord(objectAsAddress(obj)+ofs)
+ * Get float at arbitrary (byte) offset from object.
*/
- public static Word getWordAtOffset(Object object, Offset offset) {
+ public static float getFloatAtOffset(Object object, Offset offset) {
if (VM.VerifyAssertions) VM._assert(VM.NOT_REACHED); // call site should have been hijacked by magic in compiler
- return Word.max();
+ return -1;
}
/**
+ * Get double at arbitrary (byte) offset from object.
+ * Use getDoubleAtOffset(obj, ofs) instead of two getIntAtOffset
+ */
+ public static double getDoubleAtOffset(Object object, Offset offset) {
+ if (VM.VerifyAssertions) VM._assert(VM.NOT_REACHED); // call site should have been hijacked by magic in compiler
+ return -1;
+ }
+
+ /**
* Get Object at arbitrary (byte) offset from object.
* Use getObjectAtOffset(obj, ofs) instead of
* addressAsObject(getMemoryAddress(objectAsAddress(obj)+ofs))
@@ -255,7 +272,16 @@
/**
* Get Word at arbitrary (byte) offset from object.
+ * Use getWordAtOffset(obj, ofs) instead of getMemoryWord(objectAsAddress(obj)+ofs)
*/
+ public static Word getWordAtOffset(Object object, Offset offset) {
+ if (VM.VerifyAssertions) VM._assert(VM.NOT_REACHED); // call site should have been hijacked by magic in compiler
+ return Word.max();
+ }
+
+ /**
+ * Get Word at arbitrary (byte) offset from object.
+ */
public static Word getWordAtOffset(Object object, Offset offset, int locationMetadata) {
if (VM.VerifyAssertions) VM._assert(VM.NOT_REACHED); // call site should have been hijacked by magic in compiler
return null;
@@ -272,46 +298,58 @@
}
/**
- * Get long at arbitrary (byte) offset from object.
- * Use getlongAtOffset(obj, ofs) instead of two getIntAtOffset
+ * Set byte at arbitrary (byte) offset from object.
*/
- public static long getLongAtOffset(Object object, Offset offset) {
+ public static void setByteAtOffset(Object object, Offset offset, byte newvalue) {
if (VM.VerifyAssertions) VM._assert(VM.NOT_REACHED); // call site should have been hijacked by magic in compiler
- return -1;
}
/**
- * Get double at arbitrary (byte) offset from object.
- * Use getDoubleAtOffset(obj, ofs) instead of two getIntAtOffset
+ * Set char at arbitrary (byte) offset from object.
*/
- public static double getDoubleAtOffset(Object object, Offset offset) {
+ public static void setCharAtOffset(Object object, Offset offset, char newvalue) {
if (VM.VerifyAssertions) VM._assert(VM.NOT_REACHED); // call site should have been hijacked by magic in compiler
- return -1;
}
/**
- * Set byte at arbitrary (byte) offset from object.
+ * Set short at arbitrary (byte) offset from object.
*/
- public static void setByteAtOffset(Object object, Offset offset, byte newvalue) {
+ public static void setShortAtOffset(Object object, Offset offset, short newvalue) {
if (VM.VerifyAssertions) VM._assert(VM.NOT_REACHED); // call site should have been hijacked by magic in compiler
}
/**
- * Set char at arbitrary (byte) offset from object.
+ * Set int at arbitrary (byte) offset from object.
+ * Use setIntAtOffset(obj, ofs, new) instead of setMemoryWord(objectAsAddress(obj)+ofs, new)
*/
- public static void setCharAtOffset(Object object, Offset offset, char newvalue) {
+ public static void setIntAtOffset(Object object, Offset offset, int newvalue) {
if (VM.VerifyAssertions) VM._assert(VM.NOT_REACHED); // call site should have been hijacked by magic in compiler
}
/**
- * Set int at arbitrary (byte) offset from object.
- * Use setIntAtOffset(obj, ofs, new) instead of setMemoryWord(objectAsAddress(obj)+ofs, new)
+ * Set long at arbitrary (byte) offset from object.
+ * Use setlongAtOffset(obj, ofs) instead of two setIntAtOffset
*/
- public static void setIntAtOffset(Object object, Offset offset, int newvalue) {
+ public static void setLongAtOffset(Object object, Offset offset, long newvalue) {
if (VM.VerifyAssertions) VM._assert(VM.NOT_REACHED); // call site should have been hijacked by magic in compiler
}
/**
+ * Set float at arbitrary (byte) offset from object.
+ */
+ public static void setFloatAtOffset(Object object, Offset offset, float newvalue) {
+ if (VM.VerifyAssertions) VM._assert(VM.NOT_REACHED); // call site should have been hijacked by magic in compiler
+ }
+
+ /**
+ * Set double at arbitrary (byte) offset from object.
+ * Use setDoubleAtOffset(obj, ofs) instead of two setIntAtOffset
+ */
+ public static void setDoubleAtOffset(Object object, Offset offset, double newvalue) {
+ if (VM.VerifyAssertions) VM._assert(VM.NOT_REACHED); // call site should have been hijacked by magic in compiler
+ }
+
+ /**
* Set word at arbitrary (byte) offset from object.
* Use setWordAtOffset(obj, ofs, new) instead of setMemoryWord(objectAsAddress(obj)+ofs, new)
*/
@@ -342,22 +380,7 @@
if (VM.VerifyAssertions) VM._assert(VM.NOT_REACHED); // call site should have been hijacked by magic in compiler
}
- /**
- * Set long at arbitrary (byte) offset from object.
- * Use setlongAtOffset(obj, ofs) instead of two setIntAtOffset
- */
- public static void setLongAtOffset(Object object, Offset offset, long newvalue) {
- if (VM.VerifyAssertions) VM._assert(VM.NOT_REACHED); // call site should have been hijacked by magic in compiler
- }
- /**
- * Set double at arbitrary (byte) offset from object.
- * Use setDoubleAtOffset(obj, ofs) instead of two setIntAtOffset
- */
- public static void setDoubleAtOffset(Object object, Offset offset, double newvalue) {
- if (VM.VerifyAssertions) VM._assert(VM.NOT_REACHED); // call site should have been hijacked by magic in compiler
- }
-
//---------------------------------------//
// Atomic Memory Access Primitives. //
//---------------------------------------//
Modified: rvmroot/trunk/rvm/src/org/jikesrvm/runtime/MagicNames.java
===================================================================
--- rvmroot/trunk/rvm/src/org/jikesrvm/runtime/MagicNames.java 2009-09-18 09:03:36 UTC (rev 15784)
+++ rvmroot/trunk/rvm/src/org/jikesrvm/runtime/MagicNames.java 2009-09-19 02:11:41 UTC (rev 15785)
@@ -69,21 +69,24 @@
public static final Atom getUnsignedByteAtOffset = Atom.findOrCreateAsciiAtom("getUnsignedByteAtOffset");
public static final Atom getByteAtOffset = Atom.findOrCreateAsciiAtom("getByteAtOffset");
+ public static final Atom getCharAtOffset = Atom.findOrCreateAsciiAtom("getCharAtOffset");
public static final Atom getShortAtOffset = Atom.findOrCreateAsciiAtom("getShortAtOffset");
- public static final Atom getCharAtOffset = Atom.findOrCreateAsciiAtom("getCharAtOffset");
public static final Atom getIntAtOffset = Atom.findOrCreateAsciiAtom("getIntAtOffset");
+ public static final Atom getLongAtOffset = Atom.findOrCreateAsciiAtom("getLongAtOffset");
+ public static final Atom getFloatAtOffset = Atom.findOrCreateAsciiAtom("getFloatAtOffset");
+ public static final Atom getDoubleAtOffset = Atom.findOrCreateAsciiAtom("getDoubleAtOffset");
public static final Atom getWordAtOffset = Atom.findOrCreateAsciiAtom("getWordAtOffset");
public static final Atom getObjectAtOffset = Atom.findOrCreateAsciiAtom("getObjectAtOffset");
public static final Atom getTIBAtOffset = Atom.findOrCreateAsciiAtom("getTIBAtOffset");
- public static final Atom getLongAtOffset = Atom.findOrCreateAsciiAtom("getLongAtOffset");
- public static final Atom getDoubleAtOffset = Atom.findOrCreateAsciiAtom("getDoubleAtOffset");
public static final Atom setByteAtOffset = Atom.findOrCreateAsciiAtom("setByteAtOffset");
public static final Atom setCharAtOffset = Atom.findOrCreateAsciiAtom("setCharAtOffset");
+ public static final Atom setShortAtOffset = Atom.findOrCreateAsciiAtom("setShortAtOffset");
public static final Atom setIntAtOffset = Atom.findOrCreateAsciiAtom("setIntAtOffset");
+ public static final Atom setLongAtOffset = Atom.findOrCreateAsciiAtom("setLongAtOffset");
+ public static final Atom setFloatAtOffset = Atom.findOrCreateAsciiAtom("setFloatAtOffset");
+ public static final Atom setDoubleAtOffset = Atom.findOrCreateAsciiAtom("setDoubleAtOffset");
public static final Atom setWordAtOffset = Atom.findOrCreateAsciiAtom("setWordAtOffset");
public static final Atom setObjectAtOffset = Atom.findOrCreateAsciiAtom("setObjectAtOffset");
- public static final Atom setLongAtOffset = Atom.findOrCreateAsciiAtom("setLongAtOffset");
- public static final Atom setDoubleAtOffset = Atom.findOrCreateAsciiAtom("setDoubleAtOffset");
public static final Atom getMemoryInt = Atom.findOrCreateAsciiAtom("getMemoryInt");
public static final Atom setMemoryInt = Atom.findOrCreateAsciiAtom("setMemoryInt");
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
------------------------------------------------------------------------------
Come build with us! The BlackBerry® Developer Conference in SF, CA
is the only developer event you need to attend this year. Jumpstart your
developing skills, take BlackBerry mobile applications to market and stay
ahead of the curve. Join us from November 9-12, 2009. Register now!
http://p.sf.net/sfu/devconf_______________________________________________
Jikesrvm-commits mailing list
Jikesrvm-commits@...
https://lists.sourceforge.net/lists/listinfo/jikesrvm-commits