From 234ed8c9c6693599c39f2406157d1c25afb68704 Mon Sep 17 00:00:00 2001 From: lenawanel Date: Sat, 20 Apr 2024 10:12:00 +0000 Subject: [PATCH] fix set and setne --- src/emu.rs | 33 +++++++++------------------------ test_flags | Bin 4664 -> 0 bytes test_flags.asm | 15 --------------- testflags | Bin 4656 -> 0 bytes testflags.asm | 6 ------ 5 files changed, 9 insertions(+), 45 deletions(-) delete mode 100755 test_flags delete mode 100644 test_flags.asm delete mode 100755 testflags delete mode 100644 testflags.asm diff --git a/src/emu.rs b/src/emu.rs index 7dac480..237a0b1 100644 --- a/src/emu.rs +++ b/src/emu.rs @@ -1018,7 +1018,7 @@ impl Emu { } else { self.unset_flag(Flag::ZF); } - if (and_res & 0xff).count_ones() & 1 > 0 { + if (and_res & 0xff).count_ones() & 1 == 0 { self.set_flag(Flag::PF); } else { self.unset_flag(Flag::PF); @@ -1102,11 +1102,14 @@ impl Emu { // movsxd, as documented by https://www.felixcloutier.com/x86/movsx:movsxd // let's hope that this sign extends match bitness(instruction) { - Bitness::Eight => sized_mov!(i8), + Bitness::Eight => unsafe { unreachable_unchecked() }, Bitness::Sixteen => sized_mov!(i16), Bitness::ThirtyTwo => sized_mov!(i32), - Bitness::SixtyFour => sized_mov!(i64), - Bitness::HundredTwentyEigth => sized_mov!(i128), + Bitness::SixtyFour => { + let val: i32 = self.get_val(instruction, 1)?; + self.set_val(instruction, 0, val as i64)?; + } + Bitness::HundredTwentyEigth => unsafe { unreachable_unchecked() }, } } Mnemonic::Movzx => { @@ -1218,28 +1221,10 @@ impl Emu { } } Mnemonic::Sete => { - macro_rules! sized_sete { - ($typ:ty,$size:literal) => {{ - if self.get_flag(Flag::ZF) { - self.set_val::<$typ, $size>(instruction, 0, 1)?; - } else { - self.set_val::<$typ, $size>(instruction, 0, 0)?; - } - }}; - } - match_bitness_ts!(sized_sete) + self.set_val(instruction, 0, self.get_flag(Flag::ZF) as u8)?; } Mnemonic::Setne => { - macro_rules! sized_sete { - ($typ:ty,$size:literal) => {{ - if !self.get_flag(Flag::ZF) { - self.set_val::<$typ, $size>(instruction, 0, 1)?; - } else { - self.set_val::<$typ, $size>(instruction, 0, 0)?; - } - }}; - } - match_bitness_ts!(sized_sete) + self.set_val(instruction, 0, !self.get_flag(Flag::ZF) as u8)?; } /* +----------------------+ diff --git a/test_flags b/test_flags deleted file mode 100755 index 236ddf65c900b70ff8a1d80160d7da6c5fe801f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4664 zcmeHLu};H440S__=tK}gs#FFl7N*V&2xS3v=s%pUYJh<<^gO`CFYp0;03#zK8!P+) zzre;surGEA5s{F(`i6UF`#oRsw)5@D)8Y32#Ht<8 diff --git a/test_flags.asm b/test_flags.asm deleted file mode 100644 index 69678af..0000000 --- a/test_flags.asm +++ /dev/null @@ -1,15 +0,0 @@ - - - global _start - - section .text -_start: - - mov rax, 18446744073709551614 - shl rax, 1 - - pushf - mov rax, 60 ; system call for exit - pop rdi ; exit code rflags - syscall ; invoke operating system to exit - \ No newline at end of file diff --git a/testflags b/testflags deleted file mode 100755 index 5080c392a84ef554604029bd6080d7362a795360..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4656 zcmeI0F-`+95Ji7B8$_xEi6RmW(4Y(^q8=Cf?LYHv>vi6Tv&-|M(}9cvr--Xz6|LqAybq-VsBnZLe0wNkZ@Dgo znIsy0;hHFTA3CE)HQATX1M3dwMB6_0Rg{1dPy$Lo2`B+2pahhF5>Nt4KnW;;zY|!| zL;T|S^=WkyCT0-dvG>VuScx?pj6ApGv~)yfzC?@-S4OT8|M$w<}lCmU%($K&;S4c diff --git a/testflags.asm b/testflags.asm deleted file mode 100644 index 031fe4b..0000000 --- a/testflags.asm +++ /dev/null @@ -1,6 +0,0 @@ -mov rax, 1 -cmp rax, rax -pushf -mov rax, 60 ; system call for exit -pop rdi ; exit code 0 -syscall ; invoke operating system to exit \ No newline at end of file