Pseudo-code:
- 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)
+[[!inline pagenames="openpower/isa/av/minmax." raw="yes"]]
Special Registers Altered:
--- /dev/null
+ 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)