# HG changeset patch # User Doug Simon # Date 1354901186 -3600 # Node ID 6c46172c04bfc058e3ed62d34a022f47dfd9f71a # Parent ae69cd8c08a9003de975fc58ae9af3ff0184e165 consolidated new_type_array and new_object_array stubs into one as there no difference between them diff -r ae69cd8c08a9 -r 6c46172c04bf graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotRuntime.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotRuntime.java Fri Dec 07 16:01:38 2012 +0100 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotRuntime.java Fri Dec 07 18:26:26 2012 +0100 @@ -85,13 +85,7 @@ /* arg0: object */ arg(0, Kind.Object), /* arg1: lock */ arg(1, word)); - addRuntimeCall(NEW_OBJECT_ARRAY, c.newObjectArrayStub, - /* temps */ new Register[] {rcx, rdi, rsi}, - /* ret */ rax.asValue(Kind.Object), - /* arg0: hub */ rdx.asValue(word), - /* arg1: length */ rbx.asValue(Kind.Int)); - - addRuntimeCall(NEW_TYPE_ARRAY, c.newTypeArrayStub, + addRuntimeCall(NEW_ARRAY, c.newArrayStub, /* temps */ new Register[] {rcx, rdi, rsi}, /* ret */ rax.asValue(Kind.Object), /* arg0: hub */ rdx.asValue(word), diff -r ae69cd8c08a9 -r 6c46172c04bf graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java Fri Dec 07 16:01:38 2012 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java Fri Dec 07 18:26:26 2012 +0100 @@ -254,8 +254,7 @@ public long debugStub; public long instanceofStub; public long newInstanceStub; - public long newTypeArrayStub; - public long newObjectArrayStub; + public long newArrayStub; public long newMultiArrayStub; public long inlineCacheMissStub; public long handleExceptionStub; diff -r ae69cd8c08a9 -r 6c46172c04bf graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/NewArrayStubCall.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/NewArrayStubCall.java Fri Dec 07 16:01:38 2012 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/NewArrayStubCall.java Fri Dec 07 18:26:26 2012 +0100 @@ -36,7 +36,7 @@ import com.oracle.graal.snippets.*; /** - * Node implementing a call to HotSpot's {@code new_[object|type]_array} stub. + * Node implementing a call to the {@code new_array} stub. */ public class NewArrayStubCall extends FixedWithNextNode implements LIRGenLowerable { @@ -44,15 +44,11 @@ @Input private final ValueNode hub; @Input private final ValueNode length; - private final boolean isObjectArray; - public static final Descriptor NEW_OBJECT_ARRAY = new Descriptor("new_object_array", false, Kind.Object, wordKind(), Kind.Int); + public static final Descriptor NEW_ARRAY = new Descriptor("new_array", false, Kind.Object, wordKind(), Kind.Int); - public static final Descriptor NEW_TYPE_ARRAY = new Descriptor("new_type_array", false, Kind.Object, wordKind(), Kind.Int); - - public NewArrayStubCall(boolean isObjectArray, ValueNode hub, ValueNode length) { + public NewArrayStubCall(ValueNode hub, ValueNode length) { super(defaultStamp); - this.isObjectArray = isObjectArray; this.hub = hub; this.length = length; } @@ -68,11 +64,11 @@ @Override public void generate(LIRGenerator gen) { - RuntimeCallTarget stub = gen.getRuntime().lookupRuntimeCall(isObjectArray ? NewArrayStubCall.NEW_OBJECT_ARRAY : NewArrayStubCall.NEW_TYPE_ARRAY); + RuntimeCallTarget stub = gen.getRuntime().lookupRuntimeCall(NEW_ARRAY); Variable result = gen.emitCall(stub, stub.getCallingConvention(), true, gen.operand(hub), gen.operand(length)); gen.setResult(this, result); } @NodeIntrinsic - public static native Object call(@ConstantNodeParameter boolean isObjectArray, Word hub, int length); + public static native Object call(Word hub, int length); } diff -r ae69cd8c08a9 -r 6c46172c04bf graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/NewObjectSnippets.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/NewObjectSnippets.java Fri Dec 07 16:01:38 2012 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/NewObjectSnippets.java Fri Dec 07 18:26:26 2012 +0100 @@ -95,7 +95,7 @@ } @Snippet - public static Object initializeObjectArray( + public static Object initializeArray( @Parameter("memory") Word memory, @Parameter("hub") Word hub, @Parameter("length") int length, @@ -105,44 +105,19 @@ @ConstantParameter("fillContents") boolean fillContents, @ConstantParameter("locked") boolean locked) { if (locked) { - return initializeArray(memory, hub, length, size, thread().or(biasedLockPattern()), headerSize, true, fillContents); + return initializeArray(memory, hub, length, size, thread().or(biasedLockPattern()), headerSize, fillContents); } else { - return initializeArray(memory, hub, length, size, prototypeMarkWord, headerSize, true, fillContents); + return initializeArray(memory, hub, length, size, prototypeMarkWord, headerSize, fillContents); } } - @Snippet - public static Object initializePrimitiveArray( - @Parameter("memory") Word memory, - @Parameter("hub") Word hub, - @Parameter("length") int length, - @Parameter("size") int size, - @Parameter("prototypeMarkWord") Word prototypeMarkWord, - @ConstantParameter("headerSize") int headerSize, - @ConstantParameter("fillContents") boolean fillContents, - @ConstantParameter("locked") boolean locked) { - if (locked) { - return initializeArray(memory, hub, length, size, thread().or(biasedLockPattern()), headerSize, false, fillContents); - } else { - return initializeArray(memory, hub, length, size, prototypeMarkWord, headerSize, false, fillContents); - } - } - - private static Object initializeArray(Word memory, Word hub, int length, int size, Word prototypeMarkWord, int headerSize, boolean isObjectArray, boolean fillContents) { + private static Object initializeArray(Word memory, Word hub, int length, int size, Word prototypeMarkWord, int headerSize, boolean fillContents) { Object result; if (memory == Word.zero()) { - if (isObjectArray) { - anewarray_stub.inc(); - } else { - newarray_stub.inc(); - } - result = NewArrayStubCall.call(isObjectArray, hub, length); + newarray_stub.inc(); + result = NewArrayStubCall.call(hub, length); } else { - if (isObjectArray) { - anewarray_loopInit.inc(); - } else { - newarray_loopInit.inc(); - } + newarray_loopInit.inc(); formatArray(hub, size, length, headerSize, memory, prototypeMarkWord, fillContents); result = memory.toObject(); } @@ -241,8 +216,7 @@ private final ResolvedJavaMethod allocate; private final ResolvedJavaMethod initializeObject; - private final ResolvedJavaMethod initializeObjectArray; - private final ResolvedJavaMethod initializePrimitiveArray; + private final ResolvedJavaMethod initializeArray; private final ResolvedJavaMethod allocateArrayAndInitialize; private final ResolvedJavaMethod newmultiarray; private final TargetDescription target; @@ -254,8 +228,7 @@ this.useTLAB = useTLAB; allocate = snippet("allocate", int.class); initializeObject = snippet("initializeObject", Word.class, Word.class, Word.class, int.class, boolean.class, boolean.class); - initializeObjectArray = snippet("initializeObjectArray", Word.class, Word.class, int.class, int.class, Word.class, int.class, boolean.class, boolean.class); - initializePrimitiveArray = snippet("initializePrimitiveArray", Word.class, Word.class, int.class, int.class, Word.class, int.class, boolean.class, boolean.class); + initializeArray = snippet("initializeArray", Word.class, Word.class, int.class, int.class, Word.class, int.class, boolean.class, boolean.class); allocateArrayAndInitialize = snippet("allocateArrayAndInitialize", int.class, int.class, int.class, int.class, ResolvedJavaType.class); newmultiarray = snippet("newmultiarray", Word.class, int.class, int[].class); } @@ -365,11 +338,11 @@ ConstantNode hub = ConstantNode.forConstant(type.klass(), runtime, graph); Kind elementKind = elementType.getKind(); final int headerSize = HotSpotRuntime.getArrayBaseOffset(elementKind); - Key key = new Key(elementKind == Kind.Object ? initializeObjectArray : initializePrimitiveArray).add("headerSize", headerSize).add("fillContents", initializeNode.fillContents()).add("locked", initializeNode.locked()); + Key key = new Key(initializeArray).add("headerSize", headerSize).add("fillContents", initializeNode.fillContents()).add("locked", initializeNode.locked()); ValueNode memory = initializeNode.memory(); Arguments arguments = arguments("memory", memory).add("hub", hub).add("prototypeMarkWord", type.prototypeMarkWord()).add("size", initializeNode.size()).add("length", initializeNode.length()); SnippetTemplate template = cache.get(key, assumptions); - Debug.log("Lowering initializeObjectArray in %s: node=%s, template=%s, arguments=%s", graph, initializeNode, template, arguments); + Debug.log("Lowering initializeArray in %s: node=%s, template=%s, arguments=%s", graph, initializeNode, template, arguments); template.instantiate(runtime, initializeNode, DEFAULT_REPLACER, arguments); } @@ -395,11 +368,7 @@ private static final SnippetCounter new_loopInit = new SnippetCounter(countersNew, "tlabLoopInit", "TLAB alloc with zeroing in a loop"); private static final SnippetCounter new_stub = new SnippetCounter(countersNew, "stub", "alloc and zeroing via stub"); - private static final SnippetCounter.Group countersNewPrimitiveArray = GraalOptions.SnippetCounters ? new SnippetCounter.Group("NewPrimitiveArray") : null; - private static final SnippetCounter newarray_loopInit = new SnippetCounter(countersNewPrimitiveArray, "tlabLoopInit", "TLAB alloc with zeroing in a loop"); - private static final SnippetCounter newarray_stub = new SnippetCounter(countersNewPrimitiveArray, "stub", "alloc and zeroing via stub"); - - private static final SnippetCounter.Group countersNewObjectArray = GraalOptions.SnippetCounters ? new SnippetCounter.Group("NewObjectArray") : null; - private static final SnippetCounter anewarray_loopInit = new SnippetCounter(countersNewObjectArray, "tlabLoopInit", "TLAB alloc with zeroing in a loop"); - private static final SnippetCounter anewarray_stub = new SnippetCounter(countersNewObjectArray, "stub", "alloc and zeroing via stub"); + private static final SnippetCounter.Group countersNewArray = GraalOptions.SnippetCounters ? new SnippetCounter.Group("NewArray") : null; + private static final SnippetCounter newarray_loopInit = new SnippetCounter(countersNewArray, "tlabLoopInit", "TLAB alloc with zeroing in a loop"); + private static final SnippetCounter newarray_stub = new SnippetCounter(countersNewArray, "stub", "alloc and zeroing via stub"); } diff -r ae69cd8c08a9 -r 6c46172c04bf src/cpu/x86/vm/graalRuntime_x86.cpp --- a/src/cpu/x86/vm/graalRuntime_x86.cpp Fri Dec 07 16:01:38 2012 +0100 +++ b/src/cpu/x86/vm/graalRuntime_x86.cpp Fri Dec 07 18:26:26 2012 +0100 @@ -804,44 +804,18 @@ break; - case graal_new_type_array_id: - case graal_new_object_array_id: + case graal_new_array_id: { Register length = rbx; // Incoming Register klass = rdx; // Incoming Register obj = rax; // Result - if (id == graal_new_type_array_id) { - __ set_info("new_type_array", dont_gc_arguments); - } else { - __ set_info("new_object_array", dont_gc_arguments); - } + __ set_info("new_array", dont_gc_arguments); -#ifdef ASSERT - // assert object type is really an array of the proper kind - { - Label ok; - Register t0 = obj; - __ movl(t0, Address(klass, Klass::layout_helper_offset())); - __ sarl(t0, Klass::_lh_array_tag_shift); - int tag = ((id == graal_new_type_array_id) - ? Klass::_lh_array_tag_type_value - : Klass::_lh_array_tag_obj_value); - __ cmpl(t0, tag); - __ jcc(Assembler::equal, ok); - __ stop("assert(is an array klass)"); - __ should_not_reach_here(); - __ bind(ok); - } -#endif // ASSERT __ enter(); OopMap* map = save_live_registers(sasm, 3); int call_offset; - if (id == graal_new_type_array_id) { - call_offset = __ call_RT(obj, noreg, CAST_FROM_FN_PTR(address, new_type_array), klass, length); - } else { - call_offset = __ call_RT(obj, noreg, CAST_FROM_FN_PTR(address, new_object_array), klass, length); - } + call_offset = __ call_RT(obj, noreg, CAST_FROM_FN_PTR(address, new_array), klass, length); oop_maps = new OopMapSet(); oop_maps->add_gc_map(call_offset, map); diff -r ae69cd8c08a9 -r 6c46172c04bf src/share/vm/graal/graalCompilerToVM.cpp --- a/src/share/vm/graal/graalCompilerToVM.cpp Fri Dec 07 16:01:38 2012 +0100 +++ b/src/share/vm/graal/graalCompilerToVM.cpp Fri Dec 07 18:26:26 2012 +0100 @@ -683,8 +683,7 @@ set_long("debugStub", VmIds::addStub((address)warning)); set_long("instanceofStub", VmIds::addStub(GraalRuntime::entry_for(GraalRuntime::graal_slow_subtype_check_id))); set_long("newInstanceStub", VmIds::addStub(GraalRuntime::entry_for(GraalRuntime::graal_new_instance_id))); - set_long("newTypeArrayStub", VmIds::addStub(GraalRuntime::entry_for(GraalRuntime::graal_new_type_array_id))); - set_long("newObjectArrayStub", VmIds::addStub(GraalRuntime::entry_for(GraalRuntime::graal_new_object_array_id))); + set_long("newArrayStub", VmIds::addStub(GraalRuntime::entry_for(GraalRuntime::graal_new_array_id))); set_long("newMultiArrayStub", VmIds::addStub(GraalRuntime::entry_for(GraalRuntime::graal_new_multi_array_id))); set_long("inlineCacheMissStub", VmIds::addStub(SharedRuntime::get_ic_miss_stub())); set_long("handleExceptionStub", VmIds::addStub(GraalRuntime::entry_for(GraalRuntime::graal_handle_exception_nofpu_id))); diff -r ae69cd8c08a9 -r 6c46172c04bf src/share/vm/graal/graalRuntime.cpp --- a/src/share/vm/graal/graalRuntime.cpp Fri Dec 07 16:01:38 2012 +0100 +++ b/src/share/vm/graal/graalRuntime.cpp Fri Dec 07 18:26:26 2012 +0100 @@ -244,31 +244,19 @@ thread->set_vm_result(obj); JRT_END - -JRT_ENTRY(void, GraalRuntime::new_type_array(JavaThread* thread, Klass* klass, jint length)) - // Note: no handle for klass needed since they are not used - // anymore after new_typeArray() and no GC can happen before. - // (This may have to change if this code changes!) - assert(klass->is_klass(), "not a class"); - BasicType elt_type = TypeArrayKlass::cast(klass)->element_type(); - oop obj = oopFactory::new_typeArray(elt_type, length, CHECK); - thread->set_vm_result(obj); - // This is pretty rare but this runtime patch is stressful to deoptimization - // if we deoptimize here so force a deopt to stress the path. - if (DeoptimizeALot) { - deopt_caller(); - } - -JRT_END - - -JRT_ENTRY(void, GraalRuntime::new_object_array(JavaThread* thread, Klass* array_klass, jint length)) +JRT_ENTRY(void, GraalRuntime::new_array(JavaThread* thread, Klass* array_klass, jint length)) // Note: no handle for klass needed since they are not used // anymore after new_objArray() and no GC can happen before. // (This may have to change if this code changes!) assert(array_klass->is_klass(), "not a class"); - Klass* elem_klass = ObjArrayKlass::cast(array_klass)->element_klass(); - objArrayOop obj = oopFactory::new_objArray(elem_klass, length, CHECK); + oop obj; + if (array_klass->oop_is_typeArray()) { + BasicType elt_type = TypeArrayKlass::cast(array_klass)->element_type(); + obj = oopFactory::new_typeArray(elt_type, length, CHECK); + } else { + Klass* elem_klass = ObjArrayKlass::cast(array_klass)->element_klass(); + obj = oopFactory::new_objArray(elem_klass, length, CHECK); + } thread->set_vm_result(obj); // This is pretty rare but this runtime patch is stressful to deoptimization // if we deoptimize here so force a deopt to stress the path. diff -r ae69cd8c08a9 -r 6c46172c04bf src/share/vm/graal/graalRuntime.hpp --- a/src/share/vm/graal/graalRuntime.hpp Fri Dec 07 16:01:38 2012 +0100 +++ b/src/share/vm/graal/graalRuntime.hpp Fri Dec 07 18:26:26 2012 +0100 @@ -80,8 +80,7 @@ #define GRAAL_STUBS(stub, last_entry) \ stub(graal_register_finalizer) \ stub(graal_new_instance) \ - stub(graal_new_type_array) \ - stub(graal_new_object_array) \ + stub(graal_new_array) \ stub(graal_new_multi_array) \ stub(graal_handle_exception_nofpu) /* optimized version that does not preserve fpu registers */ \ stub(graal_slow_subtype_check) \ @@ -128,12 +127,11 @@ Register arg1 = noreg, Register arg2 = noreg, Register arg3 = noreg); // runtime entry points - static void new_instance (JavaThread* thread, Klass* klass); - static void new_type_array (JavaThread* thread, Klass* klass, jint length); - static void new_object_array(JavaThread* thread, Klass* klass, jint length); - static void new_multi_array (JavaThread* thread, Klass* klass, int rank, jint* dims); + static void new_instance(JavaThread* thread, Klass* klass); + static void new_array(JavaThread* thread, Klass* klass, jint length); + static void new_multi_array(JavaThread* thread, Klass* klass, int rank, jint* dims); - static void unimplemented_entry (JavaThread* thread, StubID id); + static void unimplemented_entry(JavaThread* thread, StubID id); static address exception_handler_for_pc(JavaThread* thread);