Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

81 lines
2.1 KiB

.globl ..__i64tod
// convert signed 64 bit integer to floating point double
// r4:r3 is converted to double in f1
//
// Note: there may be some loss of precision if abs(r4:r3) > (2 to 52)
.pdata
.align 2
.ualong ..__i64tod,__i64tod.e,0,0,__i64tod.b
.text
.align 2
..__i64tod:
.function ..__i64tod
// no prologue
__i64tod.b:
srawi r7,r4,31 // r7 = -signbit
// get absolute value
xor r3,r3,r7
xor r4,r4,r7
subfc r3,r7,r3
subfe r4,r7,r4
// count leading zeros
li r12,32
cntlzw r5,r4
subf. r6,r5,r12
bne __i64tod.1
cntlzw r0,r3
add r5,r5,r0
subf r6,r5,r12
__i64tod.1:
// shift left to justify
slw r4,r4,r5
srw r0,r3,r6
or r4,r4,r0
addi r6,r5,-32
slw r0,r3,r6
or. r4,r4,r0
slw r3,r3,r5
beq __i64tod.ret // exit now if zero
subfic r5,r5,1086 // exponent = 1086 - leading zeros
// shift right to allow space for exponent
// note that msb is not saved (hidden bit normalization)
rlwinm r3,r3,21,11,31
rlwimi r3,r4,21,0,10
rlwinm r4,r4,21,12,31
rlwimi r4,r5,20,1,11 // insert exponent
rlwimi r4,r7,0,0,0 // set sign bit
__i64tod.ret:
stw r3,-8(sp) // store converted value onto stack
stw r4,-4(sp)
lfd f1,-8(sp) // load into return register
blr
__i64tod.e:
.debug$S
.ualong 1
.uashort 17
.uashort 0x9 # S_OBJNAME
.ualong 0
.byte 10, "i64tod.obj"
.uashort 24
.uashort 0x1 # S_COMPILE
.byte 0x42 # Target processor = PPC 604
.byte 3 # Language = ASM
.byte 0
.byte 0
.byte 17, "PowerPC Assembler"