void operator()(instruction_operand op) { switch(op.rel_type()) { case RT_XT: { code_block *compiled = op.load_code_block(); cell owner = compiled->owner; if(to_boolean(owner)) op.store_value(parent->compute_xt_address(owner)); break; } case RT_XT_PIC: { code_block *compiled = op.load_code_block(); cell owner = parent->code_block_owner(compiled); if(to_boolean(owner)) op.store_value(parent->compute_xt_pic_address(owner)); break; } case RT_XT_PIC_TAIL: { code_block *compiled = op.load_code_block(); cell owner = parent->code_block_owner(compiled); if(to_boolean(owner)) op.store_value(parent->compute_xt_pic_tail_address(owner)); break; } default: break; } }
void operator()(instruction_operand op) { switch(op.rel_type()) { case RT_LITERAL: op.store_value(next_literal()); break; case RT_XT: op.store_value(parent->compute_xt_address(next_literal())); break; case RT_XT_PIC: op.store_value(parent->compute_xt_pic_address(next_literal())); break; case RT_XT_PIC_TAIL: op.store_value(parent->compute_xt_pic_tail_address(next_literal())); break; case RT_HERE: op.store_value(parent->compute_here_address(next_literal(),op.rel_offset(),op.parent_code_block())); break; case RT_UNTAGGED: op.store_value(untag_fixnum(next_literal())); break; default: parent->store_external_address(op); break; } }