From 174e2f5f3db0ed22a59a4ae6cdadd852d0c7cdd3 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Wed, 2 Dec 2009 09:20:33 -0500 Subject: [PATCH] vm: fix instruction_operand::load_value() for PowerPC relocation classes --- vm/instruction_operands.cpp | 20 ++++++++++---------- vm/instruction_operands.hpp | 4 ++-- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/vm/instruction_operands.cpp b/vm/instruction_operands.cpp index e00954b67c..c197a399fa 100644 --- a/vm/instruction_operands.cpp +++ b/vm/instruction_operands.cpp @@ -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; diff --git a/vm/instruction_operands.hpp b/vm/instruction_operands.hpp index 12ac39bb7d..c403428206 100644 --- a/vm/instruction_operands.hpp +++ b/vm/instruction_operands.hpp @@ -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); };