a <- (RA|0)
b <- (RB)
if MMM[0] then # word mode
# shift left by XLEN/2 to make the dword comparison
# do word comparison of the original inputs
a <- a[XLEN/2:XLEN-1] || [0] * XLEN/2
b <- b[XLEN/2:XLEN-1] || [0] * XLEN/2
if MMM[1] then # signed mode
# invert sign bits to make the unsigned comparison
# do signed comparison of the original inputs
a[0] <- ¬a[0]
b[0] <- ¬b[0]
# if Rc = 1 then store the result of comparing a and b to CR0
if Rc = 1 then
if a <u b then
CR0 <- 0b100 || XER[SO]
if a = b then
CR0 <- 0b001 || XER[SO]
if a >u b then
CR0 <- 0b010 || XER[SO]
if MMM[2] then # max mode
# swap a and b to make the less than comparison do
# greater than comparison of the original inputs
t <- a
a <- b
b <- t
# store the entire selected source (even in word mode)
# if Rc = 1 then store the result of comparing a and b to CR0
if a <u b then RT <- (RA|0)
else RT <- (RB)