<!-- Power ISA Book I Version 3.0B Section A.3 page 782 -->
- def Round_Float( tgt_precision, sign, exp, frac, round_mode ):
- inc <- 0
- if tgt_precision = "single-precision" then
- lsb <- frac[23]
- gbit <- frac[24]
- rbit <- frac[25]
- xbit <- frac[26:63] > 0
- else # tgt_precision = "double-precision"
- lsb <= frac[52]
- gbit <= frac[53]
- rbit <= frac[54]
- xbit <= frac[55:63] > 0
-
- if round_mode = 0b00 then # Round to Nearest
- if lsb = 1 and gbit = 1 then inc <- 1
- if lsb = 0 and gbit = 1 and rbit = 1 then inc <- 1
- if lsb = 0 and gbit = 1 and xbit = 1 then inc <- 1
- end
- if round_mode = 0b10 then # Round toward + Infinity
- if sign = 0 and gbit = 1 then inc <-1
- if sign = 0 and rbit = 1 then inc <-1
- if sign = 0 and xbit = 1 then inc <-1
- end
- if round_mode = 0b11 then # Round toward - Infinity
- if sign = 1 and gbit = 1 then inc <-1
- if sign = 1 and rbit = 1 then inc <-1
- if sign = 1 and xbit = 1 then inc <-1
- end
- if tgt_precision = "single-precision" then
- frac[0:23] <- frac[0:23] + inc
- else # tgt_precision = "double-precision"
- frac[0:52] <- frac[0:52] + inc
- if carry_out = 1 then exp <- exp + 1
- FPSCR[FR] <- inc
- FPSCR[FI] <- gbit | rbit | xbit
- FPSCR[XX] <- FPSCR[XX] | FPSCR[FI]
-
def INT2FP(FR, cvt, RN):
if cvt = "sint2double" then
tgt_precision = "double-precision"
--- /dev/null
+# A.3 Round to Float conversion
+
+<!-- Power ISA Book I Version 3.0B Section A.3 page 782 -->
+
+ def Round_Float( tgt_precision, sign, exp, frac, round_mode ):
+ inc <- 0
+ if tgt_precision = "single-precision" then
+ lsb <- frac[23]
+ gbit <- frac[24]
+ rbit <- frac[25]
+ xbit <- frac[26:63] > 0
+ else # tgt_precision = "double-precision"
+ lsb <= frac[52]
+ gbit <= frac[53]
+ rbit <= frac[54]
+ xbit <= frac[55:63] > 0
+
+ if round_mode = 0b00 then # Round to Nearest
+ if lsb = 1 and gbit = 1 then inc <- 1
+ if lsb = 0 and gbit = 1 and rbit = 1 then inc <- 1
+ if lsb = 0 and gbit = 1 and xbit = 1 then inc <- 1
+ end
+ if round_mode = 0b10 then # Round toward + Infinity
+ if sign = 0 and gbit = 1 then inc <-1
+ if sign = 0 and rbit = 1 then inc <-1
+ if sign = 0 and xbit = 1 then inc <-1
+ end
+ if round_mode = 0b11 then # Round toward - Infinity
+ if sign = 1 and gbit = 1 then inc <-1
+ if sign = 1 and rbit = 1 then inc <-1
+ if sign = 1 and xbit = 1 then inc <-1
+ end
+ if tgt_precision = "single-precision" then
+ frac[0:23] <- frac[0:23] + inc
+ else # tgt_precision = "double-precision"
+ frac[0:52] <- frac[0:52] + inc
+ if carry_out = 1 then exp <- exp + 1
+ FPSCR[FR] <- inc
+ FPSCR[FI] <- gbit | rbit | xbit
+ FPSCR[XX] <- FPSCR[XX] | FPSCR[FI]
+