aboutsummaryrefslogtreecommitdiff
path: root/src/arch/x86_64/Encoding.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/x86_64/Encoding.zig')
-rw-r--r--src/arch/x86_64/Encoding.zig48
1 files changed, 24 insertions, 24 deletions
diff --git a/src/arch/x86_64/Encoding.zig b/src/arch/x86_64/Encoding.zig
index 275c001bd7..96396640d6 100644
--- a/src/arch/x86_64/Encoding.zig
+++ b/src/arch/x86_64/Encoding.zig
@@ -24,12 +24,7 @@ opc: [7]u8,
modrm_ext: u3,
mode: Mode,
-pub fn findByMnemonic(mnemonic: Mnemonic, args: struct {
- op1: Instruction.Operand,
- op2: Instruction.Operand,
- op3: Instruction.Operand,
- op4: Instruction.Operand,
-}) !?Encoding {
+pub fn findByMnemonic(mnemonic: Mnemonic, args: Instruction.Init) !?Encoding {
const input_op1 = Op.fromOperand(args.op1);
const input_op2 = Op.fromOperand(args.op2);
const input_op3 = Op.fromOperand(args.op3);
@@ -109,17 +104,13 @@ pub fn findByMnemonic(mnemonic: Mnemonic, args: struct {
if (count == 1) return candidates[0];
const EncodingLength = struct {
- fn estimate(encoding: Encoding, params: struct {
- op1: Instruction.Operand,
- op2: Instruction.Operand,
- op3: Instruction.Operand,
- op4: Instruction.Operand,
- }) usize {
+ fn estimate(encoding: Encoding, params: Instruction.Init) usize {
var inst = Instruction{
.op1 = params.op1,
.op2 = params.op2,
.op3 = params.op3,
.op4 = params.op4,
+ .prefix = params.prefix,
.encoding = encoding,
};
var cwriter = std.io.countingWriter(std.io.null_writer);
@@ -140,12 +131,7 @@ pub fn findByMnemonic(mnemonic: Mnemonic, args: struct {
else => {},
}
- const len = EncodingLength.estimate(candidate, .{
- .op1 = args.op1,
- .op2 = args.op2,
- .op3 = args.op3,
- .op4 = args.op4,
- });
+ const len = EncodingLength.estimate(candidate, args);
const current = shortest_encoding orelse {
shortest_encoding = .{ .index = i, .len = len };
continue;
@@ -228,7 +214,11 @@ pub fn modRmExt(encoding: Encoding) u3 {
}
pub fn operandBitSize(encoding: Encoding) u64 {
- if (encoding.mode == .long) return 64;
+ switch (encoding.mode) {
+ .short => return 16,
+ .long => return 64,
+ else => {},
+ }
const bit_size: u64 = switch (encoding.op_en) {
.np => switch (encoding.op1) {
.o16 => 16,
@@ -317,10 +307,13 @@ pub const Mnemonic = enum {
// zig fmt: off
// General-purpose
adc, add, @"and",
- call, cbw, cwde, cdqe, cwd, cdq, cqo, cmp,
+ call, cbw, cdq, cdqe,
cmova, cmovae, cmovb, cmovbe, cmovc, cmove, cmovg, cmovge, cmovl, cmovle, cmovna,
cmovnae, cmovnb, cmovnbe, cmovnc, cmovne, cmovng, cmovnge, cmovnl, cmovnle, cmovno,
cmovnp, cmovns, cmovnz, cmovo, cmovp, cmovpe, cmovpo, cmovs, cmovz,
+ cmp,
+ cmps, cmpsb, cmpsd, cmpsq, cmpsw,
+ cqo, cwd, cwde,
div,
fisttp, fld,
idiv, imul, int3,
@@ -328,15 +321,21 @@ pub const Mnemonic = enum {
jnc, jne, jng, jnge, jnl, jnle, jno, jnp, jns, jnz, jo, jp, jpe, jpo, js, jz,
jmp,
lea,
- mov, movsx, movsxd, movzx, mul,
+ lods, lodsb, lodsd, lodsq, lodsw,
+ mov,
+ movs, movsb, movsd, movsq, movsw,
+ movsx, movsxd, movzx, mul,
nop,
@"or",
pop, push,
ret,
- sal, sar, sbb, shl, shr, sub, syscall,
+ sal, sar, sbb,
+ scas, scasb, scasd, scasq, scasw,
+ shl, shr, sub, syscall,
seta, setae, setb, setbe, setc, sete, setg, setge, setl, setle, setna, setnae,
setnb, setnbe, setnc, setne, setng, setnge, setnl, setnle, setno, setnp, setns,
setnz, seto, setp, setpe, setpo, sets, setz,
+ stos, stosb, stosd, stosq, stosw,
@"test",
ud2,
xor,
@@ -351,10 +350,10 @@ pub const Mnemonic = enum {
ucomiss,
// SSE2
addsd,
- cmpsd,
+ //cmpsd,
divsd,
maxsd, minsd,
- movq, movsd,
+ movq, //movsd,
mulsd,
subsd,
ucomisd,
@@ -591,6 +590,7 @@ pub const Op = enum {
pub const Mode = enum {
none,
+ short,
fpu,
rex,
long,