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;
  }
}
Example #3
0
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());
  }
}
Example #4
0
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()));
  }
}