# HG changeset patch # User Gilles Duboscq # Date 1312821532 -7200 # Node ID 5f3d12c9f30002380989746637db2444d126d313 # Parent cca4ea9b90643933541634d2cbc08c749649d423# Parent 28ba2439034ff8d9b686efbe3099357b23b178b4 Merge diff -r cca4ea9b9064 -r 5f3d12c9f300 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/GraalOptions.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/GraalOptions.java Mon Aug 08 18:38:24 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/GraalOptions.java Mon Aug 08 18:38:52 2011 +0200 @@ -146,7 +146,7 @@ public static boolean UseConstDirectCall = ____; - public static boolean GenSpecialDivChecks = ____; + public static boolean GenSpecialDivChecks = true; public static boolean GenAssertionCode = ____; public static boolean AlignCallsForPatching = true; public static boolean NullCheckUniquePc = ____; diff -r cca4ea9b9064 -r 5f3d12c9f300 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/MathIntrinsic.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/MathIntrinsic.java Mon Aug 08 18:38:24 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/MathIntrinsic.java Mon Aug 08 18:38:52 2011 +0200 @@ -29,7 +29,7 @@ public class MathIntrinsic extends FloatingNode { public enum Operation { - SQRT + ABS, SQRT, } @Input private Value x; diff -r cca4ea9b9064 -r 5f3d12c9f300 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64LIRAssembler.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64LIRAssembler.java Mon Aug 08 18:38:24 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64LIRAssembler.java Mon Aug 08 18:38:52 2011 +0200 @@ -1121,22 +1121,6 @@ moveRegs(lreg, AMD64.rax); Label continuation = new Label(); - - if (GraalOptions.GenSpecialDivChecks) { - // check for special case of Integer.MIN_VALUE / -1 - Label normalCase = new Label(); - masm.cmpl(AMD64.rax, Integer.MIN_VALUE); - masm.jcc(ConditionFlag.notEqual, normalCase); - if (code == LIROpcode.Irem) { - // prepare X86Register.rdx for possible special case where remainder = 0 - masm.xorl(AMD64.rdx, AMD64.rdx); - } - masm.cmpl(rreg, -1); - masm.jcc(ConditionFlag.equal, continuation); - - // handle normal case - masm.bind(normalCase); - } masm.cdql(); int offset = masm.codeBuffer.position(); masm.idivl(rreg); @@ -1170,7 +1154,8 @@ Label continuation = new Label(); - if (GraalOptions.GenSpecialDivChecks && code == LIROpcode.Div) { + System.out.println("gen check" + code); + if (GraalOptions.GenSpecialDivChecks && code == LIROpcode.Ldiv) { // check for special case of Long.MIN_VALUE / -1 Label normalCase = new Label(); masm.movq(AMD64.rdx, java.lang.Long.MIN_VALUE); diff -r cca4ea9b9064 -r 5f3d12c9f300 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64LIRGenerator.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64LIRGenerator.java Mon Aug 08 18:38:24 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64LIRGenerator.java Mon Aug 08 18:38:52 2011 +0200 @@ -466,14 +466,19 @@ @Override public void visitMathIntrinsic(MathIntrinsic node) { + assert node.kind == CiKind.Double; LIRItem opd = new LIRItem(node.x(), this); opd.setDestroysRegister(); opd.loadItem(); CiVariable dest = createResultVariable(node); switch (node.operation()) { + case ABS: + lir.abs(opd.result(), dest, CiValue.IllegalValue); + break; case SQRT: lir.sqrt(opd.result(), dest, CiValue.IllegalValue); break; + default: throw Util.shouldNotReachHere(); } diff -r cca4ea9b9064 -r 5f3d12c9f300 graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotRuntime.java --- a/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotRuntime.java Mon Aug 08 18:38:24 2011 +0200 +++ b/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotRuntime.java Mon Aug 08 18:38:52 2011 +0200 @@ -30,6 +30,7 @@ import com.oracle.max.graal.compiler.graph.*; import com.oracle.max.graal.compiler.ir.*; import com.oracle.max.graal.compiler.ir.Conditional.ConditionalStructure; +import com.oracle.max.graal.compiler.ir.MathIntrinsic.Operation; import com.oracle.max.graal.compiler.value.*; import com.oracle.max.graal.graph.*; import com.oracle.max.graal.runtime.nodes.*; @@ -603,10 +604,16 @@ intrinsicGraphs.put(method, graph); } } else if (holderName.equals("Ljava/lang/Math;")) { - if (fullName.equals("sqrt(D)D")) { + MathIntrinsic.Operation op = null; + if (fullName.equals("abs(D)D")) { + op = MathIntrinsic.Operation.ABS; + } else if (fullName.equals("sqrt(D)D")) { + op = MathIntrinsic.Operation.SQRT; + } + if (op != null) { CompilerGraph graph = new CompilerGraph(this); Local value = new Local(CiKind.Double, 0, graph); - MathIntrinsic min = new MathIntrinsic(value, MathIntrinsic.Operation.SQRT, graph); + MathIntrinsic min = new MathIntrinsic(value, op, graph); Return ret = new Return(min, graph); graph.start().setNext(ret); graph.setReturn(ret); diff -r cca4ea9b9064 -r 5f3d12c9f300 graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotXirGenerator.java --- a/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotXirGenerator.java Mon Aug 08 18:38:24 2011 +0200 +++ b/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotXirGenerator.java Mon Aug 08 18:38:52 2011 +0200 @@ -622,7 +622,7 @@ checkSubtype(asm, objHub, objHub, hub); asm.jneq(end, objHub, asm.o(null)); XirOperand scratch = asm.createRegisterTemp("scratch", CiKind.Word, AMD64.r10); - asm.mov(scratch, asm.createConstant(CiConstant.forWord(0))); + asm.mov(scratch, asm.createConstant(CiConstant.forWord(2))); asm.callRuntime(CiRuntimeCall.Deoptimize, null); asm.shouldNotReachHere(); diff -r cca4ea9b9064 -r 5f3d12c9f300 src/cpu/x86/vm/c1_Runtime1_x86.cpp --- a/src/cpu/x86/vm/c1_Runtime1_x86.cpp Mon Aug 08 18:38:24 2011 +0200 +++ b/src/cpu/x86/vm/c1_Runtime1_x86.cpp Mon Aug 08 18:38:52 2011 +0200 @@ -101,6 +101,7 @@ restore_live_registers(this, false); movptr(Address(thread, Thread::pending_exception_offset()), NULL_WORD); leave(); + movl(rscratch1, 2); // InvalidateRecompile jump(RuntimeAddress(SharedRuntime::deopt_blob()->uncommon_trap())); bind(L); } diff -r cca4ea9b9064 -r 5f3d12c9f300 src/cpu/x86/vm/sharedRuntime_x86_64.cpp --- a/src/cpu/x86/vm/sharedRuntime_x86_64.cpp Mon Aug 08 18:38:24 2011 +0200 +++ b/src/cpu/x86/vm/sharedRuntime_x86_64.cpp Mon Aug 08 18:38:52 2011 +0200 @@ -2642,7 +2642,7 @@ int jmp_uncommon_trap_offset = __ pc() - start; __ pushptr(Address(r15_thread, in_bytes(JavaThread::ScratchA_offset()))); - __ movptr(rscratch1, 0); + __ movptr(rscratch1, 2); // InvalidateRecompile int uncommon_trap_offset = __ pc() - start;