void IndexedAddress::fill_in_address_register() { if (index()->is_immediate()) { MemoryAddress::fill_in_address_register(); } else { if (index_shift() != 0) { code_generator()->lsl_imm5(address_register(), index()->lo_register(), index_shift()); code_generator()->add(address_register(), fixed_register(), address_register()); } else { code_generator()->add(address_register(), fixed_register(), index()->lo_register()); } } }
bool IndexedAddress::has_fixed_offset(jint& fixed_offset) { if (index()->is_immediate()) { fixed_offset = (index()->as_int() << index_shift()); return true; } else { return false; } }
BinaryAssembler::Address IndexedAddress::compute_address_for(jint address_offset) { if (index()->is_immediate()) { // [ base + displacement ] return BinaryAssembler::Address(array()->lo_register(), address_offset + Array::base_offset() + (index()->as_int() << index_shift())); } else { // [ base + index * scale + displacement ] BinaryAssembler::ScaleFactor scale_factor = (BinaryAssembler::ScaleFactor) index_shift(); return BinaryAssembler::Address(array()->lo_register(), index()->lo_register(), scale_factor, address_offset + Array::base_offset()); } }
void IndexedAddress::fill_in_address_register() { if (index()->is_immediate()) { MemoryAddress::fill_in_address_register(); } else { code_generator()->add(address_register(), fixed_register(), Assembler::imm_shift(index()->lo_register(), Assembler::lsl, index_shift())); } }