8153439: do not install an empty SpeculationLog in an nmethod
Reviewed-by: iveresov, twisti
This commit is contained in:
parent
d9c49d2be5
commit
1131e05b66
@ -83,6 +83,21 @@ suite = {
|
||||
"workingSets" : "API,JVMCI",
|
||||
},
|
||||
|
||||
"jdk.vm.ci.code.test" : {
|
||||
"subDir" : "test/compiler/jvmci",
|
||||
"sourceDirs" : ["src"],
|
||||
"dependencies" : [
|
||||
"mx:JUNIT",
|
||||
"jdk.vm.ci.amd64",
|
||||
"jdk.vm.ci.sparc",
|
||||
"jdk.vm.ci.code",
|
||||
"jdk.vm.ci.hotspot",
|
||||
],
|
||||
"checkstyle" : "jdk.vm.ci.services",
|
||||
"javaCompliance" : "1.8",
|
||||
"workingSets" : "API,JVMCI",
|
||||
},
|
||||
|
||||
"jdk.vm.ci.runtime" : {
|
||||
"subDir" : "src/jdk.vm.ci/share/classes",
|
||||
"sourceDirs" : ["src"],
|
||||
|
@ -120,7 +120,9 @@ public class HotSpotCodeCacheProvider implements CodeCacheProvider {
|
||||
resultInstalledCode = installedCode;
|
||||
}
|
||||
|
||||
int result = runtime.getCompilerToVM().installCode(target, (HotSpotCompiledCode) compiledCode, resultInstalledCode, (HotSpotSpeculationLog) log);
|
||||
HotSpotSpeculationLog speculationLog = (log != null && log.hasSpeculations()) ? (HotSpotSpeculationLog) log : null;
|
||||
|
||||
int result = runtime.getCompilerToVM().installCode(target, (HotSpotCompiledCode) compiledCode, resultInstalledCode, speculationLog);
|
||||
if (result != config.codeInstallResultOk) {
|
||||
String resultDesc = config.getCodeInstallResultDescription(result);
|
||||
if (compiledCode instanceof HotSpotCompiledNmethod) {
|
||||
|
@ -38,7 +38,7 @@ public class HotSpotSpeculationLog implements SpeculationLog {
|
||||
/** All speculations that have been a deoptimization reason. */
|
||||
private Set<SpeculationReason> failedSpeculations;
|
||||
|
||||
/** Strong references to all reasons embededded in the current nmethod. */
|
||||
/** Strong references to all reasons embedded in the current nmethod. */
|
||||
private volatile Collection<SpeculationReason> speculations;
|
||||
|
||||
@Override
|
||||
@ -81,4 +81,9 @@ public class HotSpotSpeculationLog implements SpeculationLog {
|
||||
|
||||
return HotSpotObjectConstantImpl.forObject(reason);
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized boolean hasSpeculations() {
|
||||
return speculations != null && !speculations.isEmpty();
|
||||
}
|
||||
}
|
||||
|
@ -56,4 +56,11 @@ public interface SpeculationLog {
|
||||
* argument to the deoptimization function.
|
||||
*/
|
||||
JavaConstant speculate(SpeculationReason reason);
|
||||
|
||||
/**
|
||||
* Returns if this log has speculations.
|
||||
*
|
||||
* @return true if there are speculations, false otherwise
|
||||
*/
|
||||
boolean hasSpeculations();
|
||||
}
|
||||
|
@ -20,15 +20,19 @@
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package compiler.jvmci.code;
|
||||
package jdk.vm.ci.code.test;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import org.junit.Assert;
|
||||
|
||||
import jdk.vm.ci.amd64.AMD64;
|
||||
import jdk.vm.ci.code.Architecture;
|
||||
import jdk.vm.ci.code.CodeCacheProvider;
|
||||
import jdk.vm.ci.code.InstalledCode;
|
||||
import jdk.vm.ci.code.TargetDescription;
|
||||
import jdk.vm.ci.code.test.amd64.AMD64TestAssembler;
|
||||
import jdk.vm.ci.code.test.sparc.SPARCTestAssembler;
|
||||
import jdk.vm.ci.hotspot.HotSpotCompiledCode;
|
||||
import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod;
|
||||
import jdk.vm.ci.meta.ConstantReflectionProvider;
|
||||
@ -37,11 +41,6 @@ import jdk.vm.ci.runtime.JVMCI;
|
||||
import jdk.vm.ci.runtime.JVMCIBackend;
|
||||
import jdk.vm.ci.sparc.SPARC;
|
||||
|
||||
import org.junit.Assert;
|
||||
|
||||
import compiler.jvmci.code.amd64.AMD64TestAssembler;
|
||||
import compiler.jvmci.code.sparc.SPARCTestAssembler;
|
||||
|
||||
/**
|
||||
* Base class for code installation tests.
|
||||
*/
|
@ -32,10 +32,11 @@
|
||||
* jdk.vm.ci/jdk.vm.ci.runtime
|
||||
* jdk.vm.ci/jdk.vm.ci.amd64
|
||||
* jdk.vm.ci/jdk.vm.ci.sparc
|
||||
* @run junit/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI compiler.jvmci.code.DataPatchTest
|
||||
* @compile CodeInstallationTest.java DebugInfoTest.java TestAssembler.java amd64/AMD64TestAssembler.java sparc/SPARCTestAssembler.java
|
||||
* @run junit/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI jdk.vm.ci.code.test.DataPatchTest
|
||||
*/
|
||||
|
||||
package compiler.jvmci.code;
|
||||
package jdk.vm.ci.code.test;
|
||||
|
||||
import jdk.vm.ci.code.Register;
|
||||
import jdk.vm.ci.code.site.DataSectionReference;
|
||||
@ -158,7 +159,6 @@ public class DataPatchTest extends CodeInstallationTest {
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
public static long getConstSymbol(HotSpotMetaAccessProvider meta) {
|
||||
HotSpotSymbol symbol = meta.lookupSymbol("java/lang/Object");
|
||||
return symbol.getMetaspacePointer();
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -20,7 +20,7 @@
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package compiler.jvmci.code;
|
||||
package jdk.vm.ci.code.test;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
@ -33,23 +33,20 @@
|
||||
* jdk.vm.ci/jdk.vm.ci.amd64
|
||||
* jdk.vm.ci/jdk.vm.ci.sparc
|
||||
* @compile CodeInstallationTest.java DebugInfoTest.java TestAssembler.java amd64/AMD64TestAssembler.java sparc/SPARCTestAssembler.java
|
||||
* @run junit/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI compiler.jvmci.code.InterpreterFrameSizeTest
|
||||
* @run junit/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI jdk.vm.ci.code.test.InterpreterFrameSizeTest
|
||||
*/
|
||||
|
||||
package compiler.jvmci.code;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import jdk.vm.ci.code.BytecodeFrame;
|
||||
import jdk.vm.ci.meta.JavaKind;
|
||||
import jdk.vm.ci.meta.JavaValue;
|
||||
import jdk.vm.ci.meta.ResolvedJavaMethod;
|
||||
|
||||
import jdk.vm.ci.hotspot.HotSpotCodeCacheProvider;
|
||||
package jdk.vm.ci.code.test;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
import jdk.vm.ci.code.BytecodeFrame;
|
||||
import jdk.vm.ci.hotspot.HotSpotCodeCacheProvider;
|
||||
import jdk.vm.ci.meta.JavaKind;
|
||||
import jdk.vm.ci.meta.JavaValue;
|
||||
import jdk.vm.ci.meta.ResolvedJavaMethod;
|
||||
|
||||
public class InterpreterFrameSizeTest extends CodeInstallationTest {
|
||||
|
||||
HotSpotCodeCacheProvider hotspotCodeCache() {
|
||||
@ -61,7 +58,7 @@ public class InterpreterFrameSizeTest extends CodeInstallationTest {
|
||||
try {
|
||||
hotspotCodeCache().interpreterFrameSize(null);
|
||||
} catch (NullPointerException npe) {
|
||||
System.out.println("threw NPE as expected");
|
||||
// Threw NPE as expected.
|
||||
return;
|
||||
}
|
||||
Assert.fail("expected NullPointerException");
|
||||
@ -78,7 +75,6 @@ public class InterpreterFrameSizeTest extends CodeInstallationTest {
|
||||
JavaKind[] slotKinds = new JavaKind[numLocals];
|
||||
BytecodeFrame frame = new BytecodeFrame(null, resolvedMethod, bci, false, false, values, slotKinds, numLocals, numStack, 0);
|
||||
int size = hotspotCodeCache().interpreterFrameSize(frame);
|
||||
System.out.println("Frame size is " + size + " bytes");
|
||||
if (size <= 0) {
|
||||
Assert.fail("expected non-zero result");
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -32,15 +32,16 @@
|
||||
* jdk.vm.ci/jdk.vm.ci.runtime
|
||||
* jdk.vm.ci/jdk.vm.ci.amd64
|
||||
* jdk.vm.ci/jdk.vm.ci.sparc
|
||||
* @run junit/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI compiler.jvmci.code.SimpleCodeInstallationTest
|
||||
* @compile CodeInstallationTest.java DebugInfoTest.java TestAssembler.java amd64/AMD64TestAssembler.java sparc/SPARCTestAssembler.java
|
||||
* @run junit/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI jdk.vm.ci.code.test.SimpleCodeInstallationTest
|
||||
*/
|
||||
|
||||
package compiler.jvmci.code;
|
||||
|
||||
import jdk.vm.ci.code.Register;
|
||||
package jdk.vm.ci.code.test;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import jdk.vm.ci.code.Register;
|
||||
|
||||
/**
|
||||
* Test simple code installation.
|
||||
*/
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -32,10 +32,14 @@
|
||||
* jdk.vm.ci/jdk.vm.ci.runtime
|
||||
* jdk.vm.ci/jdk.vm.ci.amd64
|
||||
* jdk.vm.ci/jdk.vm.ci.sparc
|
||||
* @run junit/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI compiler.jvmci.code.SimpleDebugInfoTest
|
||||
* @compile CodeInstallationTest.java DebugInfoTest.java TestAssembler.java amd64/AMD64TestAssembler.java sparc/SPARCTestAssembler.java
|
||||
* @run junit/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI jdk.vm.ci.code.test.SimpleDebugInfoTest
|
||||
*/
|
||||
|
||||
package compiler.jvmci.code;
|
||||
package jdk.vm.ci.code.test;
|
||||
|
||||
import org.junit.Assume;
|
||||
import org.junit.Test;
|
||||
|
||||
import jdk.vm.ci.code.Register;
|
||||
import jdk.vm.ci.hotspot.HotSpotConstant;
|
||||
@ -45,9 +49,6 @@ import jdk.vm.ci.meta.JavaKind;
|
||||
import jdk.vm.ci.meta.ResolvedJavaType;
|
||||
import jdk.vm.ci.meta.Value;
|
||||
|
||||
import org.junit.Assume;
|
||||
import org.junit.Test;
|
||||
|
||||
public class SimpleDebugInfoTest extends DebugInfoTest {
|
||||
|
||||
public static int intOnStack() {
|
||||
@ -99,7 +100,6 @@ public class SimpleDebugInfoTest extends DebugInfoTest {
|
||||
testIntInLocal(compiler);
|
||||
}
|
||||
|
||||
|
||||
public static float floatOnStack() {
|
||||
return 42.0f;
|
||||
}
|
||||
@ -149,7 +149,6 @@ public class SimpleDebugInfoTest extends DebugInfoTest {
|
||||
testFloatInLocal(compiler);
|
||||
}
|
||||
|
||||
|
||||
public static long longOnStack() {
|
||||
return 42;
|
||||
}
|
||||
@ -202,7 +201,6 @@ public class SimpleDebugInfoTest extends DebugInfoTest {
|
||||
testLongInLocal(compiler);
|
||||
}
|
||||
|
||||
|
||||
public static Class<?> objectOnStack() {
|
||||
return SimpleDebugInfoTest.class;
|
||||
}
|
@ -21,7 +21,7 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package compiler.jvmci.code;
|
||||
package jdk.vm.ci.code.test;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.ByteOrder;
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -32,14 +32,18 @@
|
||||
* jdk.vm.ci/jdk.vm.ci.runtime
|
||||
* jdk.vm.ci/jdk.vm.ci.amd64
|
||||
* jdk.vm.ci/jdk.vm.ci.sparc
|
||||
* @run junit/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI compiler.jvmci.code.VirtualObjectDebugInfoTest
|
||||
* @compile CodeInstallationTest.java DebugInfoTest.java TestAssembler.java amd64/AMD64TestAssembler.java sparc/SPARCTestAssembler.java
|
||||
* @run junit/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI jdk.vm.ci.code.test.VirtualObjectDebugInfoTest
|
||||
*/
|
||||
|
||||
package compiler.jvmci.code;
|
||||
package jdk.vm.ci.code.test;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Objects;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
import jdk.vm.ci.code.Register;
|
||||
import jdk.vm.ci.code.VirtualObject;
|
||||
import jdk.vm.ci.hotspot.HotSpotConstant;
|
||||
@ -49,9 +53,6 @@ import jdk.vm.ci.meta.JavaValue;
|
||||
import jdk.vm.ci.meta.ResolvedJavaField;
|
||||
import jdk.vm.ci.meta.ResolvedJavaType;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
public class VirtualObjectDebugInfoTest extends DebugInfoTest {
|
||||
|
||||
private static class TestClass {
|
||||
@ -61,11 +62,11 @@ public class VirtualObjectDebugInfoTest extends DebugInfoTest {
|
||||
private float floatField;
|
||||
private Object[] arrayField;
|
||||
|
||||
public TestClass() {
|
||||
TestClass() {
|
||||
this.longField = 8472;
|
||||
this.intField = 42;
|
||||
this.floatField = 3.14f;
|
||||
this.arrayField = new Object[] { Integer.valueOf(58), this, null, Integer.valueOf(17), "Hello, World!" };
|
||||
this.arrayField = new Object[]{Integer.valueOf(58), this, null, Integer.valueOf(17), "Hello, World!"};
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -75,10 +76,7 @@ public class VirtualObjectDebugInfoTest extends DebugInfoTest {
|
||||
}
|
||||
|
||||
TestClass other = (TestClass) o;
|
||||
if (this.longField != other.longField
|
||||
|| this.intField != other.intField
|
||||
|| this.floatField != other.floatField
|
||||
|| this.arrayField.length != other.arrayField.length) {
|
||||
if (this.longField != other.longField || this.intField != other.intField || this.floatField != other.floatField || this.arrayField.length != other.arrayField.length) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -95,6 +93,11 @@ public class VirtualObjectDebugInfoTest extends DebugInfoTest {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return super.hashCode();
|
||||
}
|
||||
}
|
||||
|
||||
public static TestClass buildObject() {
|
@ -21,7 +21,7 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package compiler.jvmci.code.amd64;
|
||||
package jdk.vm.ci.code.test.amd64;
|
||||
|
||||
import jdk.vm.ci.amd64.AMD64;
|
||||
import jdk.vm.ci.amd64.AMD64Kind;
|
||||
@ -31,6 +31,7 @@ import jdk.vm.ci.code.Register;
|
||||
import jdk.vm.ci.code.StackSlot;
|
||||
import jdk.vm.ci.code.site.ConstantReference;
|
||||
import jdk.vm.ci.code.site.DataSectionReference;
|
||||
import jdk.vm.ci.code.test.TestAssembler;
|
||||
import jdk.vm.ci.hotspot.HotSpotCallingConventionType;
|
||||
import jdk.vm.ci.hotspot.HotSpotConstant;
|
||||
import jdk.vm.ci.hotspot.HotSpotForeignCallTarget;
|
||||
@ -39,8 +40,6 @@ import jdk.vm.ci.meta.JavaKind;
|
||||
import jdk.vm.ci.meta.LIRKind;
|
||||
import jdk.vm.ci.meta.VMConstant;
|
||||
|
||||
import compiler.jvmci.code.TestAssembler;
|
||||
|
||||
public class AMD64TestAssembler extends TestAssembler {
|
||||
|
||||
public AMD64TestAssembler(CodeCacheProvider codeCache) {
|
||||
@ -161,7 +160,7 @@ public class AMD64TestAssembler extends TestAssembler {
|
||||
code.emitInt(0xDEADDEAD);
|
||||
return ret;
|
||||
} else {
|
||||
return emitLoadLong(0xDEADDEADDEADDEADl);
|
||||
return emitLoadLong(0xDEADDEADDEADDEADL);
|
||||
}
|
||||
}
|
||||
|
||||
@ -195,14 +194,16 @@ public class AMD64TestAssembler extends TestAssembler {
|
||||
@Override
|
||||
public StackSlot emitIntToStack(Register a) {
|
||||
StackSlot ret = newStackSlot(LIRKind.value(AMD64Kind.DWORD));
|
||||
emitModRMMemory(false, 0x89, a.encoding, AMD64.rbp.encoding, ret.getRawOffset() + 16); // MOV r/m32,r32
|
||||
// MOV r/m32,r32
|
||||
emitModRMMemory(false, 0x89, a.encoding, AMD64.rbp.encoding, ret.getRawOffset() + 16);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@Override
|
||||
public StackSlot emitLongToStack(Register a) {
|
||||
StackSlot ret = newStackSlot(LIRKind.value(AMD64Kind.QWORD));
|
||||
emitModRMMemory(true, 0x89, a.encoding, AMD64.rbp.encoding, ret.getRawOffset() + 16); // MOV r/m64,r64
|
||||
// MOV r/m64,r64
|
||||
emitModRMMemory(true, 0x89, a.encoding, AMD64.rbp.encoding, ret.getRawOffset() + 16);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -221,14 +222,16 @@ public class AMD64TestAssembler extends TestAssembler {
|
||||
@Override
|
||||
public StackSlot emitPointerToStack(Register a) {
|
||||
StackSlot ret = newStackSlot(LIRKind.reference(AMD64Kind.QWORD));
|
||||
emitModRMMemory(true, 0x89, a.encoding, AMD64.rbp.encoding, ret.getRawOffset() + 16); // MOV r/m64,r64
|
||||
// MOV r/m64,r64
|
||||
emitModRMMemory(true, 0x89, a.encoding, AMD64.rbp.encoding, ret.getRawOffset() + 16);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@Override
|
||||
public StackSlot emitNarrowPointerToStack(Register a) {
|
||||
StackSlot ret = newStackSlot(LIRKind.reference(AMD64Kind.DWORD));
|
||||
emitModRMMemory(false, 0x89, a.encoding, AMD64.rbp.encoding, ret.getRawOffset() + 16); // MOV r/m32,r32
|
||||
// MOV r/m32,r32
|
||||
emitModRMMemory(false, 0x89, a.encoding, AMD64.rbp.encoding, ret.getRawOffset() + 16);
|
||||
return ret;
|
||||
}
|
||||
|
@ -21,7 +21,7 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package compiler.jvmci.code.sparc;
|
||||
package jdk.vm.ci.code.test.sparc;
|
||||
|
||||
import jdk.vm.ci.code.CodeCacheProvider;
|
||||
import jdk.vm.ci.code.DebugInfo;
|
||||
@ -29,6 +29,7 @@ import jdk.vm.ci.code.Register;
|
||||
import jdk.vm.ci.code.StackSlot;
|
||||
import jdk.vm.ci.code.site.ConstantReference;
|
||||
import jdk.vm.ci.code.site.DataSectionReference;
|
||||
import jdk.vm.ci.code.test.TestAssembler;
|
||||
import jdk.vm.ci.hotspot.HotSpotCallingConventionType;
|
||||
import jdk.vm.ci.hotspot.HotSpotCompiledCode;
|
||||
import jdk.vm.ci.hotspot.HotSpotConstant;
|
||||
@ -41,8 +42,6 @@ import jdk.vm.ci.meta.VMConstant;
|
||||
import jdk.vm.ci.sparc.SPARC;
|
||||
import jdk.vm.ci.sparc.SPARCKind;
|
||||
|
||||
import compiler.jvmci.code.TestAssembler;
|
||||
|
||||
public class SPARCTestAssembler extends TestAssembler {
|
||||
|
||||
private static final int MASK13 = (1 << 13) - 1;
|
||||
@ -69,7 +68,8 @@ public class SPARCTestAssembler extends TestAssembler {
|
||||
|
||||
@Override
|
||||
public void emitPrologue() {
|
||||
emitOp3(0b10, SPARC.sp, 0b111100, SPARC.sp, -SPARC.REGISTER_SAFE_AREA_SIZE); // SAVE sp, -128, sp
|
||||
// SAVE sp, -128, sp
|
||||
emitOp3(0b10, SPARC.sp, 0b111100, SPARC.sp, -SPARC.REGISTER_SAFE_AREA_SIZE);
|
||||
setDeoptRescueSlot(newStackSlot(LIRKind.value(SPARCKind.XWORD)));
|
||||
}
|
||||
|
||||
@ -195,35 +195,40 @@ public class SPARCTestAssembler extends TestAssembler {
|
||||
@Override
|
||||
public StackSlot emitIntToStack(Register a) {
|
||||
StackSlot ret = newStackSlot(LIRKind.value(SPARCKind.WORD));
|
||||
emitOp3(0b11, a, 0b000100, SPARC.fp, ret.getRawOffset() + SPARC.STACK_BIAS); // STW a, [fp+offset]
|
||||
// STW a, [fp+offset]
|
||||
emitOp3(0b11, a, 0b000100, SPARC.fp, ret.getRawOffset() + SPARC.STACK_BIAS);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@Override
|
||||
public StackSlot emitLongToStack(Register a) {
|
||||
StackSlot ret = newStackSlot(LIRKind.value(SPARCKind.XWORD));
|
||||
emitOp3(0b11, a, 0b001110, SPARC.fp, ret.getRawOffset() + SPARC.STACK_BIAS); // STX a, [fp+offset]
|
||||
// STX a, [fp+offset]
|
||||
emitOp3(0b11, a, 0b001110, SPARC.fp, ret.getRawOffset() + SPARC.STACK_BIAS);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@Override
|
||||
public StackSlot emitFloatToStack(Register a) {
|
||||
StackSlot ret = newStackSlot(LIRKind.value(SPARCKind.SINGLE));
|
||||
emitOp3(0b11, a, 0b100100, SPARC.fp, ret.getRawOffset() + SPARC.STACK_BIAS); // STF a, [fp+offset]
|
||||
// STF a, [fp+offset]
|
||||
emitOp3(0b11, a, 0b100100, SPARC.fp, ret.getRawOffset() + SPARC.STACK_BIAS);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@Override
|
||||
public StackSlot emitPointerToStack(Register a) {
|
||||
StackSlot ret = newStackSlot(LIRKind.reference(SPARCKind.XWORD));
|
||||
emitOp3(0b11, a, 0b001110, SPARC.fp, ret.getRawOffset() + SPARC.STACK_BIAS); // STX a, [fp+offset]
|
||||
// STX a, [fp+offset]
|
||||
emitOp3(0b11, a, 0b001110, SPARC.fp, ret.getRawOffset() + SPARC.STACK_BIAS);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@Override
|
||||
public StackSlot emitNarrowPointerToStack(Register a) {
|
||||
StackSlot ret = newStackSlot(LIRKind.reference(SPARCKind.WORD));
|
||||
emitOp3(0b11, a, 0b000100, SPARC.fp, ret.getRawOffset() + SPARC.STACK_BIAS); // STW a, [fp+offset]
|
||||
// STW a, [fp+offset]
|
||||
emitOp3(0b11, a, 0b000100, SPARC.fp, ret.getRawOffset() + SPARC.STACK_BIAS);
|
||||
return ret;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user