github.com/jflude/taocp@v0.0.0-20240210234939-99f2a91af3c2/mix/shift.go (about)

     1  package mix
     2  
     3  func (c *Computer) sla(aa Word, i, f, op, m int) (int64, error) {
     4  	if m < 0 {
     5  		panic(ErrInvalidOp)
     6  	}
     7  	switch f {
     8  	case 0: // SLA
     9  		var w Word
    10  		ShiftBitsLeft(&c.Reg[A], &w, 6*m)
    11  	case 1: // SRA
    12  		var w Word
    13  		ShiftBitsRight(&c.Reg[A], &w, 6*m)
    14  	case 2: // SLAX
    15  		ShiftBitsLeft(&c.Reg[A], &c.Reg[X], 6*m)
    16  	case 3: // SRAX
    17  		ShiftBitsRight(&c.Reg[A], &c.Reg[X], 6*m)
    18  	case 4: // SLC
    19  		RotateBitsLeft(&c.Reg[A], &c.Reg[X], 6*m)
    20  	case 5: // SRC
    21  		RotateBitsRight(&c.Reg[A], &c.Reg[X], 6*m)
    22  	case 6: // SLB (see Section 4.5.2)
    23  		ShiftBitsLeft(&c.Reg[A], &c.Reg[X], m)
    24  	case 7: // SRB (see Section 4.5.2)
    25  		ShiftBitsRight(&c.Reg[A], &c.Reg[X], m)
    26  	default:
    27  		panic(ErrInvalidOp)
    28  	}
    29  	return 2, nil
    30  }