Christopher, I'll answer my own question .. You're compressing the alignment to a smaller value by extracting its log. I didn't get that until I read the Reader.cpp code :)
Reid. On Sat, 2007-04-21 at 09:46 -0700, Reid Spencer wrote: > Christopher, > > On Sat, 2007-04-21 at 03:17 -0500, Christopher Lamb wrote: > > > > Changes in directory llvm/lib/Bytecode/Writer: > > > > Writer.cpp updated: 1.173 -> 1.174 > > --- > > Log message: > > > > > > add support for alignment attributes on load/store instructions > > > > > > --- > > Diffs of the changes: (+27 -5) > > > > Writer.cpp | 32 +++++++++++++++++++++++++++----- > > 1 files changed, 27 insertions(+), 5 deletions(-) > > > > > > Index: llvm/lib/Bytecode/Writer/Writer.cpp > > diff -u llvm/lib/Bytecode/Writer/Writer.cpp:1.173 > > llvm/lib/Bytecode/Writer/Writer.cpp:1.174 > > --- llvm/lib/Bytecode/Writer/Writer.cpp:1.173 Mon Apr 16 18:32:28 2007 > > +++ llvm/lib/Bytecode/Writer/Writer.cpp Sat Apr 21 03:16:25 2007 > > @@ -616,7 +616,7 @@ > > unsigned Opcode = I.getOpcode(); > > unsigned NumOperands = I.getNumOperands(); > > > > - // Encode 'tail call' as 61, 'volatile load' as 62, and 'volatile store' > > as > > + // Encode 'tail call' as 61 > > // 63. > > if (const CallInst *CI = dyn_cast<CallInst>(&I)) { > > if (CI->getCallingConv() == CallingConv::C) { > > @@ -632,10 +632,6 @@ > > } else { > > Opcode = 58; // Call escape sequence. > > } > > - } else if (isa<LoadInst>(I) && cast<LoadInst>(I).isVolatile()) { > > - Opcode = 62; > > - } else if (isa<StoreInst>(I) && cast<StoreInst>(I).isVolatile()) { > > - Opcode = 63; > > } > > > > // Figure out which type to encode with the instruction. Typically we > > want > > @@ -744,6 +740,32 @@ > > } else if (isa<InvokeInst>(I)) { > > // Invoke escape seq has at least 4 operands to encode. > > ++NumOperands; > > + } else if (const LoadInst *LI = dyn_cast<LoadInst>(&I)) { > > + // Encode attributed load as opcode 62 > > + // We need to encode the attributes of the load instruction as the > > second > > + // operand. Its not really a slot, but we don't want to break the > > + // instruction format for these instructions. > > + if (LI->getAlignment() || LI->isVolatile()) { > > + NumOperands = 2; > > + Slots[1] = ((Log2_32(LI->getAlignment())+1)<<1) + > > + (LI->isVolatile() ? 1 : 0); > > Is this Log2_32 really needed? The alignment should already be a power > of two. If the alignment is something like 7 then you'll get rounding > to 8 but I contend that an alignment of 7 can't happen. This can be > assured in the bcreader and the asmparser. > > > + if (Slots[1] > MaxOpSlot) > > + MaxOpSlot = Slots[1]; > > + Opcode = 62; > > + } > > + } else if (const StoreInst *SI = dyn_cast<StoreInst>(&I)) { > > + // Encode attributed store as opcode 63 > > + // We need to encode the attributes of the store instruction as the > > third > > + // operand. Its not really a slot, but we don't want to break the > > + // instruction format for these instructions. > > + if (SI->getAlignment() || SI->isVolatile()) { > > + NumOperands = 3; > > + Slots[2] = ((Log2_32(SI->getAlignment())+1)<<1) + > > + (SI->isVolatile() ? 1 : 0); > > + if (Slots[2] > MaxOpSlot) > > + MaxOpSlot = Slots[2]; > > + Opcode = 63; > > + } > > } > > > > // Decide which instruction encoding to use. This is determined > > primarily > > > > > > > > _______________________________________________ > > llvm-commits mailing list > > llvm-commits@cs.uiuc.edu > > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits > > _______________________________________________ > llvm-commits mailing list > llvm-commits@cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits