221 switch (iptr->
flags.fields.condition) {
314 vm_abort(
"emit_branch: unknown condition %d", condition);
396 vm_abort(
"emit_classcast_check: unknown condition %d", condition);
479 mcode = *((uint16_t *) cd->
mcodeptr);
541 syncslot_offset += (INT_ARG_CNT +
FLT_ARG_CNT) * 8;
634 #if defined(ENABLE_PROFILING)
646 #if defined(ENABLE_PROFILING)
658 #if defined(ENABLE_PROFILING)
678 #if defined(ENABLE_PROFILING)
914 if ((basereg ==
REG_SP) || (basereg ==
R12)) {
930 }
else if ((disp) == 0 && (basereg) !=
RBP && (basereg) !=
R13) {
933 }
else if ((basereg) ==
RIP) {
952 if ((basereg ==
REG_SP) || (basereg ==
R12)) {
971 else if ((disp == 0) && (basereg !=
RBP) && (basereg !=
R13)) {
1246 assert(length >= 1 && length <= 9);
1317 int x = disp < 9 ? disp : 9;
1334 *(cd->
mcodeptr++) = 0xb8 + ((reg) & 0x07);
1349 *(cd->
mcodeptr++) = 0xb8 + ((reg) & 0x07);
1421 emit_rex(1,(reg),(indexreg),(basereg));
1423 emit_memindex(cd, (reg),(disp),(basereg),(indexreg),(scale));
1428 emit_rex(0,(reg),(indexreg),(basereg));
1430 emit_memindex(cd, (reg),(disp),(basereg),(indexreg),(scale));
1435 emit_rex(1,(reg),(indexreg),(basereg));
1437 emit_memindex(cd, (reg),(disp),(basereg),(indexreg),(scale));
1442 emit_rex(0,(reg),(indexreg),(basereg));
1444 emit_memindex(cd, (reg),(disp),(basereg),(indexreg),(scale));
1450 emit_rex(0,(reg),(indexreg),(basereg));
1452 emit_memindex(cd, (reg),(disp),(basereg),(indexreg),(scale));
1459 emit_memindex(cd, (reg),(disp),(basereg),(indexreg),(scale));
1547 emit_rex(1,(reg),(indexreg),(basereg));
1550 emit_memindex(cd, (reg),(disp),(basereg),(indexreg),(scale));
1555 emit_rex(1,(reg),(indexreg),(basereg));
1558 emit_memindex(cd, (reg),(disp),(basereg),(indexreg),(scale));
1563 emit_rex(1,(reg),(indexreg),(basereg));
1566 emit_memindex(cd, (reg),(disp),(basereg),(indexreg),(scale));
1572 emit_rex(1,0,(indexreg),(basereg));
1581 emit_rex(0,0,(indexreg),(basereg));
1591 emit_rex(0,0,(indexreg),(basereg));
1600 emit_rex(0,0,(indexreg),(basereg));
1622 *(cd->
mcodeptr++) = (((opc)) << 3) + 1;
1630 *(cd->
mcodeptr++) = (((opc)) << 3) + 1;
1638 *(cd->
mcodeptr++) = (((opc)) << 3) + 1;
1646 *(cd->
mcodeptr++) = (((opc)) << 3) + 1;
1654 *(cd->
mcodeptr++) = (((opc)) << 3) + 3;
1662 *(cd->
mcodeptr++) = (((opc)) << 3) + 3;
1746 emit_rex(1,(reg),(indexreg),(basereg));
1747 *(cd->
mcodeptr++) = (((opc)) << 3) + 3;
1748 emit_memindex(cd, (reg),(disp),(basereg),(indexreg),(scale));
1753 emit_rex(0,(reg),(indexreg),(basereg));
1754 *(cd->
mcodeptr++) = (((opc)) << 3) + 3;
1755 emit_memindex(cd, (reg),(disp),(basereg),(indexreg),(scale));
2089 *(cd->
mcodeptr++) = (0x80 + (opc));
2102 *(cd->
mcodeptr++) = (0x40 | (((reg) >> 3) & 0x01));
2104 *(cd->
mcodeptr++) = (0x90 + (opc));
2112 *(cd->
mcodeptr++) = (0x40 | (((basereg) >> 3) & 0x01));
2114 *(cd->
mcodeptr++) = (0x90 + (opc));
2123 *(cd->
mcodeptr++) = (0x40 + (opc));
2132 *(cd->
mcodeptr++) = (0x40 + (opc));
2155 *(cd->
mcodeptr++) = 0x50 + (0x07 & (reg));
2167 *(cd->
mcodeptr++) = 0x58 + (0x07 & (reg));
2363 emit_rex(0,(reg),(indexreg),(basereg));
2366 emit_memindex(cd, (reg),(disp),(basereg),(indexreg),(scale));
2390 emit_rex(0,(dreg),(indexreg),(basereg));
2393 emit_memindex(cd, (dreg),(disp),(basereg),(indexreg),(scale));
2562 emit_rex(0,(reg),(indexreg),(basereg));
2565 emit_memindex(cd, (reg),(disp),(basereg),(indexreg),(scale));
2571 emit_rex(0,(reg),(indexreg),(basereg));
2574 emit_memindex(cd, (reg),(disp),(basereg),(indexreg),(scale));
2580 emit_rex(0,(dreg),(indexreg),(basereg));
2583 emit_memindex(cd, (dreg),(disp),(basereg),(indexreg),(scale));
2589 emit_rex(0,(dreg),(indexreg),(basereg));
2592 emit_memindex(cd, (dreg),(disp),(basereg),(indexreg),(scale));
const s4 abi_registers_float_argument[]
void emit_incq_reg(codegendata *cd, s8 reg)
void emit_ucomisd_reg_reg(codegendata *cd, s8 reg, s8 dreg)
void emit_imul_membase_reg(codegendata *cd, s4 basereg, s4 disp, s4 dreg)
void emit_jmp_imm2(codegendata *cd, s8 imm)
void emit_test_reg_reg(codegendata *cd, s4 reg, s4 dreg)
void emit_mfence(codegendata *cd)
void emit_imull_reg_reg(codegendata *cd, s8 reg, s8 dreg)
void emit_movsd_reg_reg(codegendata *cd, s8 reg, s8 dreg)
dummy_java_lang_Class object
void emit_imul_imm_membase_reg(codegendata *cd, s4 imm, s4 basereg, s4 disp, s4 dreg)
void emit_neg_reg(codegendata *cd, s4 reg)
void emit_setcc_reg(codegendata *cd, s4 opc, s4 reg)
void emit_mov_reg_memindex(codegendata *cd, s4 reg, s4 disp, s4 basereg, s4 indexreg, s4 scale)
#define M_CMOVGE(a, b, c)
#define M_ALD(a, b, disp)
void emit_shiftl_reg(codegendata *cd, s8 opc, s8 reg)
void emit_mov_membase_reg(codegendata *cd, s4 basereg, s4 disp, s4 reg)
void emit_monitor_exit(jitdata *jd, int32_t syncslot_offset)
Generates synchronization code to leave a monitor.
#define M_LST(a, b, disp)
void emit_push_reg(codegendata *cd, s4 reg)
void emit_movw_reg_memindex(codegendata *cd, s4 reg, s4 disp, s4 basereg, s4 indexreg, s4 scale)
void emit_mov_membase32_reg(codegendata *cd, s4 basereg, s4 disp, s4 reg)
#define JITDATA_HAS_FLAG_VERBOSECALL(jd)
void emit_alul_membase_reg(codegendata *cd, s8 opc, s8 basereg, s8 disp, s8 reg)
void emit_movlps_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg)
void emit_ucomiss_reg_reg(codegendata *cd, s8 reg, s8 dreg)
#define M_ILD(a, b, disp)
void emit_alu_membase_reg(codegendata *cd, s4 opc, s4 basereg, s4 disp, s4 reg)
void emit_ishift(jitdata *jd, s4 shift_op, instruction *iptr)
void emit_movzbq_reg_reg(codegendata *cd, s8 reg, s8 dreg)
void emit_alul_imm_reg(codegendata *cd, s8 opc, s8 imm, s8 dreg)
void emit_cvtsd2ss_reg_reg(codegendata *cd, s8 reg, s8 dreg)
void emit_addsd_reg_reg(codegendata *cd, s8 reg, s8 dreg)
#define M_IST(a, b, disp)
void emit_mov_mem_reg(codegendata *cd, s4 mem, s4 dreg)
void emit_push_imm(codegendata *cd, s4 imm)
void emit_imull_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg)
static void emit_memindex(codegendata *cd, s4 reg, s4 disp, s4 basereg, s4 indexreg, s4 scale)
void emit_monitor_enter(jitdata *jd, int32_t syncslot_offset)
Generates synchronization code to enter a monitor.
void emit_testb_imm_reg(codegendata *cd, s8 imm, s8 reg)
static void emit_membase(codegendata *cd, s4 basereg, s4 disp, s4 dreg)
const s4 abi_registers_integer_argument[]
void emit_negl_reg(codegendata *cd, s8 reg)
#define M_AADD_IMM(a, b, c)
void emit_shiftl_membase(codegendata *cd, s8 opc, s8 basereg, s8 disp)
void emit_movlps_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp)
s4 codegen_reg_of_var(u2 opcode, varinfo *v, s4 tempregnum)
void emit_xchg_reg_reg(codegendata *cd, s8 reg, s8 dreg)
void emit_mov_reg_membase32(codegendata *cd, s4 reg, s4 basereg, s4 disp)
void emit_mov_imm_memindex(codegendata *cd, s4 imm, s4 disp, s4 basereg, s4 indexreg, s4 scale)
#define BRANCH_UNCONDITIONAL
void emit_movb_imm_memindex(codegendata *cd, s4 imm, s4 disp, s4 basereg, s4 indexreg, s4 scale)
void emit_alu_reg_reg(codegendata *cd, s4 opc, s4 reg, s4 dreg)
void emit_movl_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg)
void emit_cvttsd2si_reg_reg(codegendata *cd, s8 reg, s8 dreg)
void emit_movl_imm_membase32(codegendata *cd, s8 imm, s8 basereg, s8 disp)
void emit_movsd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg)
void emit_alul_reg_reg(codegendata *cd, s8 opc, s8 reg, s8 dreg)
void emit_movd_reg_freg(codegendata *cd, s8 reg, s8 freg)
#define emit_byte_rex(reg, index, rm)
void emit_arraystore_check(codegendata *cd, instruction *iptr)
#define BRANCH_UNCONDITIONAL_SIZE
#define M_FST(a, b, disp)
void emit_arbitrary_nop(codegendata *cd, int disp)
#define M_FLD(a, b, disp)
void emit_movl_imm_reg(codegendata *cd, s8 imm, s8 reg)
#define M_IADD_MEMBASE(a, b, c)
void trace_java_call_exit(methodinfo *m, uint64_t *return_regs)
void emit_movsbq_reg_reg(codegendata *cd, s8 reg, s8 dreg)
void emit_shift_imm_membase(codegendata *cd, s8 opc, s8 imm, s8 basereg, s8 disp)
void emit_jmp_reg(codegendata *cd, s4 reg)
void emit_xorps_reg_reg(codegendata *cd, s8 reg, s8 dreg)
void emit_idivl_reg(codegendata *cd, s8 reg)
void emit_alu_imm_membase(codegendata *cd, s4 opc, s4 imm, s4 basereg, s4 disp)
void emit_call_imm(codegendata *cd, s4 imm)
void emit_movsd_membase32_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg)
JNIEnv jthread jobject jclass jlong size
#define M_IADC_MEMBASE(a, b, c)
void emit_abstractmethoderror_trap(codegendata *cd)
void emit_testl_reg_reg(codegendata *cd, s8 reg, s8 dreg)
void emit_movlpd_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp)
void emit_cvtsi2ss_reg_reg(codegendata *cd, s8 reg, s8 dreg)
void emit_shiftl_imm_membase(codegendata *cd, s8 opc, s8 imm, s8 basereg, s8 disp)
static int code_is_leafmethod(codeinfo *code)
void emit_movl_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale)
void emit_setcc_membase(codegendata *cd, s4 opc, s4 basereg, s4 disp)
void emit_movsd_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 dreg)
void emit_cmovccl_reg_reg(codegendata *cd, s4 opc, s4 reg, s4 dreg)
#define M_CMOVLE(a, b, c)
void vm_abort(const char *text,...)
void emit_fastpath_monitor_enter(jitdata *jd, instruction *iptr, int d)
Generates fast-path code for the below builtin.
void emit_imul_imm_reg(codegendata *cd, s4 imm, s4 dreg)
void emit_verbosecall_enter(jitdata *jd)
void emit_movq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg)
void emit_exception_check(codegendata *cd, instruction *iptr)
#define M_CMOVNE(a, b, c)
#define emit_reg(reg, rm)
void emit_test_imm_reg(codegendata *cd, s4 imm, s4 reg)
void trace_java_call_enter(methodinfo *m, uint64_t *arg_regs, uint64_t *stack)
void emit_subss_reg_reg(codegendata *cd, s8 reg, s8 dreg)
void emit_call_reg(codegendata *cd, s4 reg)
void emit_alul_imm32_reg(codegendata *cd, s4 opc, s4 imm, s4 dreg)
void emit_movsd_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale)
void emit_movb_reg_memindex(codegendata *cd, s4 reg, s4 disp, s4 basereg, s4 indexreg, s4 scale)
void emit_imul_reg_reg(codegendata *cd, s4 reg, s4 dreg)
void emit_cvtsi2sdq_reg_reg(codegendata *cd, s8 reg, s8 dreg)
#define M_IINC_MEMBASE(a, b)
void emit_movss_reg_reg(codegendata *cd, s8 reg, s8 dreg)
void emit_incq_membase(codegendata *cd, s8 basereg, s8 disp)
void emit_movl_imm_membase(codegendata *cd, s8 imm, s8 basereg, s8 disp)
void emit_movss_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale)
#define LOCK_monitor_enter
void emit_alul_reg_membase(codegendata *cd, s8 opc, s8 reg, s8 basereg, s8 disp)
void emit_alul_memindex_reg(codegendata *cd, s8 opc, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg)
void emit_mov_imm_membase32(codegendata *cd, s4 imm, s4 basereg, s4 disp)
void emit_cqto(codegendata *cd)
#define M_CMOVLT(a, b, c)
void emit_shift_reg(codegendata *cd, s4 opc, s4 reg)
void emit_cvtsi2ssq_reg_reg(codegendata *cd, s8 reg, s8 dreg)
void emit_trap_compiler(codegendata *cd)
void emit_imul_imm_reg_reg(codegendata *cd, s4 imm, s4 reg, s4 dreg)
void emit_incl_membase(codegendata *cd, s8 basereg, s8 disp)
#define M_ASUB_IMM(a, b, c)
void emit_trap(codegendata *cd, u1 Xd, int type)
void emit_xorpd_reg_reg(codegendata *cd, s8 reg, s8 dreg)
void emit_movsbq_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg)
s4 emit_load(jitdata *jd, instruction *iptr, varinfo *src, s4 tempreg)
void emit_mulss_reg_reg(codegendata *cd, s8 reg, s8 dreg)
void emit_movlpd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg)
void emit_cvttsd2siq_reg_reg(codegendata *cd, s8 reg, s8 dreg)
void emit_store(jitdata *jd, instruction *iptr, varinfo *dst, s4 d)
void emit_movd_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp)
#define M_ISBB_MEMBASE(a, b, c)
#define M_AST(a, b, disp)
void emit_cltd(codegendata *cd)
union instruction::@12 sx
void emit_mov_imm_reg(codegendata *cd, s4 imm, s4 reg)
void emit_fastpath_monitor_exit(jitdata *jd, instruction *iptr, int d)
Generates fast-path code for the below builtin.
void emit_arithmetic_check(codegendata *cd, instruction *iptr, s4 reg)
void emit_mov_memindex_reg(codegendata *cd, s4 disp, s4 basereg, s4 indexreg, s4 scale, s4 reg)
void emit_testw_imm_reg(codegendata *cd, s8 imm, s8 reg)
void emit_alu_reg_membase(codegendata *cd, s4 opc, s4 reg, s4 basereg, s4 disp)
#define LOCK_monitor_exit
void emit_movl_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg)
void emit_mov_reg_reg(codegendata *cd, s4 reg, s4 dreg)
#define M_LSUB_IMM(a, b, c)
void emit_icmp_imm(codegendata *cd, int reg, int32_t value)
Emits code comparing a single register.
void emit_copy(jitdata *jd, instruction *iptr)
#define M_LADD_IMM(a, b, c)
void emit_alu_imm_reg(codegendata *cd, s4 opc, s4 imm, s4 dreg)
void emit_movss_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 dreg)
void emit_cvtss2sd_reg_reg(codegendata *cd, s8 reg, s8 dreg)
void emit_movd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg)
void emit_alu_memindex_reg(codegendata *cd, s4 opc, s4 disp, s4 basereg, s4 indexreg, s4 scale, s4 reg)
void emit_leal_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg)
void emit_movq_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp)
void emit_movq_reg_reg(codegendata *cd, s8 reg, s8 dreg)
void emit_movsd_reg_membase32(codegendata *cd, s8 reg, s8 basereg, s8 disp)
void emit_alul_imm_membase(codegendata *cd, s8 opc, s8 imm, s8 basereg, s8 disp)
void emit_nop(codegendata *cd)
static bool IS_INMEMORY(s4 flags)
void emit_jcc(codegendata *cd, s4 opc, s4 imm)
void emit_addss_reg_reg(codegendata *cd, s8 reg, s8 dreg)
void emit_cvttss2siq_reg_reg(codegendata *cd, s8 reg, s8 dreg)
void emit_movzwq_reg_reg(codegendata *cd, s8 reg, s8 dreg)
void emit_patcher_alignment(codegendata *cd)
void emit_xorps_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg)
void emit_pop_reg(codegendata *cd, s4 reg)
static void emit_membase32(codegendata *cd, s4 basereg, s4 disp, s4 dreg)
void emit_movw_imm_memindex(codegendata *cd, s4 imm, s4 disp, s4 basereg, s4 indexreg, s4 scale)
void emit_movd_reg_memindex(codegendata *cd, s8 reg, s8 disp, s8 basereg, s8 indexreg, s8 scale)
void emit_movl_reg_reg(codegendata *cd, s8 reg, s8 dreg)
void emit_divsd_reg_reg(codegendata *cd, s8 reg, s8 dreg)
void emit_mulsd_reg_reg(codegendata *cd, s8 reg, s8 dreg)
void emit_call_mem(codegendata *cd, s4 mem)
#define emit_rex(size, reg, index, rm)
void emit_mov_imm_membase(codegendata *cd, s4 imm, s4 basereg, s4 disp)
void emit_classcast_check(codegendata *cd, instruction *iptr, s4 condition, s4 reg, s4 s1)
void emit_imull_imm_membase_reg(codegendata *cd, s8 imm, s8 basereg, s8 disp, s8 dreg)
void emit_xorpd_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg)
void emit_branch(codegendata *cd, s4 disp, s4 condition, s4 reg, u4 opt)
void emit_mov_reg_membase(codegendata *cd, s4 reg, s4 basereg, s4 disp)
void emit_jmp_imm(codegendata *cd, s4 imm)
void emit_incl_reg(codegendata *cd, s8 reg)
void emit_movl_membase32_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg)
void emit_cmovcc_reg_reg(codegendata *cd, s4 opc, s4 reg, s4 dreg)
void emit_cvtsi2sd_reg_reg(codegendata *cd, s8 reg, s8 dreg)
void emit_cvttss2si_reg_reg(codegendata *cd, s8 reg, s8 dreg)
#define M_DST(a, b, disp)
struct instruction::@12::@13 s23
void emit_movslq_reg_reg(codegendata *cd, s8 reg, s8 dreg)
void emit_rdtsc(codegendata *cd)
void emit_shift_imm_reg(codegendata *cd, s4 opc, s4 imm, s4 dreg)
void emit_movss_membase32_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg)
void emit_alu_imm32_reg(codegendata *cd, s4 opc, s4 imm, s4 dreg)
void emit_movzwq_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg)
void emit_movl_reg_membase32(codegendata *cd, s8 reg, s8 basereg, s8 disp)
#define M_LLD(a, b, disp)
#define M_ISUB_MEMBASE(a, b, c)
void emit_movd_freg_reg(codegendata *cd, s8 freg, s8 reg)
#define M_ALD_MEM(a, disp)
#define emit_address_byte(mod, reg, rm)
void emit_shiftl_imm_reg(codegendata *cd, s8 opc, s8 imm, s8 dreg)
void emit_movss_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp)
void emit_arrayindexoutofbounds_check(codegendata *cd, instruction *iptr, s4 s1, s4 s2)
void emit_lshift(jitdata *jd, s4 shift_op, instruction *iptr)
#define M_DLD(a, b, disp)
void emit_shift_membase(codegendata *cd, s8 opc, s8 basereg, s8 disp)
void emit_idiv_reg(codegendata *cd, s4 reg)
void emit_verbosecall_exit(jitdata *jd)
void emit_movswq_reg_reg(codegendata *cd, s8 reg, s8 dreg)
void emit_movl_imm_memindex(codegendata *cd, s4 imm, s4 disp, s4 basereg, s4 indexreg, s4 scale)
const char const void jint length
#define M_CMOVEQ(a, b, c)
void emit_movss_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg)
#define INSTRUCTION_MUST_CHECK(iptr)
void emit_lea_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg)
#define M_CMOVGT(a, b, c)
void emit_cmovxx(codegendata *cd, instruction *iptr, s4 s, s4 d)
void emit_movss_reg_membase32(codegendata *cd, s8 reg, s8 basereg, s8 disp)
void emit_movd_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 dreg)
void emit_movsd_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp)
#define BRANCH_CONDITIONAL_SIZE
void emit_movdl_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg)
void emit_nullpointer_check(codegendata *cd, instruction *iptr, s4 reg)
void emit_divss_reg_reg(codegendata *cd, s8 reg, s8 dreg)
void emit_movswq_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg)
void emit_imull_imm_reg_reg(codegendata *cd, s8 imm, s8 reg, s8 dreg)
void emit_movl_reg_membase(codegendata *cd, s8 reg, s8 basereg, s8 disp)
void emit_subsd_reg_reg(codegendata *cd, s8 reg, s8 dreg)