vm: fix instruction_operand::load_value() for PowerPC relocation classes
parent
235ad395c2
commit
514043eb14
|
@ -16,11 +16,11 @@ fixnum instruction_operand::load_value_2_2()
|
|||
}
|
||||
|
||||
/* Load a value from a bitfield of a PowerPC instruction */
|
||||
fixnum instruction_operand::load_value_masked(cell mask, fixnum shift)
|
||||
fixnum instruction_operand::load_value_masked(cell mask, cell bits, cell shift)
|
||||
{
|
||||
cell *ptr = (cell *)pointer;
|
||||
fixnum *ptr = (fixnum *)pointer;
|
||||
|
||||
return (*ptr & mask) << shift;
|
||||
return (((*ptr & mask) << bits) >> bits) << shift;
|
||||
}
|
||||
|
||||
fixnum instruction_operand::load_value(cell relative_to)
|
||||
|
@ -36,17 +36,17 @@ fixnum instruction_operand::load_value(cell relative_to)
|
|||
case RC_ABSOLUTE_PPC_2_2:
|
||||
return load_value_2_2();
|
||||
case RC_ABSOLUTE_PPC_2:
|
||||
return load_value_masked(rel_absolute_ppc_2_mask,0);
|
||||
return load_value_masked(rel_absolute_ppc_2_mask,0,0);
|
||||
case RC_RELATIVE_PPC_2:
|
||||
return load_value_masked(rel_relative_ppc_2_mask,0) + relative_to;
|
||||
return load_value_masked(rel_relative_ppc_2_mask,16,0) + relative_to;
|
||||
case RC_RELATIVE_PPC_3:
|
||||
return load_value_masked(rel_relative_ppc_3_mask,0) + relative_to;
|
||||
return load_value_masked(rel_relative_ppc_3_mask,10,0) + relative_to;
|
||||
case RC_RELATIVE_ARM_3:
|
||||
return load_value_masked(rel_relative_arm_3_mask,2) + relative_to + sizeof(cell) * 2;
|
||||
return load_value_masked(rel_relative_arm_3_mask,10,2) + relative_to + sizeof(cell) * 2;
|
||||
case RC_INDIRECT_ARM:
|
||||
return load_value_masked(rel_indirect_arm_mask,0) + relative_to + sizeof(cell);
|
||||
return load_value_masked(rel_indirect_arm_mask,20,0) + relative_to + sizeof(cell);
|
||||
case RC_INDIRECT_ARM_PC:
|
||||
return load_value_masked(rel_indirect_arm_mask,0) + relative_to + sizeof(cell) * 2;
|
||||
return load_value_masked(rel_indirect_arm_mask,20,0) + relative_to + sizeof(cell) * 2;
|
||||
default:
|
||||
critical_error("Bad rel class",rel.rel_class());
|
||||
return 0;
|
||||
|
@ -77,7 +77,7 @@ void instruction_operand::store_value_2_2(fixnum value)
|
|||
}
|
||||
|
||||
/* Store a value into a bitfield of a PowerPC instruction */
|
||||
void instruction_operand::store_value_masked(fixnum value, cell mask, fixnum shift)
|
||||
void instruction_operand::store_value_masked(fixnum value, cell mask, cell shift)
|
||||
{
|
||||
cell *ptr = (cell *)pointer;
|
||||
|
||||
|
|
|
@ -148,14 +148,14 @@ struct instruction_operand {
|
|||
}
|
||||
|
||||
fixnum load_value_2_2();
|
||||
fixnum load_value_masked(cell mask, fixnum shift);
|
||||
fixnum load_value_masked(cell mask, cell bits, cell shift);
|
||||
fixnum load_value(cell relative_to);
|
||||
fixnum load_value();
|
||||
code_block *load_code_block(cell relative_to);
|
||||
code_block *load_code_block();
|
||||
|
||||
void store_value_2_2(fixnum value);
|
||||
void store_value_masked(fixnum value, cell mask, fixnum shift);
|
||||
void store_value_masked(fixnum value, cell mask, cell shift);
|
||||
void store_value(fixnum value);
|
||||
void store_code_block(code_block *compiled);
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue