struct { \
uint8_t op; \
union { \
- uint16_t imm16; \
- int16_t imm16s; \
- }; \
+ uint16_t u; \
+ int16_t s; \
+ } imm16; \
uint8_t b; \
uint8_t a; \
} (instr) = { \
.op = extract32((code), 0, 6), \
- .imm16 = extract32((code), 6, 16), \
+ .imm16.u = extract32((code), 6, 16), \
.b = extract32((code), 22, 5), \
.a = extract32((code), 27, 5), \
}
data = tcg_temp_new();
}
- tcg_gen_addi_tl(addr, load_gpr(dc, instr.a), instr.imm16s);
+ tcg_gen_addi_tl(addr, load_gpr(dc, instr.a), instr.imm16.s);
tcg_gen_qemu_ld_tl(data, addr, dc->mem_idx, flags);
if (unlikely(instr.b == R_ZERO)) {
TCGv val = load_gpr(dc, instr.b);
TCGv addr = tcg_temp_new();
- tcg_gen_addi_tl(addr, load_gpr(dc, instr.a), instr.imm16s);
+ tcg_gen_addi_tl(addr, load_gpr(dc, instr.a), instr.imm16.s);
tcg_gen_qemu_st_tl(val, addr, dc->mem_idx, flags);
tcg_temp_free(addr);
}
{
I_TYPE(instr, code);
- gen_goto_tb(dc, 0, dc->pc + 4 + (instr.imm16s & -4));
+ gen_goto_tb(dc, 0, dc->pc + 4 + (instr.imm16.s & -4));
dc->is_jmp = DISAS_TB_JUMP;
}
tcg_gen_brcond_tl(flags, dc->cpu_R[instr.a], dc->cpu_R[instr.b], l1);
gen_goto_tb(dc, 0, dc->pc + 4);
gen_set_label(l1);
- gen_goto_tb(dc, 1, dc->pc + 4 + (instr.imm16s & -4));
+ gen_goto_tb(dc, 1, dc->pc + 4 + (instr.imm16.s & -4));
dc->is_jmp = DISAS_TB_JUMP;
}
(op3)); \
}
-gen_i_cmpxx(gen_cmpxxsi, instr.imm16s)
-gen_i_cmpxx(gen_cmpxxui, instr.imm16)
+gen_i_cmpxx(gen_cmpxxsi, instr.imm16.s)
+gen_i_cmpxx(gen_cmpxxui, instr.imm16.u)
/* Math/logic instructions */
#define gen_i_math_logic(fname, insn, resimm, op3) \
} \
}
-gen_i_math_logic(addi, addi, 1, instr.imm16s)
-gen_i_math_logic(muli, muli, 0, instr.imm16s)
+gen_i_math_logic(addi, addi, 1, instr.imm16.s)
+gen_i_math_logic(muli, muli, 0, instr.imm16.s)
-gen_i_math_logic(andi, andi, 0, instr.imm16)
-gen_i_math_logic(ori, ori, 1, instr.imm16)
-gen_i_math_logic(xori, xori, 1, instr.imm16)
+gen_i_math_logic(andi, andi, 0, instr.imm16.u)
+gen_i_math_logic(ori, ori, 1, instr.imm16.u)
+gen_i_math_logic(xori, xori, 1, instr.imm16.u)
-gen_i_math_logic(andhi, andi, 0, instr.imm16 << 16)
-gen_i_math_logic(orhi , ori, 1, instr.imm16 << 16)
-gen_i_math_logic(xorhi, xori, 1, instr.imm16 << 16)
+gen_i_math_logic(andhi, andi, 0, instr.imm16.u << 16)
+gen_i_math_logic(orhi , ori, 1, instr.imm16.u << 16)
+gen_i_math_logic(xorhi, xori, 1, instr.imm16.u << 16)
/* Prototype only, defined below */
static void handle_r_type_instr(DisasContext *dc, uint32_t code,