static void tcg_out_jxx(TCGContext *s, int opc, int label_index) { int32_t val, val1; TCGLabel *l = &s->labels[label_index]; if (l->has_value) { val = l->u.value - (tcg_target_long)s->code_ptr; val1 = val - 2; if ((int8_t)val1 == val1) { if (opc == -1) tcg_out8(s, 0xeb); else tcg_out8(s, 0x70 + opc); tcg_out8(s, val1); } else { if (opc == -1) { tcg_out8(s, 0xe9); tcg_out32(s, val - 5); } else { tcg_out8(s, 0x0f); tcg_out8(s, 0x80 + opc); tcg_out32(s, val - 6); } } } else { if (opc == -1) { tcg_out8(s, 0xe9); } else { tcg_out8(s, 0x0f); tcg_out8(s, 0x80 + opc); } tcg_out_reloc(s, s->code_ptr, R_386_PC32, label_index, -4); s->code_ptr += 4; } }
/* Write label. */ static void tci_out_label(TCGContext *s, TCGLabel *label) { if (label->has_value) { tcg_out_i(s, label->u.value); assert(label->u.value); } else { tcg_out_reloc(s, s->code_ptr, sizeof(tcg_target_ulong), label, 0); s->code_ptr += sizeof(tcg_target_ulong); } }