# HG changeset patch # User Jin # Date 1462482275 14400 # Node ID ef5b28e8d433b0b76f2adf9243ad3152fa385382 # Parent 26621fe12c4880a3d4a49025053ff89e7f084f4f TemplateTable::fast_xaccess(): fix unaligned lhu BCP and offset may both be unaligned. Two LBU are required. public class List { public List next; public void insert() { List p = new List(); p.next = this.next; } public static void main(String[] args) throws Exception { List th = new List(); while(true) th.insert(); } } Effect: - -Xint: 0 unaligned access diff -r 26621fe12c48 -r ef5b28e8d433 src/cpu/mips/vm/assembler_mips.cpp --- a/src/cpu/mips/vm/assembler_mips.cpp Thu May 05 14:53:07 2016 -0400 +++ b/src/cpu/mips/vm/assembler_mips.cpp Thu May 05 17:04:35 2016 -0400 @@ -3277,22 +3277,17 @@ void MacroAssembler::load_two_bytes_from_at_bcp(Register reg, Register tmp, int offset) { - - if(offset & 1){ - lbu(reg, BCP, offset+1); - lbu(tmp, BCP, offset); + /* 2016/5/6 Jin: the runtime address of BCP may be unaligned. + * Refer to the SPARC implementation. */ + lbu(reg, BCP, offset+1); + lbu(tmp, BCP, offset); #ifdef _LP64 -//FIXME aoqi. indexbyte1 << 8 | indexbyte2? - //dsll(tmp, tmp, 8); - dsll(reg, reg, 8); - daddu(reg, tmp, reg); + dsll(reg, reg, 8); + daddu(reg, tmp, reg); #else - sll(reg, reg, 8); - addu(reg, tmp, reg); + sll(reg, reg, 8); + addu(reg, tmp, reg); #endif - } - else - lhu(reg, BCP, offset); } void MacroAssembler::store_two_byts_to_at_bcp(Register reg, Register tmp, int offset)