Pseudo-code:
+```
if _RB = 0 then mask <- [1] * XLEN
- else mask <- (RB)
+ else mask <- (RB)
ra <- (RA) & mask
a1 <- ra
- if bm[4] = 0 then a1 <- ¬ra
+ if bm[4] = 0 then a1 <- ¬ra
mode2 <- bm[2:3]
- if mode2 = 0 then a2 <- (¬ra)+1
+ if mode2 = 0 then a2 <- (¬ra)+1
if mode2 = 1 then a2 <- ra-1
if mode2 = 2 then a2 <- ra+1
- if mode2 = 3 then a2 <- ¬(ra+1)
+ if mode2 = 3 then a2 <- ¬(ra+1)
a1 <- a1 & mask
a2 <- a2 & mask
# select operator
if mode3 = 1 then result <- a1 & a2
if mode3 = 2 then result <- a1 ^ a2
if mode3 = 3 then result <- undefined([0]*XLEN)
+ # mask output
result <- result & mask
# optionally restore masked-out bits
if L = 1 then
- result <- result | (RA & ¬mask)
+ result <- result | (RA & ¬mask)
RT <- result
+```
Special Registers Altered: