Index: vm/jitrino/src/jet/cg_br.cpp =================================================================== --- vm/jitrino/src/jet/cg_br.cpp (revision 606184) +++ vm/jitrino/src/jet/cg_br.cpp (working copy) @@ -223,18 +223,19 @@ AR gr_tabl = valloc(jobj); movp(gr_tabl, DATA_SWITCH_TABLE | m_curr_inst->pc, m_bbinfo->start); #ifdef _EM64T_ - // On EM64T, we operate with int32 value in a register, but the - // register will be used as 64 bit in address form - have to extend - sx(Opnd(i64, val.reg()), Opnd(i32, val.reg())); -#endif // Here, we need to extract 'index-=low()' - can pack this into // complex address form: // [table + index*sizeof(void*) - low()*sizeof(void*)], - // but only if low()*sizeof(void*) does fit into displacement ... + // but only if low()*sizeof(void*) does fit into 32 bits displacement ... int tmp = -jinst.low(); const int LO_BOUND = INT_MIN/(int)sizeof(void*); const int UP_BOUND = INT_MAX/(int)sizeof(void*); if (LO_BOUND<=tmp && tmp<=UP_BOUND) { + // On EM64T, we operate with int32 value in a register, but the + // register will be used as 64 bit in address form - have to extend + if (jinst.low() < 0) { + sx(Opnd(i64, val.reg()), Opnd(i32, val.reg())); + } ld(jobj, gr_tabl, gr_tabl, -jinst.low()*sizeof(void*), val.reg(), sizeof(void*)); } @@ -251,6 +252,10 @@ alu(alu_sub, val, jinst.low()); ld(jobj, gr_tabl, gr_tabl, 0, val.reg(), sizeof(void*)); } +#else + ld(jobj, gr_tabl, gr_tabl, -jinst.low()*sizeof(void*), + val.reg(), sizeof(void*)); +#endif runlock(val); br(gr_tabl); }