.sect .text; .sect .rom; .sect .data; .sect .bss .sect .text ! Converts a 32-bit integer into a 64-bit double. ! ! Stack: ( int -- double ) .define .cif8 .cif8: ! Conversion uses the pivot value ! 1 << 52 = 0x4330 0000 0000 0000 ! ! From signed integer i, we compute ! ((1 << 52) + (1 << 31) + i) - ((1 << 52) + (1 << 31)) lis r3, 0x4330 stwu r3, -4(sp) ! make space for the double lwz r3, 4(sp) xoris r3, r3, 0x8000 stw r3, 4(sp) ! flip sign bit to get (1 << 31) + i lfd f0, 0(sp) ! f0 = (1 << 52) + (1 << 31) + i lis r3, 0x8000 stw r3, 4(sp) lfd f1, 0(sp) ! f1 = (1 << 52) + (1 << 31) fsub f0, f0, f1 ! finish conversion stfd f0, 0(sp) ! save value again... blr ! ...and return