might have finally finished reviewing the encoder.

This commit is contained in:
ed
2026-09-09 16:23:54 -04:00
parent 8912f3e0e9
commit f2a8f6d2cf
3 changed files with 112 additions and 97 deletions
+21 -9
View File
@@ -519,7 +519,7 @@ typedef Enum_(U1, X8616_Opcode) {
enum { enum {
X8616_OPCODE_BIT_WIDTH = 1, X8616_OPCODE_BIT_WIDTH = 1,
X8616_OPCODE_MASK = x8616_field_mask(0, 8), X8616_BYTE_MASK = x8616_field_mask(0, 8),
X8616_POST_OPCODE_AAM_AAD = 0b00001010, X8616_POST_OPCODE_AAM_AAD = 0b00001010,
@@ -622,12 +622,14 @@ enum {
// 00 ttt ... // 00 ttt ...
X8616_OPCODE_ALU_CLASS = 0b00,
X8616_OPCODE_ALU_CLASS_SHIFT = 6, X8616_OPCODE_ALU_CLASS_SHIFT = 6,
X8616_OPCODE_ALU_CLASS_WIDTH = 2, X8616_OPCODE_ALU_CLASS_WIDTH = 2,
X8616_OPCODE_ALU_TTT_SHIFT = 3, X8616_OPCODE_ALU_TTT_SHIFT = 3,
X8616_OPCODE_ALU_TTT_WIDTH = 3, X8616_OPCODE_ALU_TTT_WIDTH = 3,
X8616_OPCODE_ALU_OP_SHIFT = X8616_OPCODE_ALU_TTT_SHIFT, X8616_OPCODE_ALU_OP_SHIFT = X8616_OPCODE_ALU_TTT_SHIFT,
X8616_OPCODE_ALU_BIT2_SHIFT = 2, X8616_OPCODE_ALU_BIT2_SHIFT = 2,
X8616_OPCODE_ALU_RM_FORM = 0b0,
X8616_OPCODE_ALU_ACC_FORM = 0b10, X8616_OPCODE_ALU_ACC_FORM = 0b10,
X8616_OPCODE_ALU_ACC_FORM_SHIFT = 1, X8616_OPCODE_ALU_ACC_FORM_SHIFT = 1,
@@ -636,6 +638,13 @@ enum {
X8616_OPCODE_PAIR_REG_PREFIX_SHIFT = X8616_OPCODE_PAIR_SHIFT + X8616_OPCODE_PAIR_WIDTH, X8616_OPCODE_PAIR_REG_PREFIX_SHIFT = X8616_OPCODE_PAIR_SHIFT + X8616_OPCODE_PAIR_WIDTH,
X8616_OPCODE_IO_CLASS = 0b1110, X8616_OPCODE_IO_CLASS = 0b1110,
X8616_OPCODE_IO_CLASS_SHIFT = 4, X8616_OPCODE_IO_CLASS_SHIFT = 4,
X8616_OPCODE_IO_DX_SHIFT = 3,
X8616_OPCODE_IO_FIXED_SHIFT = 2,
X8616_OPCODE_IO_OUT_SHIFT = 1,
X8616_OPCODE_IO_FIXED_FORM = 0b10,
X8616_OPCODE_IO_CLASS_STEM_SHIFT = X8616_OPCODE_IO_CLASS_SHIFT - X8616_OPCODE_W_PREFIX_SHIFT,
X8616_OPCODE_IO_DX_STEM_SHIFT = X8616_OPCODE_IO_DX_SHIFT - X8616_OPCODE_W_PREFIX_SHIFT,
X8616_OPCODE_IO_OUT_STEM_SHIFT = X8616_OPCODE_IO_OUT_SHIFT - X8616_OPCODE_W_PREFIX_SHIFT,
}; };
// ============================================================================ // ============================================================================
@@ -694,30 +703,33 @@ FI_ U1 x8616_modrm_sr (U1 modrm) { return (
#define x8616_enc_vw(prefix,v,w) C_(U1, x8616_enc_vw_prefix(prefix) | x8616_enc_v(v) | x8616_enc_width(w)) #define x8616_enc_vw(prefix,v,w) C_(U1, x8616_enc_vw_prefix(prefix) | x8616_enc_v(v) | x8616_enc_width(w))
#define x8616_enc_zp(prefix,z) C_(U1, x8616_enc_z_prefix(prefix) | x8616_enc_z(z)) #define x8616_enc_zp(prefix,z) C_(U1, x8616_enc_z_prefix(prefix) | x8616_enc_z(z))
#define x8616_enc_w(prefix,w) C_(U1, x8616_enc_w_prefix(prefix) | x8616_enc_width(w)) #define x8616_enc_w(prefix,w) C_(U1, x8616_enc_w_prefix(prefix) | x8616_enc_width(w))
#define x8616_header_w(opcode,w) ((X8616_BytePattern){ x8616_enc_w((opcode), (w)), x8616_field_mask(0, 8) })
#define x8616_enc_reg(prefix,reg) C_(U1, x8616_enc_reg_prefix(prefix) | x8616_enc_opcode_reg(reg)) #define x8616_enc_reg(prefix,reg) C_(U1, x8616_enc_reg_prefix(prefix) | x8616_enc_opcode_reg(reg))
#define x8616_enc_wreg(prefix,w,reg) C_(U1, x8616_enc_wreg_prefix(prefix) | x8616_enc_wreg_width(w) | x8616_enc_opcode_reg(reg)) #define x8616_enc_wreg(prefix,w,reg) C_(U1, x8616_enc_wreg_prefix(prefix) | x8616_enc_wreg_width(w) | x8616_enc_opcode_reg(reg))
#define x8616_enc_d0(prefix,d) C_(U1, x8616_enc_d0_prefix(prefix) | x8616_enc_d(d)) #define x8616_enc_d0(prefix,d) C_(U1, x8616_enc_d0_prefix(prefix) | x8616_enc_d(d))
#define x8616_enc_sr(class,sr,low) C_(U1, ((class) << X8616_OPCODE_SR_CLASS_SHIFT) | x8616_enc_opcode_sr(sr) | (low)) #define x8616_enc_sr(class,sr,low) C_(U1, ((class) << X8616_OPCODE_SR_CLASS_SHIFT) | x8616_enc_opcode_sr(sr) | (low))
#define x8616_header_sr(class,low) ((X8616_BytePattern){ u1_(((class) << X8616_OPCODE_SR_CLASS_SHIFT) | (low)), X8616_OPCODE_SR_PATTERN_MASK })
#define x8616_header_d0(opcode) ((X8616_BytePattern){ u1_((opcode) << X8616_OPCODE_D0_PREFIX_SHIFT), X8616_OPCODE_D0_PREFIX_MASK })
#define x8616_enc_jcc(cc) C_(U1, (x8616_opcode_jcc << X8616_OPCODE_CC_PREFIX_SHIFT) | x8616_enc_cc(cc)) #define x8616_enc_jcc(cc) C_(U1, (x8616_opcode_jcc << X8616_OPCODE_CC_PREFIX_SHIFT) | x8616_enc_cc(cc))
#define x8616_enc_modrm(mod,reg,rm) C_(U1, x8616_enc_modrm_mod(mod) | x8616_enc_modrm_reg(reg) | x8616_enc_modrm_rm(rm)) #define x8616_enc_modrm(mod,reg,rm) C_(U1, x8616_enc_modrm_mod(mod) | x8616_enc_modrm_reg(reg) | x8616_enc_modrm_rm(rm))
#define x8616_enc_modrm_seg(mod,sr,rm) C_(U1, x8616_enc_modrm_mod(mod) | x8616_enc_modrm_sr(sr) | x8616_enc_modrm_rm(rm)) #define x8616_enc_modrm_seg(mod,sr,rm) C_(U1, x8616_enc_modrm_mod(mod) | x8616_enc_modrm_sr(sr) | x8616_enc_modrm_rm(rm))
#define x8616_enc_alu_class() ((0b00) << X8616_OPCODE_ALU_CLASS_SHIFT) #define x8616_header_w(opcode,w) ((X8616_BytePattern){ x8616_enc_w((opcode), (w)), X8616_BYTE_MASK })
#define x8616_header_sr(class,low) ((X8616_BytePattern){ u1_(((class) << X8616_OPCODE_SR_CLASS_SHIFT) | (low)), X8616_OPCODE_SR_PATTERN_MASK })
#define x8616_header_d0(opcode) ((X8616_BytePattern){ u1_((opcode) << X8616_OPCODE_D0_PREFIX_SHIFT), X8616_OPCODE_D0_PREFIX_MASK })
#define x8616_enc_alu_class() (X8616_OPCODE_ALU_CLASS << X8616_OPCODE_ALU_CLASS_SHIFT)
#define x8616_enc_alu_ttt(ttt) ((ttt) << X8616_OPCODE_ALU_TTT_SHIFT) #define x8616_enc_alu_ttt(ttt) ((ttt) << X8616_OPCODE_ALU_TTT_SHIFT)
#define x8616_enc_alu_op(alu) x8616_enc_alu_ttt(alu) #define x8616_enc_alu_op(alu) x8616_enc_alu_ttt(alu)
#define x8616_enc_alu_rm_r(ttt,d,w) C_(U1, x8616_enc_alu_class() | x8616_enc_alu_ttt(ttt) | (0 << X8616_OPCODE_ALU_BIT2_SHIFT) | x8616_enc_d(d) | x8616_enc_width(w)) #define x8616_enc_alu_rm_r(ttt,d,w) C_(U1, x8616_enc_alu_class() | x8616_enc_alu_ttt(ttt) | (X8616_OPCODE_ALU_RM_FORM << X8616_OPCODE_ALU_BIT2_SHIFT) | x8616_enc_d(d) | x8616_enc_width(w))
#define x8616_enc_alu_acc_i(ttt,w) C_(U1, x8616_enc_alu_class() | x8616_enc_alu_ttt(ttt) | (X8616_OPCODE_ALU_ACC_FORM << X8616_OPCODE_ALU_ACC_FORM_SHIFT) | x8616_enc_width(w)) #define x8616_enc_alu_acc_i(ttt,w) C_(U1, x8616_enc_alu_class() | x8616_enc_alu_ttt(ttt) | (X8616_OPCODE_ALU_ACC_FORM << X8616_OPCODE_ALU_ACC_FORM_SHIFT) | x8616_enc_width(w))
#define x8616_enc_io_stem(dx, out) ((X8616_OPCODE_IO_CLASS << 3) | ((dx) << 2) | 0b10 | (out)) #define x8616_enc_io_class() (X8616_OPCODE_IO_CLASS << X8616_OPCODE_IO_CLASS_STEM_SHIFT)
#define x8616_enc_io_dx(dx) ((dx) << X8616_OPCODE_IO_DX_STEM_SHIFT)
#define x8616_enc_io_out(out) ((out) << X8616_OPCODE_IO_OUT_STEM_SHIFT)
#define x8616_enc_io_stem(dx, out) (x8616_enc_io_class() | x8616_enc_io_dx(dx) | X8616_OPCODE_IO_FIXED_FORM | x8616_enc_io_out(out))
#define x8616_enc_io(dx, out, w) C_(U1, (x8616_enc_io_stem(dx, out) << X8616_OPCODE_W_PREFIX_SHIFT) | x8616_enc_width(w)) #define x8616_enc_io(dx, out, w) C_(U1, (x8616_enc_io_stem(dx, out) << X8616_OPCODE_W_PREFIX_SHIFT) | x8616_enc_width(w))
#define x8616_enc_pair(bit) ((bit) << X8616_OPCODE_PAIR_SHIFT) #define x8616_enc_pair(bit) ((bit) << X8616_OPCODE_PAIR_SHIFT)
// Scalar / generic packets // Scalar / generic packets
#define x8616_emit_u2(value) u1_(u2_(value) >> 0), u1_(u2_(value) >> 8) #define x8616_emit_u2(value) u2_lo(value), u2_hi(value)
#define x8616_emit_s2(value) x8616_emit_u2(value) #define x8616_emit_s2(value) x8616_emit_u2(value)
#define x8616_emit_op(opcode) u1_(opcode) #define x8616_emit_op(opcode) u1_(opcode)
#define x8616_emit_op_i8(opcode,imm) u1_(opcode), u1_(imm) #define x8616_emit_op_i8(opcode,imm) u1_(opcode), u1_(imm)
+2 -2
View File
@@ -444,7 +444,7 @@ RO_ global X8616_Encoding x8616_encodings[] =
.header = x8616_opc_byte(x8616_opcode_aam), .header = x8616_opc_byte(x8616_opcode_aam),
.post_opcode = { .post_opcode = {
.bits = X8616_POST_OPCODE_AAM_AAD, .bits = X8616_POST_OPCODE_AAM_AAD,
.mask = X8616_OPCODE_MASK, .mask = X8616_BYTE_MASK,
}, },
.op = x8616_op_aam, .op = x8616_op_aam,
}, },
@@ -453,7 +453,7 @@ RO_ global X8616_Encoding x8616_encodings[] =
.header = x8616_opc_byte(x8616_opcode_aad), .header = x8616_opc_byte(x8616_opcode_aad),
.post_opcode = { .post_opcode = {
.bits = X8616_POST_OPCODE_AAM_AAD, .bits = X8616_POST_OPCODE_AAM_AAD,
.mask = X8616_OPCODE_MASK, .mask = X8616_BYTE_MASK,
}, },
.op = x8616_op_aad, .op = x8616_op_aad,
}, },
+4 -1
View File
@@ -134,8 +134,11 @@ typedef float F4_2 __attribute__((vector_size(16)));
#define u8_v(value) C_(U8 V_*, value) #define u8_v(value) C_(U8 V_*, value)
enum { false = 0, true = 1, true_overflow, }; enum { false = 0, true = 1, true_overflow, };
#define u2_lo(value) u1_(u2_(value))
#define u2_hi(value) u1_(u2_(value) >> 8)
#define u4_lo(value) ((value) & 0xFFFFU) #define u4_lo(value) ((value) & 0xFFFFU)
#define u4_hi(value) ((value) >> 12) #define u4_hi(value) ((value) >> 16)
typedef void Proc_(VoidFn) (void); typedef void Proc_(VoidFn) (void);