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.