# HG changeset patch # User sgoldman # Date 1208441763 25200 # Node ID 9e5a7340635ed52f88abae85be5db9227721bcca # Parent d1a5218d7eafafe997268bdd987cd897edb441d4 6688137: c++ interpreter fails on 64bit sparc Summary: Misc. 64bit and endian fixes for sparc Reviewed-by: never, kvn, rasbold Contributed-by: volker.simonis@gmail.com diff -r d1a5218d7eaf -r 9e5a7340635e src/cpu/sparc/vm/bytecodeInterpreter_sparc.hpp --- a/src/cpu/sparc/vm/bytecodeInterpreter_sparc.hpp Wed Apr 16 19:19:48 2008 -0700 +++ b/src/cpu/sparc/vm/bytecodeInterpreter_sparc.hpp Thu Apr 17 07:16:03 2008 -0700 @@ -78,7 +78,7 @@ #define LOCALS_SLOT(offset) ((intptr_t*)&locals[-(offset)]) #define LOCALS_ADDR(offset) ((address)locals[-(offset)]) -#define LOCALS_INT(offset) ((jint)(locals[-(offset)])) +#define LOCALS_INT(offset) (*((jint*)&locals[-(offset)])) #define LOCALS_FLOAT(offset) (*((jfloat*)&locals[-(offset)])) #define LOCALS_OBJECT(offset) ((oop)locals[-(offset)]) #define LOCALS_DOUBLE(offset) (((VMJavaVal64*)&locals[-((offset) + 1)])->d) diff -r d1a5218d7eaf -r 9e5a7340635e src/cpu/sparc/vm/cppInterpreter_sparc.cpp --- a/src/cpu/sparc/vm/cppInterpreter_sparc.cpp Wed Apr 16 19:19:48 2008 -0700 +++ b/src/cpu/sparc/vm/cppInterpreter_sparc.cpp Thu Apr 17 07:16:03 2008 -0700 @@ -159,7 +159,7 @@ break; case T_LONG : #ifndef _LP64 -#if !defined(_LP64) && defined(COMPILER2) +#if defined(COMPILER2) // All return values are where we want them, except for Longs. C2 returns // longs in G1 in the 32-bit build whereas the interpreter wants them in O0/O1. // Since the interpreter will return longs in G1 and O0/O1 in the 32bit @@ -173,10 +173,9 @@ // native result is in O0, O1 __ st(O1, L1_scratch, 0); // Low order __ st(O0, L1_scratch, -wordSize); // High order -#endif /* !_LP64 && COMPILER2 */ +#endif /* COMPILER2 */ #else - __ stx(O0, L1_scratch, 0); -__ breakpoint_trap(); + __ stx(O0, L1_scratch, -wordSize); #endif __ sub(L1_scratch, 2*wordSize, L1_scratch); break; @@ -237,7 +236,6 @@ case T_VOID: break; break; case T_FLOAT : - __ breakpoint_trap(Assembler::zero); case T_BOOLEAN: case T_CHAR : case T_BYTE : @@ -255,11 +253,7 @@ // except we allocated one extra word for this intepretState so we won't overwrite it // when we return a two word result. #ifdef _LP64 -__ breakpoint_trap(); - // Hmm now that longs are in one entry should "_ptr" really be "x"? __ ld_ptr(O0, 0, O2); - __ ld_ptr(O0, wordSize, O3); - __ st_ptr(O3, O1, 0); __ st_ptr(O2, O1, -wordSize); #else __ ld(O0, 0, O2); @@ -319,10 +313,7 @@ // except we allocated one extra word for this intepretState so we won't overwrite it // when we return a two word result. #ifdef _LP64 -__ breakpoint_trap(); - // Hmm now that longs are in one entry should "_ptr" really be "x"? __ ld_ptr(O0, 0, O0->after_save()); - __ ld_ptr(O0, wordSize, O1->after_save()); #else __ ld(O0, wordSize, O1->after_save()); __ ld(O0, 0, O0->after_save()); @@ -1373,7 +1364,7 @@ __ delayed()->ld_ptr(L1_scratch, entry_size, L3_scratch); // now zero the slot so we can find it. - __ st(G0, L4_scratch, BasicObjectLock::obj_offset_in_bytes()); + __ st_ptr(G0, L4_scratch, BasicObjectLock::obj_offset_in_bytes()); } @@ -1713,7 +1704,7 @@ __ lduh(L4_scratch, in_bytes(methodOopDesc::size_of_parameters_offset()), L2_scratch); // get parameter size __ sll(L2_scratch, LogBytesPerWord, L2_scratch ); // parameter size in bytes __ add(L1_scratch, L2_scratch, L1_scratch); // stack destination for result - __ ld_ptr(L4_scratch, in_bytes(methodOopDesc::result_index_offset()), L3_scratch); // called method result type index + __ ld(L4_scratch, in_bytes(methodOopDesc::result_index_offset()), L3_scratch); // called method result type index // tosca is really just native abi __ set((intptr_t)CppInterpreter::_tosca_to_stack, L4_scratch); @@ -1757,7 +1748,7 @@ __ ld_ptr(STATE(_prev_link), L1_scratch); __ ld_ptr(STATE(_method), L2_scratch); // get method just executed - __ ld_ptr(L2_scratch, in_bytes(methodOopDesc::result_index_offset()), L2_scratch); + __ ld(L2_scratch, in_bytes(methodOopDesc::result_index_offset()), L2_scratch); __ tst(L1_scratch); __ brx(Assembler::zero, false, Assembler::pt, return_to_initial_caller); __ delayed()->sll(L2_scratch, LogBytesPerWord, L2_scratch); @@ -1923,10 +1914,10 @@ // compute the unused java stack size __ sub(Gargs, L1_scratch, L2_scratch); // compute unused space - // Round down the unused space to that stack is always aligned - // by making the unused space a multiple of the size of a long. + // Round down the unused space to that stack is always 16-byte aligned + // by making the unused space a multiple of the size of two longs. - __ and3(L2_scratch, -BytesPerLong, L2_scratch); + __ and3(L2_scratch, -2*BytesPerLong, L2_scratch); // Now trim the stack __ add(SP, L2_scratch, SP); @@ -2176,6 +2167,9 @@ // MUCHO HACK intptr_t* frame_bottom = interpreter_frame->sp() - (full_frame_words - frame_words); + // 'interpreter_frame->sp()' is unbiased while 'frame_bottom' must be a biased value in 64bit mode. + assert(((intptr_t)frame_bottom & 0xf) == 0, "SP biased in layout_activation"); + frame_bottom = (intptr_t*)((intptr_t)frame_bottom - STACK_BIAS); /* Now fillin the interpreterState object */ diff -r d1a5218d7eaf -r 9e5a7340635e src/share/vm/interpreter/bytecodeInterpreter.cpp --- a/src/share/vm/interpreter/bytecodeInterpreter.cpp Wed Apr 16 19:19:48 2008 -0700 +++ b/src/share/vm/interpreter/bytecodeInterpreter.cpp Thu Apr 17 07:16:03 2008 -0700 @@ -518,16 +518,16 @@ /* 0xC0 */ &&opc_checkcast, &&opc_instanceof, &&opc_monitorenter, &&opc_monitorexit, /* 0xC4 */ &&opc_wide, &&opc_multianewarray, &&opc_ifnull, &&opc_ifnonnull, -/* 0xC8 */ &&opc_goto_w, &&opc_jsr_w, &&opc_breakpoint, &&opc_fast_igetfield, -/* 0xCC */ &&opc_fastagetfield,&&opc_fast_aload_0, &&opc_fast_iaccess_0, &&opc__fast_aaccess_0, - -/* 0xD0 */ &&opc_fast_linearswitch, &&opc_fast_binaryswitch, &&opc_return_register_finalizer, &&opc_default, +/* 0xC8 */ &&opc_goto_w, &&opc_jsr_w, &&opc_breakpoint, &&opc_default, +/* 0xCC */ &&opc_default, &&opc_default, &&opc_default, &&opc_default, + +/* 0xD0 */ &&opc_default, &&opc_default, &&opc_default, &&opc_default, /* 0xD4 */ &&opc_default, &&opc_default, &&opc_default, &&opc_default, /* 0xD8 */ &&opc_default, &&opc_default, &&opc_default, &&opc_default, /* 0xDC */ &&opc_default, &&opc_default, &&opc_default, &&opc_default, /* 0xE0 */ &&opc_default, &&opc_default, &&opc_default, &&opc_default, -/* 0xE4 */ &&opc_default, &&opc_default, &&opc_default, &&opc_default, +/* 0xE4 */ &&opc_default, &&opc_return_register_finalizer, &&opc_default, &&opc_default, /* 0xE8 */ &&opc_default, &&opc_default, &&opc_default, &&opc_default, /* 0xEC */ &&opc_default, &&opc_default, &&opc_default, &&opc_default,