From 283218bc2967fa2dbf3d0a53cc58940b0fa2f424 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Sun, 11 Jan 2026 18:37:29 +0100 Subject: [PATCH] x64Emitter: Reduce padding in OpArg By moving members of the OpArg struct around, we can cut down on how much padding the struct needs. Now it has a size of 16 bytes, small enough for function calls to pass it in two registers instead of on the stack. --- Source/Core/Common/x64Emitter.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Source/Core/Common/x64Emitter.h b/Source/Core/Common/x64Emitter.h index 71dcea30f9..6953770986 100644 --- a/Source/Core/Common/x64Emitter.h +++ b/Source/Core/Common/x64Emitter.h @@ -113,8 +113,8 @@ struct OpArg // dummy op arg, used for storage constexpr OpArg() = default; constexpr OpArg(u64 offset_, int scale_, X64Reg rm_reg = RAX, X64Reg scaled_reg = RAX) - : scale{static_cast(scale_)}, offsetOrBaseReg{static_cast(rm_reg)}, - indexReg{static_cast(scaled_reg)}, offset{offset_} + : offset{offset_}, offsetOrBaseReg{static_cast(rm_reg)}, + indexReg{static_cast(scaled_reg)}, scale{static_cast(scale_)} { } constexpr bool operator==(const OpArg& b) const @@ -234,11 +234,11 @@ private: void WriteSingleByteOp(XEmitter* emit, u8 op, X64Reg operandReg, int bits); void WriteNormalOp(XEmitter* emit, bool toRM, NormalOp op, const OpArg& operand, int bits) const; - u8 scale = 0; + u64 offset = 0; // Also used to store immediates. u16 offsetOrBaseReg = 0; u16 indexReg = 0; - u64 offset = 0; // Also used to store immediates. u16 operandReg = 0; + u8 scale = 0; }; template