A.3 Floating-Point Convert from Integer Model
The following describes algorithmically the operation of the Floating Convert From Integer instructions.
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) & (gbit = 1) then inc <- 1
if (lsb = 0) & (gbit = 1) & (rbit = 1) then inc <- 1
if (lsb = 0) & (gbit = 1) & (xbit = 1) then inc <- 1
if round_mode = 0b10 then # Round toward + Infinity
if (sign = 0) & (gbit = 1) then inc <-1
if (sign = 0) & (rbit = 1) then inc <-1
if (sign = 0) & (xbit = 1) then inc <-1
if round_mode = 0b11 then # Round toward - Infinity
if (sign = 1) & (gbit = 1) then inc <-1
if (sign = 1) & (rbit = 1) then inc <-1
if (sign = 1) & (xbit = 1) then inc <-1
# increase fraction, record the top bit as a 'carry out'
if tgt_precision = 'single-precision' then
tmp <- [0]*25
tmp[1:24] <- frac[0:23]
tmp[0:24] <- tmp[0:24] + inc
carry_out <- tmp[0]
frac[0:23] <- tmp[1:24]
else # tgt_precision = 'double-precision'
tmp <- [0]*54
tmp[1:53] <- frac[0:52]
tmp[0:53] <- tmp[0:53] + inc
carry_out <- tmp[0]
frac[0:52] <- tmp[1:53]
if carry_out = 1 then exp <- exp + 1
# TODO, later
# FPSCR[FR] <- inc
# FPSCR[FI] <- gbit | rbit | xbit
# FPSCR[XX] <- FPSCR[XX] | FPSCR[FI]
def INT2FP(FR, cvt):
if cvt = 'sint2double' then
tgt_precision = 'double-precision'
sign <- FR[0]
if cvt = 'sint2single' then
tgt_precision <- 'single-precision'
sign <- FR[0]
if cvt = 'uint2double' then
tgt_precision <- 'double-precision'
sign <- 0
if cvt = 'uint2single' then
tgt_precision <- 'single-precision'
sign <- 0
frac <- [0] * 64
result <- [0] * 64
exp <- 63
frac <- FR[0:63]
if frac[0:63] = 0 then
# Zero Operand
# TODO, FPSCR
#FPSCR[FR] <- 0b00
#FPSCR[FI] <- 0b00
#FPSCR[FPRF] <- '+ zero'
result <- [0] * 64
else
if sign = 1 then frac[0:63] <- ¬frac[0:63] + 1
# do the loop 0 times if FR = max negative 64-bit integer or
# if FR = max unsigned 64-bit integer
do while frac[0] = 0
frac[0:63] <- frac[1:63] || 0b0
exp <- exp - 1
# round to nearest
RN <- 0b00 # TODO, FPSCR[RN]
Round_Float( tgt_precision, sign, exp, frac, RN )
# TODO, FPSCR
#if sign = 0 then FPSCR[FPRF] <- '+normal number'
#if sign = 1 then FPSCR[FPRF] <- '-normal number'
result[0] <- sign
result[1:11] <- exp + 1023 # exp + bias
result[12:63] <- frac[1:52]
return result