#***** # # Michael Riff # Multiprecision addition version 1.0 Februar 2022. # 64 bits addition and multiplication. # #****/ dialect PowerPC file 'lib_64.s' # Only the sections can be exported (dos not work with labels) # export Add_64[DS] export .Add_64[PR] => 'add_64' # export Subt_64[DS] export .Subt_64[PR] => 'sub_64' # export Mult_64s[DS] export .Mult_64s[PR] => 'mul_64s' # export Mult_64u[DS] export .Mult_64u[PR] => 'mul_64u' # 64 bit addition csect Add_64[DS] csect .Add_64[PR] # Reset OFW in XER TBC addis r10,r0,0x3FFF addi r10,r10,0xFFFF mfspr r0,XER and r0,r0,r10 mtspr xer,r0 # mfspr r0,XER # stw r0,0(r6) lwz r10,4(r3) lwz r9,0(r3) lwz r8,4(r4) lwz r7,0(r4) addco r12,r8,r10 addeo r11,r7,r9 stw r11,0(r5) stw r12,4(r5) # Handle overflow (and carry) mfspr r5,XER andis. r5,r5,0xE000 stw r5,0(r6) blr # 64 bit subtraction ab - cd csect Subt_64[DS] csect .Subt_64[PR] # Reset OFW in XER addis r10,r0,0x3FFF addi r10,r10,0xFFFF mfspr r0,XER and r0,r0,r10 mtspr xer,r0 lwz r10,4(r3) # b lwz r9,0(r3) # a lwz r8,4(r4) # d lwz r7,0(r4) # c # Clear carry bit # addic r10,r10,0 subfc r11,r8,r10 subfeo r12,r7,r9 stw r11,4(r5) stw r12,0(r5) # Handle overflow (and carry) mfspr r5,XER andis. r5,r5,0xE000 stw r5,0(r6) blr # 64 bit signed multiplication ab x cd (ax2^31+b) * (c*2^32+d) csect Mult_64s[DS] csect .Mult_64s[PR] lwz r10,4(r3) # b lwz r9,0(r3) # a lwz r8,4(r4) # d lwz r7,0(r4) # c addi r0,r0,0 # Lowest word (lw of bd) mullw r6,r10,r8 stw r6,12(r5) # Second word (sum of 3 products: hw bd + lw bc + lw ad) mulhw r12,r10,r8 mullw r11,r10,r7 mullw r6,r9,r8 addc r12,r12,r11 addze r4,r0 # Transfer carry into next word addc r12,r12,r6 addze r4,r4 # Transfer carry into next word stw r12,8(r5) # Third word (sum of 3 products: hw bc + hw ad + lw ac) mulhw r3,r10,r7 mulhw r11,r9,r8 mullw r10,r9,r7 addc r4,r4,r3 # Add eventual carries addze r6,r0 # Transfer carry into next word addc r4,r4,r10 addze r6,r6 # Transfer carry into next word addc r4,r11,r4 addze r6,r6 # Transfer carry into next word stw r4,4(r5) # Fourth word (hw of ac) mulhw r8,r9,r7 add r8,r6,r8 # Add eventual carries stw r8,0(r5) blr # 64 bit unsigned multiplication ab x cd (ax2^31+b) * (c*2^32+d) csect Mult_64u[DS] csect .Mult_64u[PR] lwz r10,4(r3) # b lwz r9,0(r3) # a lwz r8,4(r4) # d lwz r7,0(r4) # c addi r0,r0,0 # Lowest word (lw of bd) mullw r6,r10,r8 stw r6,12(r5) # Second word (sum of 3 products: hw bd + lw bc + lw ad) mulhwu r12,r10,r8 mullw r11,r10,r7 mullw r6,r9,r8 addc r12,r12,r11 addze r4,r0 # Transfer carry into next word addc r12,r12,r6 addze r4,r4 # Transfer carry into next word stw r12,8(r5) # Third word (sum of 3 products: hw bc + hw ad + lw ac) mulhwu r3,r10,r7 mulhwu r11,r9,r8 mullw r10,r9,r7 addc r4,r4,r3 # Add eventual carries addze r6,r0 # Transfer carry into next word addc r4,r4,r10 addze r6,r6 # Transfer carry into next word addc r4,r11,r4 addze r6,r6 # Transfer carry into next word stw r4,4(r5) # Fourth word (hw of ac) mulhwu r8,r9,r7 add r8,r6,r8 # Add eventual carries stw r8,0(r5) blr