# Add Immediate D-Form * addi RT,RA,SI Pseudo-code: RT <- (RA|0) + EXTS(SI) Special Registers Altered: None # Add Immediate Shifted D-Form * addis RT,RA,SI Pseudo-code: RT <- (RA|0) + EXTS(SI || [0]*16) Special Registers Altered: None # Add PC Immediate Shifted DX-Form * addpcis RT,D Pseudo-code: D <- d0||d1||d2 RT <- NIA + EXTS(D || [0]*16) Special Registers Altered: None # Add XO-Form * add RT,RA,RB (OE=0 Rc=0) * add. RT,RA,RB (OE=0 Rc=1) * addo RT,RA,RB (OE=1 Rc=0) * addo. RT,RA,RB (OE=1 Rc=1) Pseudo-code: RT <- (RA) + (RB) Special Registers Altered: CR0 (if Rc=1) SO OV OV32 (if OE=1) # Subtract From XO-Form * subf RT,RA,RB (OE=0 Rc=0) * subf. RT,RA,RB (OE=0 Rc=1) * subfo RT,RA,RB (OE=1 Rc=0) * subfo. RT,RA,RB (OE=1 Rc=1) Pseudo-code: RT <- ¬(RA) + (RB) + 1 Special Registers Altered: CR0 (if Rc=1) SO OV OV32 (if OE=1) # Add Immediate Carrying D-Form * addic RT,RA,SI Pseudo-code: RT <- (RA) + EXTS(SI) Special Registers Altered: CA CA32 # Add Immediate Carrying and Record D-Form * addic. RT,RA,SI Pseudo-code: RT <- (RA) + EXTS(SI) Special Registers Altered: CR0 CA CA32 # Subtract From Immediate Carrying D-Form * subfic RT,RA,SI Pseudo-code: RT <- ¬(RA) + EXTS(SI) + 1 Special Registers Altered: CA CA32 # Add Carrying XO-Form * addc RT,RA,RB (OE=0 Rc=0) * addc. RT,RA,RB (OE=0 Rc=1) * addco RT,RA,RB (OE=1 Rc=0) * addco. RT,RA,RB (OE=1 Rc=1) Pseudo-code: RT <- (RA) + (RB) Special Registers Altered: CA CA32 CR0 (if Rc=1) SO OV OV32 (if OE=1) # Subtract From Carrying XO-Form * subfc RT,RA,RB (OE=0 Rc=0) * subfc. RT,RA,RB (OE=0 Rc=1) * subfco RT,RA,RB (OE=1 Rc=0) * subfco. RT,RA,RB (OE=1 Rc=1) Pseudo-code: RT <- ¬(RA) + (RB) + 1 Special Registers Altered: CA CA32 CR0 (if Rc=1) SO OV OV32 (if OE=1) # Add Extended XO-Form * adde RT,RA,RB (OE=0 Rc=0) * adde. RT,RA,RB (OE=0 Rc=1) * addeo RT,RA,RB (OE=1 Rc=0) * addeo. RT,RA,RB (OE=1 Rc=1) Pseudo-code: RT <- (RA) + (RB) + CA Special Registers Altered: CA CA32 CR0 (if Rc=1) SO OV OV32 (if OE=1) # Subtract From Extended XO-Form * subfe RT,RA,RB (OE=0 Rc=0) * subfe. RT,RA,RB (OE=0 Rc=1) * subfeo RT,RA,RB (OE=1 Rc=0) * subfeo. RT,RA,RB (OE=1 Rc=1) Pseudo-code: RT <- ¬(RA) + (RB) + CA Special Registers Altered: CA CA32 CR0 (if Rc=1) SO OV OV32 (if OE=1) # Add to Minus One Extended XO-Form * addme RT,RA (OE=0 Rc=0) * addme. RT,RA (OE=0 Rc=1) * addmeo RT,RA (OE=1 Rc=0) * addmeo. RT,RA (OE=1 Rc=1) Pseudo-code: RT <- (RA) + CA - 1 Special Registers Altered: CA CA32 CR0 (if Rc=1) SO OV OV32 (if OE=1) # Subtract From Minus One Extended XO-Form * subfme RT,RA (OE=0 Rc=0) * subfme. RT,RA (OE=0 Rc=1) * subfmeo RT,RA (OE=1 Rc=0) * subfmeo. RT,RA (OE=1 Rc=1) Pseudo-code: RT <- ¬(RA) + CA - 1 Special Registers Altered: CA CA32 CR0 (if Rc=1) SO OV OV32 (if OE=1) # Add Extended using alternate carry bit Z23-Form * addex RT,RA,RB,CY Pseudo-code: if CY=0 then RT <- (RA) + (RB) + OV Special Registers Altered: OV OV32 (if CY=0 ) # Subtract From Zero Extended XO-Form * subfze RT,RA (OE=0 Rc=0) * subfze. RT,RA (OE=0 Rc=1) * subfzeo RT,RA (OE=1 Rc=0) * subfzeo. RT,RA (OE=1 Rc=1) Pseudo-code: RT <- ¬(RA) + CA Special Registers Altered: CA CA32 CR0 (if Rc=1) SO OV OV32 (if OE=1) # Add to Zero Extended XO-Form * addze RT,RA (OE=0 Rc=0) * addze. RT,RA (OE=0 Rc=1) * addzeo RT,RA (OE=1 Rc=0) * addzeo. RT,RA (OE=1 Rc=1) Pseudo-code: RT <- (RA) + CA Special Registers Altered: CA CA32 CR0 (if Rc=1) SO OV OV32 (if OE=1) # Negate XO-Form * neg RT,RA (OE=0 Rc=0) * neg. RT,RA (OE=0 Rc=1) * nego RT,RA (OE=1 Rc=0) * nego. RT,RA (OE=1 Rc=1) Pseudo-code: RT <- ¬(RA) + 1 Special Registers Altered: CR0 (if Rc=1) SO OV OV32 (if OE=1) # Multiply Low Immediate D-Form * mulli RT,RA,SI Pseudo-code: prod[0:(XLEN*2)-1] <- MULS((RA), EXTS(SI)) RT <- prod[XLEN:(XLEN*2)-1] Special Registers Altered: None # Multiply High Word XO-Form * mulhw RT,RA,RB (Rc=0) * mulhw. RT,RA,RB (Rc=1) Pseudo-code: prod[0:XLEN-1] <- MULS((RA)[XLEN/2:XLEN-1], (RB)[XLEN/2:XLEN-1]) RT[XLEN/2:XLEN-1] <- prod[0:(XLEN/2)-1] RT[0:(XLEN/2)-1] <- undefined(prod[0:(XLEN/2)-1]) Special Registers Altered: CR0 (bits 0:2 undefined in 64-bit mode) (if Rc=1) # Multiply Low Word XO-Form * mullw RT,RA,RB (OE=0 Rc=0) * mullw. RT,RA,RB (OE=0 Rc=1) * mullwo RT,RA,RB (OE=1 Rc=0) * mullwo. RT,RA,RB (OE=1 Rc=1) Pseudo-code: prod[0:XLEN-1] <- MULS((RA)[XLEN/2:XLEN-1], (RB)[XLEN/2:XLEN-1]) RT <- prod overflow <- ((prod[0:XLEN/2] != [0]*((XLEN/2)+1)) & (prod[0:XLEN/2] != [1]*((XLEN/2)+1))) Special Registers Altered: CR0 (if Rc=1) SO OV OV32 (if OE=1) # Multiply High Word Unsigned XO-Form * mulhwu RT,RA,RB (Rc=0) * mulhwu. RT,RA,RB (Rc=1) Pseudo-code: prod[0:XLEN-1] <- (RA)[XLEN/2:XLEN-1] * (RB)[XLEN/2:XLEN-1] RT[XLEN/2:XLEN-1] <- prod[0:(XLEN/2)-1] RT[0:(XLEN/2)-1] <- undefined(prod[0:(XLEN/2)-1]) Special Registers Altered: CR0 (bits 0:2 undefined in 64-bit mode) (if Rc=1) # Divide Word XO-Form * divw RT,RA,RB (OE=0 Rc=0) * divw. RT,RA,RB (OE=0 Rc=1) * divwo RT,RA,RB (OE=1 Rc=0) * divwo. RT,RA,RB (OE=1 Rc=1) Pseudo-code: dividend[0:(XLEN/2)-1] <- (RA)[XLEN/2:XLEN-1] divisor[0:(XLEN/2)-1] <- (RB) [XLEN/2:XLEN-1] if (((dividend = (0b1 || ([0b0] * ((XLEN/2)-1)))) & (divisor = [1]*(XLEN/2))) | (divisor = [0]*(XLEN/2))) then RT[0:XLEN-1] <- undefined([0]*XLEN) overflow <- 1 else RT[XLEN/2:XLEN-1] <- DIVS(dividend, divisor) RT[0:(XLEN/2)-1] <- undefined([0]*(XLEN/2)) overflow <- 0 Special Registers Altered: CR0 (bits 0:2 undefined in 64-bit mode) (if Rc=1) SO OV OV32 (if OE=1) # Divide Word Unsigned XO-Form * divwu RT,RA,RB (OE=0 Rc=0) * divwu. RT,RA,RB (OE=0 Rc=1) * divwuo RT,RA,RB (OE=1 Rc=0) * divwuo. RT,RA,RB (OE=1 Rc=1) Pseudo-code: dividend[0:(XLEN/2)-1] <- (RA)[XLEN/2:XLEN-1] divisor[0:(XLEN/2)-1] <- (RB)[XLEN/2:XLEN-1] if divisor != 0 then RT[XLEN/2:XLEN-1] <- dividend / divisor RT[0:(XLEN/2)-1] <- undefined([0]*(XLEN/2)) overflow <- 0 else RT[0:XLEN-1] <- undefined([0]*XLEN) overflow <- 1 Special Registers Altered: CR0 (bits 0:2 undefined in 64-bit mode) (if Rc=1) SO OV OV32 (if OE=1) # Divide Word Extended XO-Form * divwe RT,RA,RB (OE=0 Rc=0) * divwe. RT,RA,RB (OE=0 Rc=1) * divweo RT,RA,RB (OE=1 Rc=0) * divweo. RT,RA,RB (OE=1 Rc=1) Pseudo-code: dividend[0:XLEN-1] <- (RA)[XLEN/2:XLEN-1] || [0]*(XLEN/2) divisor[0:XLEN-1] <- EXTS64((RB)[XLEN/2:XLEN-1]) if (((dividend = (0b1 || ([0b0] * (XLEN-1)))) & (divisor = [1]*XLEN)) | (divisor = [0]*XLEN)) then overflow <- 1 else result <- DIVS(dividend, divisor) result_half[0:XLEN-1] <- EXTS64(result[XLEN/2:XLEN-1]) if (result_half = result) then RT[XLEN/2:XLEN-1] <- result[XLEN/2:XLEN-1] RT[0:(XLEN/2)-1] <- undefined([0]*(XLEN/2)) overflow <- 0 else overflow <- 1 if overflow = 1 then RT[0:XLEN-1] <- undefined([0]*XLEN) Special Registers Altered: CR0 (bits 0:2 undefined in 64-bit mode) (if Rc=1) SO OV OV32 (if OE=1) # Divide Word Extended Unsigned XO-Form * divweu RT,RA,RB (OE=0 Rc=0) * divweu. RT,RA,RB (OE=0 Rc=1) * divweuo RT,RA,RB (OE=1 Rc=0) * divweuo. RT,RA,RB (OE=1 Rc=1) Pseudo-code: dividend[0:XLEN-1] <- (RA)[XLEN/2:XLEN-1] || [0]*(XLEN/2) divisor[0:XLEN-1] <- [0]*(XLEN/2) || (RB)[XLEN/2:XLEN-1] if (divisor = [0]*XLEN) then overflow <- 1 else result <- dividend / divisor if RA[XLEN/2:XLEN-1]