From 4eae91f1ca4e86dd8bb3e70267f768c0bbb3089a Mon Sep 17 00:00:00 2001 From: Shwartsman Date: Sat, 20 Jan 2024 08:19:43 +0200 Subject: [PATCH] addressing issue Possible Undefined Behavior in NEG_EdR() and NEG_EdM() #227 --- bochs/cpu/arith16.cc | 4 ++-- bochs/cpu/arith32.cc | 4 ++-- bochs/cpu/arith64.cc | 4 ++-- bochs/cpu/arith8.cc | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/bochs/cpu/arith16.cc b/bochs/cpu/arith16.cc index 0049b5175..95598ca92 100644 --- a/bochs/cpu/arith16.cc +++ b/bochs/cpu/arith16.cc @@ -458,7 +458,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::NEG_EwM(bxInstruction_c *i) bx_address eaddr = BX_CPU_RESOLVE_ADDR(i); Bit32u op1_16 = read_RMW_virtual_word(i->seg(), eaddr); - op1_16 = 0 - (Bit32s)(Bit16s)(op1_16); + op1_16 = -op1_16; write_RMW_linear_word(op1_16); SET_FLAGS_OSZAPC_SUB_16(0, 0 - op1_16, op1_16); @@ -469,7 +469,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::NEG_EwM(bxInstruction_c *i) void BX_CPP_AttrRegparmN(1) BX_CPU_C::NEG_EwR(bxInstruction_c *i) { Bit32u op1_16 = BX_READ_16BIT_REG(i->dst()); - op1_16 = 0 - (Bit32s)(Bit16s)(op1_16); + op1_16 = -op1_16; BX_WRITE_16BIT_REG(i->dst(), op1_16); SET_FLAGS_OSZAPC_SUB_16(0, 0 - op1_16, op1_16); diff --git a/bochs/cpu/arith32.cc b/bochs/cpu/arith32.cc index 2a3f85943..371dc8c29 100644 --- a/bochs/cpu/arith32.cc +++ b/bochs/cpu/arith32.cc @@ -492,7 +492,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::NEG_EdM(bxInstruction_c *i) bx_address eaddr = BX_CPU_RESOLVE_ADDR(i); Bit32u op1_32 = read_RMW_virtual_dword(i->seg(), eaddr); - op1_32 = - (Bit32s)(op1_32); + op1_32 = -op1_32; write_RMW_linear_dword(op1_32); SET_FLAGS_OSZAPC_SUB_32(0, 0 - op1_32, op1_32); @@ -503,7 +503,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::NEG_EdM(bxInstruction_c *i) void BX_CPP_AttrRegparmN(1) BX_CPU_C::NEG_EdR(bxInstruction_c *i) { Bit32u op1_32 = BX_READ_32BIT_REG(i->dst()); - op1_32 = - (Bit32s)(op1_32); + op1_32 = -op1_32; BX_WRITE_32BIT_REGZ(i->dst(), op1_32); SET_FLAGS_OSZAPC_SUB_32(0, 0 - op1_32, op1_32); diff --git a/bochs/cpu/arith64.cc b/bochs/cpu/arith64.cc index 64999a962..5219fdb03 100644 --- a/bochs/cpu/arith64.cc +++ b/bochs/cpu/arith64.cc @@ -492,7 +492,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::NEG_EqM(bxInstruction_c *i) bx_address eaddr = BX_CPU_RESOLVE_ADDR_64(i); Bit64u op1_64 = read_RMW_linear_qword(i->seg(), get_laddr64(i->seg(), eaddr)); - op1_64 = - (Bit64s)(op1_64); + op1_64 = -op1_64; write_RMW_linear_qword(op1_64); SET_FLAGS_OSZAPC_SUB_64(0, -op1_64, op1_64); @@ -503,7 +503,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::NEG_EqM(bxInstruction_c *i) void BX_CPP_AttrRegparmN(1) BX_CPU_C::NEG_EqR(bxInstruction_c *i) { Bit64u op1_64 = BX_READ_64BIT_REG(i->dst()); - op1_64 = - (Bit64s)(op1_64); + op1_64 = -op1_64; BX_WRITE_64BIT_REG(i->dst(), op1_64); SET_FLAGS_OSZAPC_SUB_64(0, -op1_64, op1_64); diff --git a/bochs/cpu/arith8.cc b/bochs/cpu/arith8.cc index 1b4c7dff2..6d527f751 100644 --- a/bochs/cpu/arith8.cc +++ b/bochs/cpu/arith8.cc @@ -420,7 +420,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::NEG_EbM(bxInstruction_c *i) bx_address eaddr = BX_CPU_RESOLVE_ADDR(i); Bit32u op1_8 = read_RMW_virtual_byte(i->seg(), eaddr); - op1_8 = - (Bit8s)(op1_8); + op1_8 = -op1_8; write_RMW_linear_byte(op1_8); SET_FLAGS_OSZAPC_SUB_8(0, 0 - op1_8, op1_8); @@ -431,7 +431,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::NEG_EbM(bxInstruction_c *i) void BX_CPP_AttrRegparmN(1) BX_CPU_C::NEG_EbR(bxInstruction_c *i) { Bit32u op1_8 = BX_READ_8BIT_REGx(i->dst(), i->extend8bitL()); - op1_8 = - (Bit8s)(op1_8); + op1_8 = -op1_8; BX_WRITE_8BIT_REGx(i->dst(), i->extend8bitL(), op1_8); SET_FLAGS_OSZAPC_SUB_8(0, 0 - op1_8, op1_8);