Advertisement
Zeda

mul32

Nov 27th, 2015
750
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var_x = scrap   ; 4 bytes
  2. var_y = scrap+4 ; 4 bytes
  3. var_z0= scrap+4 ; 4 bytes, overwrites var_y
  4. var_z2= scrap+8 ; 4 bytes
  5.  
  6. mul32:
  7. ;;uses karatsuba multiplication
  8. ;;var_x * var_y
  9. ;;z0 holds the 64-bit result
  10. ;;708cc+6a+13b+42c +3mul
  11. ;;Avg: 2464.110153
  12. ;;Max:2839cc, 92cc faster
  13. ;;Min:2178cc (early can make it faster, though), 167cc faster
  14.     ld de,(var_x)   ;\
  15.     ld bc,(var_y)   ; |compute z0,z2
  16.     push bc         ; | var_y
  17.     call mul16      ; |
  18.     ld (var_z0),hl  ; |
  19.     ld bc,(var_y+2) ; |
  20.     ld (var_z0+2),de; |
  21.     ld de,(var_x+2) ; |
  22.     push bc         ; | var_y+2
  23.     call mul16      ; |
  24.     ld (var_z2),hl  ; |
  25.     ld (var_z2+2),de;/      208cc
  26.     xor a           ;\
  27.     ld hl,(var_x)   ; |
  28.     ld de,(var_x+2) ; |
  29.     add hl,de       ; |
  30.     rra             ; |
  31.     pop de          ; |
  32.     ex (sp),hl      ; |
  33.     add hl,de       ; |
  34.     pop bc          ; |
  35.     ex de,hl        ; |     109cc
  36.     push de         ; |if bit0=1, add DE<<16 to result
  37.     push bc         ; |
  38.     push af         ; |c flag means add BC<<16 to result
  39.     call mul16      ; |
  40.     ex de,hl        ; |
  41.     pop af          ; |
  42.     pop bc          ; |
  43.     jr nc,$+3       ; |     86+6a
  44.     add hl,bc       ; |
  45.     pop bc          ; |
  46.     rla             ; |
  47.     jr nc,$+4       ; |     26+13b
  48.     add hl,bc       ; |
  49.     adc a,0         ; |z1 = AHLDE-z2-z1
  50.     ex de,hl \ ld bc,(var_z0) \ sbc hl,bc
  51.     ex de,hl \ ld bc,(var_z0+2) \ sbc hl,bc
  52.     sbc a,0
  53.     ex de,hl \ ld bc,(var_z2) \ sbc hl,bc
  54.     ex de,hl \ ld bc,(var_z2+2) \ sbc hl,bc
  55.     sbc a,0         ; |z1 = AHLDE
  56.     ld b,h \ ld c,l ;/ z1 = ABCDE
  57.     ld hl,(var_z0+2);\
  58.     add hl,de       ; |Add:
  59.     ld (var_z0+2),hl; |z2z0
  60.     ld hl,(var_z2)  ; | z1
  61.     adc hl,bc       ; |----
  62.     ld (var_z2),hl  ; |
  63.     ret nc          ; |     279+42c
  64.     ld hl,(var_z2+2); |
  65.     inc hl          ; |
  66.     ld (var_z2+2),hl; |
  67.     ret             ;/
  68. mul16:
  69. ;;DE*BC => DEHL
  70. ;;Speed:
  71. ;;  108
  72. ;;  +(196-7b[0]+10b)*d
  73. ;;  +(200-7f[0]+10f)*e
  74. ;;  +a(9+17c)
  75. ;;min: 490cc
  76. ;;max: 690cc
  77. ;;average: 575.2034cc
  78. ;;early exit can be as early as 108cc
  79. ;;
  80. ;;  d=0 if B=0
  81. ;;  e=0 if C=0
  82. ;;  b[0] = bit 0,b
  83. ;;  f[0] = bit 0,c
  84. ;;  a = 0 or 1, for overflow
  85. ;;  c = 0 or 1, for overflow
  86. ;;  b =  sum of bits of B
  87. ;;  f = sum of bits of C
  88. ;;speed:
  89. ;;average: 575.2034cc
  90. ;;  b[0]= .5
  91. ;;  f[0]= .5
  92. ;;  d   = 255/256
  93. ;;  e   = 255/256
  94. ;;  a   = 1/256
  95. ;;  c   = 1/256
  96. ;;  b   = 4
  97. ;;  f   = 4
  98.  
  99.     ld a,b
  100.     ld hl,0 \ ld b,h \ or a \ jr z,$+50
  101.                 rla \ jr nc,$+5 \ ld h,d \ ld l,e
  102.     add hl,hl \ rla \ jr nc,$+4 \ add hl,de \ adc a,b
  103.     add hl,hl \ rla \ jr nc,$+4 \ add hl,de \ adc a,b
  104.     add hl,hl \ rla \ jr nc,$+4 \ add hl,de \ adc a,b
  105.     add hl,hl \ rla \ jr nc,$+4 \ add hl,de \ adc a,b
  106.     add hl,hl \ rla \ jr nc,$+4 \ add hl,de \ adc a,b
  107.     add hl,hl \ rla \ jr nc,$+4 \ add hl,de \ adc a,b
  108.     add hl,hl \ rla \ jr nc,$+4 \ add hl,de \ adc a,b
  109.     ld b,a
  110. ;;
  111.     push hl
  112.     ld a,c
  113.     ld hl,0 \ ld c,h \ or a \ jr z,$+49
  114.                 rla \ jr nc,$+5 \ ld h,d \ ld l,e
  115.     add hl,hl \ rla \ jr nc,$+4 \ add hl,de \ adc a,b
  116.     add hl,hl \ rla \ jr nc,$+4 \ add hl,de \ adc a,b
  117.     add hl,hl \ rla \ jr nc,$+4 \ add hl,de \ adc a,b
  118.     add hl,hl \ rla \ jr nc,$+4 \ add hl,de \ adc a,b
  119.     add hl,hl \ rla \ jr nc,$+4 \ add hl,de \ adc a,b
  120.     add hl,hl \ rla \ jr nc,$+4 \ add hl,de \ adc a,b
  121.     add hl,hl \ rla \ jr nc,$+4 \ add hl,de \ adc a,b
  122.     pop de
  123.     add a,h \ ld h,a
  124.     ret nc \ inc e
  125.     ret nz \ inc d
  126.     ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement