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)