void insn_encode(struct insn *insn, struct buffer *buffer, struct basic_block *bb) { uint32_t encoded_insn = arm_encode_table[insn->type]; if (encoded_insn & LOAD_STORE) { if (encoded_insn & LOAD_INSN) { encoded_insn = encoded_insn | ((arm_encode_reg(mach_reg(&insn->dest.reg)) & 0xF) << 12); encoded_insn = encoded_insn | encode_base_reg_load(insn); if (!(encoded_insn & REG_OFFSET)) encoded_insn = encoded_insn | encode_imm_offset_load(insn); } else { encoded_insn = encoded_insn | ((arm_encode_reg(mach_reg(&insn->src.reg)) & 0xF) << 12); encoded_insn = encoded_insn | encode_base_reg_store(insn); if (!(encoded_insn & REG_OFFSET)) encoded_insn = encoded_insn | encode_imm_offset_store(insn); } } else if (encoded_insn & BRANCH) { encoded_insn = encoded_insn | ((emit_branch(insn, bb) >> 2) & 0xFFFFFF); } else {
static unsigned char encode_reg(struct use_position *reg) { return x86_encode_reg(mach_reg(reg)); }
static void assert_ld_insn(enum insn_type type, enum machine_reg reg, struct stack_slot *slot, struct insn *insn) { assert_int_equals(type, insn->type); assert_int_equals(reg, mach_reg(&insn->x.reg)); assert_ptr_equals(slot, insn->y.slot); }