Assembly:

ROTX rt, rs, shift, shiftx, stripe

nanoMIPS, not available in NMS

Rotate and eXchange

Purpose:

Rotate and eXchange. Rotate and exchange bits in the word value in register $rs and placeresult in register $rt. Specific choices of the shift, shiftx and stripe arguments allow this instruction to perform bit and byte reordering operations including BYTEREVW, BYTEREVH, BITREVW, BITREVH

and BITREVB.

Availability:

nanoMIPS, not available in NMS

Format:

100000

rt

rs

1101

0

shiftx[4:1]

stripe

0

shift

6

5

5

4

1

4

1

1

5

Operation:

if C0.Config5.NMS:
    raise exception('RI')
tmp0 = GPR[rs][31:0] @ GPR[rs][31:0]
tmp1 = tmp0
for i in range(47):  # 0..46
    s = shift if (i & 0b01000) else shiftx
    if stripe and not (i & 0b00100): s = ~s
    if s[4]: tmp1[i] = tmp0[i+16]
tmp2 = tmp1
for i in range(39):  # 0..38
    s = shift if (i & 0b00100) else shiftx
    if s[3]: tmp2[i] = tmp1[i+8]
tmp3 = tmp2
for i in range(35):  # 0..34
    s = shift if (i & 0b00010) else shiftx
    if s[2]: tmp3[i] = tmp2[i+4]
tmp4 = tmp3
for i in range(33):  # 0..32
    s = shift if (i & 0b00001) else shiftx
    if s[1]: tmp4[i] = tmp3[i+2]
tmp5 = tmp4
for i in range(32):  # 0..31
    s = shift;
    if s[0]: tmp5[i] = tmp4[i+1]
GPR[rt] = sign_extend(tmp5, from_nbits=32)

The ROTX instruction can be used to reverse elements of a selected size within blocks of a different selected size. Some example use cases are shown in the table below. The ’Result’ shows the output value

assuming an input value of abcdefgh ijklmnopqrstuvwx yz012345, where each character represents the value of a single bit.

Assembly/Result from

                                                              abcdefgh ijklmnop qrstuvwx

AliasOperationyz012345

BITREVWReverse all bitsROTX rt, rs, 31, 0

                                                              543210zy xwvutsrq ponmlkji
                                                              hgfedcba

BITREVHReverse bits in halfsROTX rt, rs, 15, 16

                                                              ponmlkji hgfedcba 543210zy
                                                              xwvutsrq

BITREVBReverse bits in bytesROTX rt, rs, 7, 8, 1

                                                              hgfedcba ponmlkji xwvutsrq
                                                              543210zy

BYTEREVWReverse all bytesROTX rt, rs, 24, 8

                                                              yz012345 qrstuvwx ijklmnop
                                                              abcdefgh

BYTEREVHReverse bytes in halfsROTX rt, rs, 8, 24

                                                              ijklmnop abcdefgh yz012345
                                                              qrstuvwx

Reverse all nibblesROTX rt, rs, 28, 4

                                                              2345yz01 uvwxqrst mnopijkl
                                                              efghabcd

Reverse nibbles in halfsROTX rt, rs, 12, 20

                                                              mnopijkl efghabcd 2345yz01
                                                              uvwxqrst

Reverse nibbles in bytesROTX rt, rs, 4, 12, 1

                                                              efghabcd mnopijkl uvwxqrst

Assembly/Result from

                                                              abcdefgh ijklmnop qrstuvwx

AliasOperationyz012345

Reverse all bit pairsROTX rt, rs, 30, 2

                                                              452301yz wxuvstqr opmnklij
                                                              ghefcdab

Reverse pairs in halfsROTX rt, rs, 14, 18

                                                              opmnklij ghefcdab 452301yz
                                                              wxuvstqr

Reverse pairs in bytesROTX rt, rs, 6, 10, 1

                                                              ghefcdab opmnklij wxuvstqr
                                                              452301yz

Assembler aliases are provided for certain cases, as indicated in the table.

The MIPS32™ instructions BITSWAP and WSBH are equivalent to BITREVB and BYTEREVH respectively, and are also provided as assembler aliases to ROTX.

The ROTX instruction is designed to be implementable with minimal overhead using existing logic for the ROTR instruction. ROTR can be implemented using a barrel shifter, where the select signals for

the multiplexers at each stage are the bits of the ’shift’ argument. For ROTX, the mux select signals depend on the bit position as well as the stage of the shifter, and are a function of the ’shift’,’shiftx’

and ’stripe’ arguments.

Exceptions:

Reserved Instruction on NMS cores.