From 87d687e242e3437e7e3a83e04bf9a403d95b3e9e Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Mon, 5 Sep 2011 18:36:26 -0700 Subject: X86: Make sure instruction flags are set properly even on 32 bit machines. The way flag bits were being set for microops in x86 ended up implicitly calling the bitset constructor which was truncating flags beyond the width of an unsigned long. This change sets the bits in chunks which are always small enough to avoid being truncated. On 64 bit machines this should reduce to be the same as before, and on 32 bit machines it should work properly and not be unreasonably inefficient. --- src/arch/x86/insts/microop.hh | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/arch/x86/insts/microop.hh b/src/arch/x86/insts/microop.hh index 6fc215452..e5248c9ce 100644 --- a/src/arch/x86/insts/microop.hh +++ b/src/arch/x86/insts/microop.hh @@ -100,7 +100,15 @@ namespace X86ISA X86ISA::X86StaticInst(mnem, _machInst, __opClass), instMnem(_instMnem) { - flags |= setFlags; + const int ChunkSize = sizeof(unsigned long); + const int Chunks = sizeof(setFlags) / ChunkSize; + + // Since the bitset constructor can only handle unsigned long + // sized chunks, feed it those one at a time while oring them in. + for (int i = 0; i < Chunks; i++) { + unsigned shift = i * ChunkSize * 8; + flags |= (std::bitset(setFlags >> shift) << shift); + } } std::string generateDisassembly(Addr pc, -- cgit v1.2.3