https://bugs.kde.org/show_bug.cgi?id=492923

--- Comment #1 from Matt Borgerson <cont...@mborgerson.com> ---
Comment on attachment 173510
  --> https://bugs.kde.org/attachment.cgi?id=173510
Patch

>From 2b3142152cfc315bbdcd504d5d7cdc0ddaeb9b27 Mon Sep 17 00:00:00 2001
>From: Matt Borgerson <cont...@mborgerson.com>
>Date: Mon, 9 Sep 2024 14:48:12 -0700
>Subject: [PATCH] codegen_xchg_rAX_Reg: Preserve RAX[63:16] in `xchg ax, r16`
>
>Unlike 32-bit xchg, 16-bit `xchg ax, r16` should not modify the upper 48
>bits of operand registers. Before this patch, RAX[63:16] will be cleared
>in call to putIReg16 for RAX assignment.
>
>This patch reworks codegen_xchg_rAX_Reg to unify size handling and use
>putIRegRAX to handle this size-dependent extension correctly.
>---
> VEX/priv/guest_amd64_toIR.c | 29 ++++++-----------------------
> 1 file changed, 6 insertions(+), 23 deletions(-)
>
>diff --git a/VEX/priv/guest_amd64_toIR.c b/VEX/priv/guest_amd64_toIR.c
>index 57a8a434b..f6f8d4abe 100644
>--- a/VEX/priv/guest_amd64_toIR.c
>+++ b/VEX/priv/guest_amd64_toIR.c
>@@ -1152,13 +1152,6 @@ static IRExpr* getIReg16 ( UInt regno )
>                            Ity_I64 ));
> }
> 
>-static void putIReg16 ( UInt regno, IRExpr* e )
>-{
>-   vassert(typeOfIRExpr(irsb->tyenv,e) == Ity_I16);
>-   stmt( IRStmt_Put( integerGuestReg64Offset(regno), 
>-                     unop(Iop_16Uto64,e) ) );
>-}
>-
> static const HChar* nameIReg16 ( UInt regno )
> {
>    return nameIReg( 2, regno, False );
>@@ -8485,22 +8478,12 @@ void codegen_xchg_rAX_Reg ( Prefix pfx, Int sz, UInt 
>regLo3 )
>    IRTemp t2 = newTemp(ty);
>    vassert(sz == 2 || sz == 4 || sz == 8);
>    vassert(regLo3 < 8);
>-   if (sz == 8) {
>-      assign( t1, getIReg64(R_RAX) );
>-      assign( t2, getIRegRexB(8, pfx, regLo3) );
>-      putIReg64( R_RAX, mkexpr(t2) );
>-      putIRegRexB(8, pfx, regLo3, mkexpr(t1) );
>-   } else if (sz == 4) {
>-      assign( t1, getIReg32(R_RAX) );
>-      assign( t2, getIRegRexB(4, pfx, regLo3) );
>-      putIReg32( R_RAX, mkexpr(t2) );
>-      putIRegRexB(4, pfx, regLo3, mkexpr(t1) );
>-   } else {
>-      assign( t1, getIReg16(R_RAX) );
>-      assign( t2, getIRegRexB(2, pfx, regLo3) );
>-      putIReg16( R_RAX, mkexpr(t2) );
>-      putIRegRexB(2, pfx, regLo3, mkexpr(t1) );
>-   }
>+
>+   assign( t1, getIRegRAX(sz) );
>+   assign( t2, getIRegRexB(sz, pfx, regLo3) );
>+   putIRegRAX( sz, mkexpr(t2) );
>+   putIRegRexB( sz, pfx, regLo3, mkexpr(t1) );
>+
>    DIP("xchg%c %s, %s\n", 
>        nameISize(sz), nameIRegRAX(sz), 
>                       nameIRegRexB(sz,pfx, regLo3));
>-- 
>2.43.0
>

-- 
You are receiving this mail because:
You are watching all bug changes.

Reply via email to