From df95e25eaa618ae83d0ff0c3d6a2d6a22821f5ec Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 12 Jul 2020 00:36:07 +0200 Subject: [PATCH] UserspaceEmulator: Implement the NEG instruction Per the Intel manuals, NEG is equivalent to subtracting a value from 0. --- DevTools/UserspaceEmulator/SoftCPU.cpp | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/DevTools/UserspaceEmulator/SoftCPU.cpp b/DevTools/UserspaceEmulator/SoftCPU.cpp index 9508ec1f95..1547b26239 100644 --- a/DevTools/UserspaceEmulator/SoftCPU.cpp +++ b/DevTools/UserspaceEmulator/SoftCPU.cpp @@ -998,9 +998,22 @@ void SoftCPU::MOV_seg_RM32(const X86::Instruction&) { TODO(); } void SoftCPU::MUL_RM16(const X86::Instruction&) { TODO(); } void SoftCPU::MUL_RM32(const X86::Instruction&) { TODO(); } void SoftCPU::MUL_RM8(const X86::Instruction&) { TODO(); } -void SoftCPU::NEG_RM16(const X86::Instruction&) { TODO(); } -void SoftCPU::NEG_RM32(const X86::Instruction&) { TODO(); } -void SoftCPU::NEG_RM8(const X86::Instruction&) { TODO(); } + +void SoftCPU::NEG_RM16(const X86::Instruction& insn) +{ + insn.modrm().write16(*this, insn, op_sub(*this, 0, insn.modrm().read16(*this, insn))); +} + +void SoftCPU::NEG_RM32(const X86::Instruction& insn) +{ + insn.modrm().write32(*this, insn, op_sub(*this, 0, insn.modrm().read32(*this, insn))); +} + +void SoftCPU::NEG_RM8(const X86::Instruction& insn) +{ + insn.modrm().write8(*this, insn, op_sub(*this, 0, insn.modrm().read8(*this, insn))); +} + void SoftCPU::NOP(const X86::Instruction&) { TODO(); } void SoftCPU::NOT_RM16(const X86::Instruction&) { TODO(); } void SoftCPU::NOT_RM32(const X86::Instruction&) { TODO(); }