[HN Gopher] 80386 Barrel Shifter
       ___________________________________________________________________
        
       80386 Barrel Shifter
        
       Author : jamesbowman
       Score  : 68 points
       Date   : 2026-02-08 07:19 UTC (2 days ago)
        
 (HTM) web link (nand2mario.github.io)
 (TXT) w3m dump (nand2mario.github.io)
        
       | rep_lodsb wrote:
       | Implementing rotate through carry like that was a really bad
       | decision IMO - it's almost never by more than one bit left or
       | right at a time, and this could be done much more efficiently
       | than with the constant-time code which is only faster when the
       | count is > 6.
       | 
       | Is the full microcode available anywhere?
        
         | kjs3 wrote:
         | Since the shifter is also used for bit tests, the 'most things
         | are a 1-bit shift' might not be the case. Perhaps they did the
         | analysis and it made sense.
        
           | rep_lodsb wrote:
           | There are separate opcodes for shift/rotate by 1, by CL, or
           | by an immediate operand. Those are decoded to separate
           | microcode entry points, so they could have at least optimized
           | the "RCL/RCR x,1" case.
           | 
           | And the microcode for bit test has to be different anyway.
        
         | ajenner wrote:
         | I haven't published it yet as there are still some rough edges
         | to clear up, but if you email me (andrew@reenigne.org) I'll
         | send you the current work-in-progress (the same one that
         | nand2mario is working from).
        
       | cmovq wrote:
       | > For memory operands, there's an additional twist: the bit index
       | is a signed offset that can address bits outside the nominal
       | operand. A bit index of 35 on a dword accesses bit 3 of the next
       | dword in memory.
       | 
       | I wonder what is the use case for testing a bit outside of the
       | memory address given.
        
         | juancn wrote:
         | It was probably easier to just implement it that way, given
         | that the barrel shifter is 64 bits wide.
        
         | rep_lodsb wrote:
         | So you can have bit arrays of any length in memory, rather than
         | just 32 bits in a register.
        
           | cmovq wrote:
           | That makes sense. LLVM could probably do better here by using
           | the memory operand version:
           | 
           | https://godbolt.org/z/jeqbaPsMz
        
             | jxors wrote:
             | The memory operand version tends to be as slow or slower
             | than the manual implementation, so LLVM is right to avoid
             | it.
        
       ___________________________________________________________________
       (page generated 2026-02-10 23:01 UTC)