address AbstractInterpreterGenerator::generate_result_handler_for(BasicType type) { // // Registers alive // R3_RET // LR // // Registers updated // R3_RET // Label done; address entry = __ pc(); switch (type) { case T_BOOLEAN: // convert !=0 to 1 __ neg(R0, R3_RET); __ orr(R0, R3_RET, R0); __ srwi(R3_RET, R0, 31); break; case T_BYTE: // sign extend 8 bits __ extsb(R3_RET, R3_RET); break; case T_CHAR: // zero extend 16 bits __ clrldi(R3_RET, R3_RET, 48); break; case T_SHORT: // sign extend 16 bits __ extsh(R3_RET, R3_RET); break; case T_INT: // sign extend 32 bits __ extsw(R3_RET, R3_RET); break; case T_LONG: break; case T_OBJECT: // unbox result if not null __ cmpdi(CCR0, R3_RET, 0); __ beq(CCR0, done); __ ld(R3_RET, 0, R3_RET); __ verify_oop(R3_RET); break; case T_FLOAT: break; case T_DOUBLE: break; case T_VOID: break; default: ShouldNotReachHere(); } __ BIND(done); __ blr(); return entry; }
address CppInterpreterGenerator::generate_result_handler_for(BasicType type) { address start = __ pc(); switch (type) { case T_VOID: break; case T_BOOLEAN: { Label zero; __ compare (r3, 0); __ beq (zero); __ load (r3, 1); __ bind (zero); } break; case T_CHAR: __ andi_ (r3, r3, 0xffff); break; case T_BYTE: __ extsb (r3, r3); break; case T_SHORT: __ extsh (r3, r3); break; case T_INT: #ifdef PPC64 __ extsw (r3, r3); #endif break; case T_LONG: case T_FLOAT: case T_DOUBLE: break; case T_OBJECT: __ load (r3, STATE(_oop_temp)); __ verify_oop (r3); break; default: ShouldNotReachHere(); } __ blr (); return start; }