Advertisement
keithsrobertson

FastDivide & ModX

Oct 17th, 2023
2,061
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ASM (NASM) 29.16 KB | Source Code | 0 0
  1. MUI_ALIGN
  2. ;------------------------------------------------------------------------------
  3. ; _HV_FastDivide - Divide an unsigned number by a divisor.
  4. ; Division without div instruction for common divisor numbers
  5. ; https://godbolt.org/z/sKWfdqYPP
  6. ;------------------------------------------------------------------------------
  7. _HV_FastDivide PROC USES ECX EDX dwNumber:DWORD, dwDivisor:DWORD
  8.    
  9.     .IF dwNumber == 0
  10.         mov eax, 0
  11.         ret
  12.     .ENDIF
  13.    
  14.     mov eax, dwDivisor
  15.     .IF eax == 0
  16.         mov eax, 0
  17.         ret
  18.    
  19.     .ELSEIF eax == 1
  20.         mov eax, dwNumber
  21.         ret
  22.    
  23.     .ELSEIF eax == 2
  24.         mov eax, dwNumber
  25.         shr eax, 1
  26.        
  27.     .ELSEIF eax == 3
  28.         mov eax, dwNumber
  29.         mov edx, -1431655765
  30.         mul edx
  31.         mov eax, edx
  32.         shr eax, 1
  33.        
  34.     .ELSEIF eax == 4
  35.         mov eax, dwNumber
  36.         shr eax, 2
  37.        
  38.     .ELSEIF eax == 5
  39.         mov eax, dwNumber
  40.         mov edx, -858993459
  41.         mul edx
  42.         mov eax, edx
  43.         shr eax, 2
  44.        
  45.     .ELSEIF eax == 6
  46.         mov eax, dwNumber
  47.         mov edx, -1431655765
  48.         mul edx
  49.         mov eax, edx
  50.         shr eax, 2
  51.        
  52.     .ELSEIF eax == 7
  53.         mov eax, dwNumber
  54.         mov edx, 613566757
  55.         mov ecx, eax
  56.         mul edx
  57.         mov eax, ecx
  58.         sub eax, edx
  59.         shr eax, 1
  60.         add eax, edx
  61.         shr eax, 2
  62.        
  63.     .ELSEIF eax == 8
  64.         mov eax, dwNumber
  65.         shr eax, 3
  66.        
  67.     .ELSEIF eax == 9
  68.         mov eax, dwNumber
  69.         mov edx, 954437177
  70.         mul edx
  71.         mov eax, edx
  72.         shr eax, 1
  73.        
  74.     .ELSEIF eax == 10
  75.         mov eax, dwNumber
  76.         mov edx, -858993459
  77.         mul edx
  78.         mov eax, edx
  79.         shr eax, 3
  80.        
  81.     .ELSEIF eax == 11
  82.         mov eax, dwNumber
  83.         mov edx, -1171354717
  84.         mul edx
  85.         mov eax, edx
  86.         shr eax, 3
  87.        
  88.     .ELSEIF eax == 12
  89.         mov eax, dwNumber
  90.         mov edx, -1431655765
  91.         mul edx
  92.         mov eax, edx
  93.         shr eax, 3
  94.        
  95.     .ELSEIF eax == 13
  96.         mov eax, dwNumber
  97.         mov edx, 1321528399
  98.         mul edx
  99.         mov eax, edx
  100.         shr eax, 2
  101.        
  102.     .ELSEIF eax == 14
  103.         mov eax, dwNumber
  104.         shr eax, 1
  105.         mov edx, -1840700269
  106.         mul edx
  107.         mov eax, edx
  108.         shr eax, 2
  109.        
  110.     .ELSEIF eax == 15
  111.         mov eax, dwNumber
  112.         mov edx, -2004318071
  113.         mul edx
  114.         mov eax, edx
  115.         shr eax, 3
  116.        
  117.     .ELSEIF eax == 16
  118.         mov eax, dwNumber
  119.         shr eax, 4
  120.        
  121.     .ELSEIF eax == 20
  122.         mov eax, dwNumber
  123.         mov edx, -858993459
  124.         mul edx
  125.         mov eax, edx
  126.         shr eax, 4
  127.        
  128.     .ELSEIF eax == 24
  129.         mov eax, dwNumber
  130.         mov edx, -1431655765
  131.         mul edx
  132.         mov eax, edx
  133.         shr eax, 4
  134.  
  135.     .ELSEIF eax == 25
  136.         mov eax, dwNumber
  137.         mov edx, 1374389535
  138.         mul edx
  139.         mov eax, edx
  140.         shr eax, 3
  141.  
  142.     .ELSEIF eax == 28
  143.         mov eax, dwNumber
  144.         shr eax, 2
  145.         mov edx, 613566757
  146.         mul edx
  147.         mov eax, edx
  148.        
  149.     .ELSEIF eax == 30
  150.         mov eax, dwNumber
  151.         mov edx, -2004318071
  152.         mul edx
  153.         mov eax, edx
  154.         shr eax, 4
  155.        
  156.     .ELSEIF eax == 32
  157.         mov eax, dwNumber
  158.         shr eax, 5
  159.    
  160.     .ELSEIF eax == 36
  161.         mov eax, dwNumber
  162.         mov edx, 954437177
  163.         mul edx
  164.         mov eax, edx
  165.         shr eax, 3
  166.    
  167.     .ELSEIF eax == 40
  168.         mov eax, dwNumber
  169.         mov edx, -858993459
  170.         mul edx
  171.         mov eax, edx
  172.         shr eax, 5
  173.    
  174.     .ELSEIF eax == 44
  175.         mov eax, dwNumber
  176.         mov edx, -1171354717
  177.         mul edx
  178.         mov eax, edx
  179.         shr eax, 5
  180.    
  181.     .ELSEIF eax == 45
  182.         mov eax, dwNumber
  183.         mov edx, 1813430637
  184.         mov ecx, eax
  185.         mul edx
  186.         mov eax, ecx
  187.         sub eax, edx
  188.         shr eax, 1
  189.         add eax, edx
  190.         shr eax, 5
  191.    
  192.     .ELSEIF eax == 48
  193.         mov eax, dwNumber
  194.         mov edx, -1431655765
  195.         mul edx
  196.         mov eax, edx
  197.         shr eax, 5
  198.    
  199.     .ELSEIF eax == 50
  200.         mov eax, dwNumber
  201.         mov edx, 1374389535
  202.         mul edx
  203.         mov eax, edx
  204.         shr eax, 4
  205.    
  206.     .ELSEIF eax == 52
  207.         mov eax, dwNumber
  208.         mov edx, 1321528399
  209.         mul edx
  210.         mov eax, edx
  211.         shr eax, 4
  212.    
  213.     .ELSEIF eax == 56
  214.         mov eax, dwNumber
  215.         shr eax, 3
  216.         mov edx, 613566757
  217.         mul edx
  218.         mov eax, edx
  219.    
  220.     .ELSEIF eax == 60
  221.         mov eax, dwNumber
  222.         mov edx, -2004318071
  223.         mul edx
  224.         mov eax, edx
  225.         shr eax, 5
  226.    
  227.     .ELSEIF eax == 64
  228.         mov eax, dwNumber
  229.         shr eax, 6
  230.    
  231.     .ELSEIF eax == 68
  232.         mov eax, dwNumber
  233.         mov edx, -252645135
  234.         mul edx
  235.         mov eax, edx
  236.         shr eax, 6
  237.    
  238.     .ELSEIF eax == 72
  239.         mov eax, dwNumber
  240.         mov edx, 954437177
  241.         mul edx
  242.         mov eax, edx
  243.         shr eax, 4
  244.    
  245.     .ELSEIF eax == 75
  246.         mov eax, dwNumber
  247.         mov edx, 458129845
  248.         mul edx
  249.         mov eax, edx
  250.         shr eax, 3
  251.    
  252.     .ELSEIF eax == 76
  253.         mov eax, dwNumber
  254.         shr eax, 2
  255.         mov edx, 452101821
  256.         mul edx
  257.         mov eax, edx
  258.         shr eax, 1
  259.    
  260.     .ELSEIF eax == 80
  261.         mov eax, dwNumber
  262.         mov edx, -858993459
  263.         mul edx
  264.         mov eax, edx
  265.         shr eax, 6
  266.    
  267.     .ELSEIF eax == 84
  268.         mov eax, dwNumber
  269.         shr eax, 2
  270.         mov edx, 818089009
  271.         mul edx
  272.         mov eax, edx
  273.         shr eax, 2
  274.    
  275.     .ELSEIF eax == 88
  276.         mov eax, dwNumber
  277.         mov edx, -1171354717
  278.         mul edx
  279.         mov eax, edx
  280.         shr eax, 6
  281.    
  282.     .ELSEIF eax == 90
  283.         mov eax, dwNumber
  284.         shr eax, 1
  285.         mov edx, -1240768329
  286.         mul edx
  287.         mov eax, edx
  288.         shr eax, 5
  289.    
  290.     .ELSEIF eax == 92
  291.         mov eax, dwNumber
  292.         mov edx, -1307163959
  293.         mul edx
  294.         mov eax, edx
  295.         shr eax, 6
  296.    
  297.     .ELSEIF eax == 96
  298.         mov eax, dwNumber
  299.         mov edx, -1431655765
  300.         mul edx
  301.         mov eax, edx
  302.         shr eax, 6
  303.    
  304.     .ELSEIF eax == 100
  305.         mov eax, dwNumber
  306.         mov edx, 1374389535
  307.         mul edx
  308.         mov eax, edx
  309.         shr eax, 5
  310.    
  311.     .ELSEIF eax == 112
  312.         mov eax, dwNumber
  313.         shr eax, 4
  314.         mov edx, 613566758
  315.         mul edx
  316.         mov eax, edx
  317.    
  318.     .ELSEIF eax == 120
  319.         mov eax, dwNumber
  320.         mov edx, -2004318071
  321.         mul edx
  322.         mov eax, edx
  323.         shr eax, 6
  324.    
  325.     .ELSEIF eax == 125
  326.         mov eax, dwNumber
  327.         mov edx, 274877907
  328.         mul edx
  329.         mov eax, edx
  330.         shr eax, 3
  331.    
  332.     .ELSEIF eax == 128
  333.         mov eax, dwNumber
  334.         shr eax, 7
  335.    
  336.     .ELSEIF eax == 135
  337.         mov eax, dwNumber
  338.         mov edx, -222702007
  339.         mul edx
  340.         mov eax, edx
  341.         shr eax, 7
  342.    
  343.     .ELSEIF eax == 144
  344.         mov eax, dwNumber
  345.         mov edx, 954437177
  346.         mul edx
  347.         mov eax, edx
  348.         shr eax, 5
  349.    
  350.     .ELSEIF eax == 150
  351.         mov eax, dwNumber
  352.         mov edx, 458129845
  353.         mul edx
  354.         mov eax, edx
  355.         shr eax, 4
  356.    
  357.     .ELSEIF eax == 160
  358.         mov eax, dwNumber
  359.         mov edx, -858993459
  360.         mul edx
  361.         mov eax, edx
  362.         shr eax, 7
  363.    
  364.     .ELSEIF eax == 165
  365.         mov eax, dwNumber
  366.         mov edx, 1665926709
  367.         mul edx
  368.         mov eax, edx
  369.         shr eax, 6
  370.    
  371.     .ELSEIF eax == 176
  372.         mov eax, dwNumber
  373.         mov edx, -1171354717
  374.         mul edx
  375.         mov eax, edx
  376.         shr eax, 7
  377.    
  378.     .ELSEIF eax == 180
  379.         mov eax, dwNumber
  380.         shr eax, 2
  381.         mov edx, 381774871
  382.         mul edx
  383.         mov eax, edx
  384.         shr eax, 2
  385.    
  386.     .ELSEIF eax == 192
  387.         mov eax, dwNumber
  388.         mov edx, -1431655765
  389.         mul edx
  390.         mov eax, edx
  391.         shr eax, 7
  392.    
  393.     .ELSEIF eax == 200
  394.         mov eax, dwNumber
  395.         mov edx, 1374389535
  396.         mul edx
  397.         mov eax, edx
  398.         shr eax, 6
  399.    
  400.     .ELSEIF eax == 225
  401.         mov eax, dwNumber
  402.         mov edx, -1851608123
  403.         mul edx
  404.         mov eax, edx
  405.         shr eax, 7
  406.    
  407.     .ELSEIF eax == 250
  408.         mov eax, dwNumber
  409.         mov edx, 274877907
  410.         mul edx
  411.         mov eax, edx
  412.         shr eax, 4
  413.    
  414.     .ELSEIF eax == 256
  415.         mov eax, dwNumber
  416.         shr eax, 8
  417.    
  418.     .ELSEIF eax == 270
  419.         mov eax, dwNumber
  420.         mov edx, -222702007
  421.         mul edx
  422.         mov eax, edx
  423.         shr eax, 8
  424.    
  425.     .ELSEIF eax == 300
  426.         mov eax, dwNumber
  427.         mov edx, 458129845
  428.         mul edx
  429.         mov eax, edx
  430.         shr eax, 5
  431.    
  432.     .ELSEIF eax == 315
  433.         mov eax, dwNumber
  434.         mov edx, -1608908383
  435.         mov ecx, eax
  436.         mul edx
  437.         mov eax, ecx
  438.         sub eax, edx
  439.         shr eax, 1
  440.         add eax, edx
  441.         shr eax, 8
  442.    
  443.     .ELSEIF eax == 360
  444.         mov eax, dwNumber
  445.         shr eax, 3
  446.         mov edx, 381774871
  447.         mul edx
  448.         mov eax, edx
  449.         shr eax, 2
  450.    
  451.     .ELSEIF eax == 480
  452.         mov eax, dwNumber
  453.         mov edx, -2004318071
  454.         mul edx
  455.         mov eax, edx
  456.         shr eax, 8
  457.    
  458.     .ELSEIF eax == 500
  459.         mov eax, dwNumber
  460.         mov edx, 274877907
  461.         mul edx
  462.         mov eax, edx
  463.         shr eax, 5
  464.    
  465.     .ELSEIF eax == 512
  466.         mov eax, dwNumber
  467.         shr eax, 9
  468.    
  469.     .ELSEIF eax == 640
  470.         mov eax, dwNumber
  471.         mov edx, -858993459
  472.         mul edx
  473.         mov eax, edx
  474.         shr eax, 9
  475.    
  476.     .ELSEIF eax == 1000
  477.         mov eax, dwNumber
  478.         mov edx, 274877907
  479.         mul edx
  480.         mov eax, edx
  481.         shr eax, 6
  482.    
  483.     .ELSEIF eax == 1024
  484.         mov eax, dwNumber
  485.         shr eax, 10
  486.    
  487.     .ELSEIF eax == 1080
  488.         mov eax, dwNumber
  489.         mov edx, -222702007
  490.         mul edx
  491.         mov eax, edx
  492.         shr eax, 10
  493.    
  494.     .ELSEIF eax == 1440
  495.         mov eax, dwNumber
  496.         shr eax, 5
  497.         mov edx, 95443718
  498.         mul edx
  499.         mov eax, edx
  500.    
  501.     .ELSEIF eax == 1920
  502.         mov eax, dwNumber
  503.         mov edx, -2004318071
  504.         mul edx
  505.         mov eax, edx
  506.         shr eax, 10
  507.    
  508.     .ELSEIF eax == 2000
  509.         mov eax, dwNumber
  510.         mov edx, 274877907
  511.         mul edx
  512.         mov eax, edx
  513.         shr eax, 7
  514.    
  515.     .ELSEIF eax == 2048
  516.         mov eax, dwNumber
  517.         shr eax, 11
  518.    
  519.     .ELSEIF eax == 2560
  520.         mov eax, dwNumber
  521.         mov edx, -858993459
  522.         mul edx
  523.         mov eax, edx
  524.         shr eax, 11
  525.    
  526.     .ELSEIF eax == 4096
  527.         mov eax, dwNumber
  528.         shr eax, 12
  529.    
  530.     .ELSEIF eax == 5000
  531.         mov eax, dwNumber
  532.         mov edx, -776530087
  533.         mul edx
  534.         mov eax, edx
  535.         shr eax, 12
  536.    
  537.     .ELSEIF eax == 8192
  538.         mov eax, dwNumber
  539.         shr eax, 13
  540.    
  541.     .ELSEIF eax == 10000
  542.         mov eax, dwNumber
  543.         mov edx, -776530087
  544.         mul edx
  545.         mov eax, edx
  546.         shr eax, 13
  547.    
  548.     .ELSEIF eax == 16384
  549.         mov eax, dwNumber
  550.         shr eax, 14
  551.    
  552.     .ELSEIF eax == 32768
  553.         mov eax, dwNumber
  554.         shr eax, 15
  555.    
  556.     .ELSEIF eax == 65536
  557.         mov eax, dwNumber
  558.         shr eax, 16
  559.    
  560.     .ELSEIF eax == 131072
  561.         mov eax, dwNumber
  562.         shr eax, 17
  563.        
  564.     .ELSEIF eax == 262144
  565.         mov eax, dwNumber
  566.         shr eax, 18
  567.        
  568.     .ELSEIF eax == 524288
  569.         mov eax, dwNumber
  570.         shr eax, 19
  571.        
  572.     .ELSEIF eax == 1048576
  573.         mov eax, dwNumber
  574.         shr eax, 20
  575.        
  576.        
  577.     .ELSE
  578.        
  579.         mov eax, dwNumber
  580.         mov ecx, dwDivisor
  581.         xor edx, edx
  582.         .IF eax != 0 && ecx != 0
  583.             div ecx
  584.         .ELSE
  585.             mov eax, 0
  586.         .ENDIF
  587.         ; result in eax
  588.    
  589.     .ENDIF
  590.    
  591.     ret
  592. _HV_FastDivide ENDP
  593.  
  594.  
  595. MUI_ALIGN
  596. ;------------------------------------------------------------------------------
  597. ; _HV_MODX - Calc the modulus of an unsigned number
  598. ; Remainder of division without div instruction for common mod numbers
  599. ; https://godbolt.org/z/sKWfdqYPP
  600. ;------------------------------------------------------------------------------
  601. _HV_MODX PROC USES ECX EDX dwNumber:DWORD, dwMod:DWORD
  602.    
  603.     .IF dwNumber == 0
  604.         mov eax, 0
  605.         ret
  606.     .ENDIF
  607.    
  608.     mov eax, dwMod
  609.     .IF eax == 0 || eax == 1
  610.         mov eax, 0
  611.         ret
  612.    
  613.     .ELSEIF eax == 2
  614.         mov eax, dwNumber
  615.         and eax, 1
  616.        
  617.     .ELSEIF eax == 3
  618.         mov eax, dwNumber
  619.         mov edx, -1431655765
  620.         mov ecx, eax
  621.         mul edx
  622.         mov eax, edx
  623.         and edx, -2
  624.         shr eax, 1
  625.         add edx, eax
  626.         mov eax, ecx
  627.         sub eax, edx
  628.    
  629.     .ELSEIF eax == 4
  630.         mov eax, dwNumber
  631.         and eax, 3
  632.        
  633.     .ELSEIF eax == 5
  634.         mov eax, dwNumber
  635.         mov edx, -858993459
  636.         mov ecx, eax
  637.         mul edx
  638.         mov eax, edx
  639.         and edx, -4
  640.         shr eax, 2
  641.         add edx, eax
  642.         mov eax, ecx
  643.         sub eax, edx
  644.        
  645.     .ELSEIF eax == 6
  646.         mov eax, dwNumber
  647.         mov edx, -1431655765
  648.         mov ecx, eax
  649.         mul edx
  650.         mov eax, edx
  651.         shr eax, 2
  652.         lea eax, [eax+eax*2]
  653.         add eax, eax
  654.         sub ecx, dwNumber
  655.         mov eax, ecx
  656.    
  657.     .ELSEIF eax == 7
  658.         mov eax, dwNumber
  659.         mov edx, 613566757
  660.         mov ecx, eax
  661.         mul edx
  662.         mov eax, ecx
  663.         sub eax, edx
  664.         shr eax, 1
  665.         add eax, edx
  666.         shr eax, 2
  667.         lea edx, [0+eax*8]
  668.         sub edx, eax
  669.         mov eax, ecx
  670.         sub eax, edx
  671.        
  672.     .ELSEIF eax == 8
  673.         mov eax, dwNumber
  674.         and eax, 7
  675.        
  676.     .ELSEIF eax == 9
  677.         mov eax, dwNumber
  678.         mov edx, 954437177
  679.         mov ecx, eax
  680.         mul edx
  681.         mov eax, edx
  682.         shr eax, 1
  683.         lea eax, [eax+eax*8]
  684.         sub ecx, eax
  685.         mov eax, ecx
  686.        
  687.     .ELSEIF eax == 10
  688.         mov eax, dwNumber
  689.         mov edx, -858993459
  690.         mov ecx, eax
  691.         mul edx
  692.         mov eax, edx
  693.         shr eax, 3
  694.         lea eax, [eax+eax*4]
  695.         add eax, eax
  696.         sub ecx, eax
  697.         mov eax, ecx
  698.        
  699.     .ELSEIF eax == 11
  700.         mov eax, dwNumber
  701.         mov edx, -1171354717
  702.         mov ecx, eax
  703.         mul edx
  704.         mov eax, edx
  705.         shr eax, 3
  706.         lea edx, [eax+eax*4]
  707.         lea eax, [eax+edx*2]
  708.         sub ecx, eax
  709.         mov eax, ecx
  710.        
  711.     .ELSEIF eax == 12
  712.         mov eax, dwNumber
  713.         mov edx, -1431655765
  714.         mov ecx, eax
  715.         mul edx
  716.         mov eax, edx
  717.         shr eax, 3
  718.         lea eax, [eax+eax*2]
  719.         sal eax, 2
  720.         sub ecx, eax
  721.         mov eax, ecx
  722.        
  723.     .ELSEIF eax == 13
  724.         mov eax, dwNumber
  725.         mov edx, 1321528399
  726.         mov ecx, eax
  727.         mul edx
  728.         mov eax, edx
  729.         shr eax, 2
  730.         lea edx, [eax+eax*2]
  731.         lea eax, [eax+edx*4]
  732.         sub ecx, eax
  733.         mov eax, ecx
  734.        
  735.     .ELSEIF eax == 14
  736.         mov eax, dwNumber
  737.         mov ecx, eax
  738.         mov edx, -1840700269
  739.         shr eax, 1
  740.         mul edx
  741.         mov eax, edx
  742.         shr eax, 2
  743.         imul eax, eax, 14
  744.         sub ecx, eax
  745.         mov eax, ecx
  746.        
  747.     .ELSEIF eax == 15
  748.         mov eax, dwNumber
  749.         mov edx, -2004318071
  750.         mov ecx, eax
  751.         mul edx
  752.         mov eax, edx
  753.         shr eax, 3
  754.         mov edx, eax
  755.         sal edx, 4
  756.         sub edx, eax
  757.         mov eax, ecx
  758.         sub eax, edx
  759.        
  760.     .ELSEIF eax == 16
  761.         mov eax, dwNumber
  762.         and eax, 15
  763.        
  764.     .ELSEIF eax == 20
  765.         mov eax, dwNumber
  766.         mov edx, -858993459
  767.         mov ecx, eax
  768.         mul edx
  769.         mov eax, edx
  770.         shr eax, 4
  771.         lea eax, [eax+eax*4]
  772.         sal eax, 2
  773.         sub ecx, eax
  774.         mov eax, ecx
  775.    
  776.     .ELSEIF eax == 24
  777.         mov eax, dwNumber
  778.         mov edx, -1431655765
  779.         mov ecx, eax
  780.         mul edx
  781.         mov eax, edx
  782.         shr eax, 4
  783.         lea eax, [eax+eax*2]
  784.         sal eax, 3
  785.         sub ecx, eax
  786.         mov eax, ecx
  787.    
  788.     .ELSEIF eax == 25
  789.         mov eax, dwNumber
  790.         mov edx, 1374389535
  791.         mov ecx, eax
  792.         mul edx
  793.         mov eax, edx
  794.         shr eax, 3
  795.         lea eax, [eax+eax*4]
  796.         lea eax, [eax+eax*4]
  797.         sub ecx, eax
  798.         mov eax, ecx
  799.    
  800.     .ELSEIF eax == 28
  801.         mov eax, dwNumber
  802.         mov edx, eax
  803.         push ebx
  804.         mov ecx, eax
  805.         mov ebx, 613566757
  806.         shr edx, 2
  807.         mov eax, edx
  808.         mul ebx
  809.         mov eax, ecx
  810.         pop ebx
  811.         imul edx, edx, 28
  812.         sub eax, edx
  813.    
  814.     .ELSEIF eax == 30
  815.         mov eax, dwNumber
  816.         mov edx, -2004318071
  817.         mov ecx, eax
  818.         mul edx
  819.         mov eax, edx
  820.         shr eax, 4
  821.         imul eax, eax, 30
  822.         sub ecx, eax
  823.         mov eax, ecx
  824.    
  825.     .ELSEIF eax == 32
  826.         mov eax, dwNumber
  827.         and eax, 31
  828.    
  829.     .ELSEIF eax == 36
  830.         mov eax, dwNumber
  831.         mov edx, 954437177
  832.         mov ecx, eax
  833.         mul edx
  834.         mov eax, edx
  835.         and edx, 1073741816
  836.         shr eax, 3
  837.         add edx, eax
  838.         mov eax, ecx
  839.         sal edx, 2
  840.         sub eax, edx
  841.    
  842.     .ELSEIF eax == 40
  843.         mov eax, dwNumber
  844.         mov edx, -858993459
  845.         mov ecx, eax
  846.         mul edx
  847.         mov eax, edx
  848.         shr eax, 5
  849.         lea eax, [eax+eax*4]
  850.         sal eax, 3
  851.         sub ecx, eax
  852.         mov eax, ecx
  853.    
  854.     .ELSEIF eax == 44
  855.         mov eax, dwNumber
  856.         mov edx, -1171354717
  857.         mov ecx, eax
  858.         mul edx
  859.         mov eax, edx
  860.         shr eax, 5
  861.         imul eax, eax, 44
  862.         sub ecx, eax
  863.         mov eax, ecx
  864.        
  865.     .ELSEIF eax == 45
  866.         mov eax, dwNumber
  867.         mov edx, 1813430637
  868.         mov ecx, eax
  869.         mul edx
  870.         mov eax, ecx
  871.         sub eax, edx
  872.         shr eax, 1
  873.         add eax, edx
  874.         shr eax, 5
  875.         imul eax, eax, 45
  876.         sub ecx, eax
  877.         mov eax, ecx
  878.    
  879.     .ELSEIF eax == 48
  880.         mov eax, dwNumber
  881.         mov edx, -1431655765
  882.         mov ecx, eax
  883.         mul edx
  884.         mov eax, edx
  885.         shr eax, 5
  886.         lea eax, [eax+eax*2]
  887.         sal eax, 4
  888.         sub ecx, eax
  889.         mov eax, ecx
  890.    
  891.     .ELSEIF eax == 50
  892.         mov eax, dwNumber
  893.         mov edx, 1374389535
  894.         mov ecx, eax
  895.         mul edx
  896.         mov eax, edx
  897.         shr eax, 4
  898.         imul eax, eax, 50
  899.         sub ecx, eax
  900.         mov eax, ecx
  901.    
  902.     .ELSEIF eax == 52
  903.         mov eax, dwNumber
  904.         mov edx, 1321528399
  905.         mov ecx, eax
  906.         mul edx
  907.         mov eax, edx
  908.         shr eax, 4
  909.         imul eax, eax, 52
  910.         sub ecx, eax
  911.         mov eax, ecx
  912.    
  913.     .ELSEIF eax == 56
  914.         mov eax, dwNumber
  915.         mov edx, eax
  916.         push ebx
  917.         mov ecx, eax
  918.         mov ebx, 613566757
  919.         shr edx, 3
  920.         mov eax, edx
  921.         mul ebx
  922.         mov eax, ecx
  923.         pop ebx
  924.         imul edx, edx, 56
  925.         sub eax, edx
  926.    
  927.     .ELSEIF eax == 60
  928.         mov eax, dwNumber
  929.         mov edx, -2004318071
  930.         mov ecx, eax
  931.         mul edx
  932.         mov eax, edx
  933.         shr eax, 5
  934.         imul eax, eax, 60
  935.         sub ecx, eax
  936.         mov eax, ecx
  937.    
  938.     .ELSEIF eax == 64
  939.         mov eax, dwNumber
  940.         and eax, 63
  941.    
  942.     .ELSEIF eax == 68
  943.         mov eax, dwNumber
  944.         mov edx, -252645135
  945.         mov ecx, eax
  946.         mul edx
  947.         mov eax, edx
  948.         shr eax, 6
  949.         imul eax, eax, 68
  950.         sub ecx, eax
  951.         mov eax, ecx
  952.        
  953.     .ELSEIF eax == 72
  954.         mov eax, dwNumber
  955.         mov edx, 954437177
  956.         mov ecx, eax
  957.         mul edx
  958.         mov eax, edx
  959.         shr eax, 4
  960.         lea eax, [eax+eax*8]
  961.         sal eax, 3
  962.         sub ecx, eax
  963.         mov eax, ecx
  964.    
  965.     .ELSEIF eax == 75
  966.         mov eax, dwNumber
  967.         mov edx, 458129845
  968.         mov ecx, eax
  969.         mul edx
  970.         mov eax, edx
  971.         shr eax, 3
  972.         imul eax, eax, 75
  973.         sub ecx, eax
  974.         mov eax, ecx
  975.    
  976.     .ELSEIF eax == 76
  977.         mov eax, dwNumber
  978.         mov ecx, eax
  979.         mov edx, 452101821
  980.         shr eax, 2
  981.         mul edx
  982.         mov eax, edx
  983.         shr eax, 1
  984.         imul eax, eax, 76
  985.         sub ecx, eax
  986.         mov eax, ecx
  987.    
  988.     .ELSEIF eax == 80
  989.         mov eax, dwNumber
  990.         mov edx, -858993459
  991.         mov ecx, eax
  992.         mul edx
  993.         mov eax, edx
  994.         shr eax, 6
  995.         lea eax, [eax+eax*4]
  996.         sal eax, 4
  997.         sub ecx, eax
  998.         mov eax, ecx
  999.    
  1000.     .ELSEIF eax == 84
  1001.         mov eax, dwNumber
  1002.         mov ecx, eax
  1003.         mov edx, 818089009
  1004.         shr eax, 2
  1005.         mul edx
  1006.         mov eax, edx
  1007.         shr eax, 2
  1008.         imul eax, eax, 84
  1009.         sub ecx, eax
  1010.         mov eax, ecx
  1011.    
  1012.     .ELSEIF eax == 88
  1013.         mov eax, dwNumber
  1014.         mov edx, -1171354717
  1015.         mov ecx, eax
  1016.         mul edx
  1017.         mov eax, edx
  1018.         shr eax, 6
  1019.         imul eax, eax, 88
  1020.         sub ecx, eax
  1021.         mov eax, ecx
  1022.    
  1023.     .ELSEIF eax == 90
  1024.         mov eax, dwNumber
  1025.         mov ecx, eax
  1026.         mov edx, -1240768329
  1027.         shr eax, 1
  1028.         mul edx
  1029.         mov eax, edx
  1030.         shr eax, 5
  1031.         imul eax, eax, 90
  1032.         sub ecx, eax
  1033.         mov eax, ecx
  1034.    
  1035.     .ELSEIF eax == 92
  1036.         mov eax, dwNumber
  1037.         mov edx, -1307163959
  1038.         mov ecx, eax
  1039.         mul edx
  1040.         mov eax, edx
  1041.         shr eax, 6
  1042.         imul eax, eax, 92
  1043.         sub ecx, eax
  1044.         mov eax, ecx
  1045.    
  1046.     .ELSEIF eax == 96
  1047.         mov eax, dwNumber
  1048.         mov edx, -1431655765
  1049.         mov ecx, eax
  1050.         mul edx
  1051.         mov eax, edx
  1052.         shr eax, 6
  1053.         lea eax, [eax+eax*2]
  1054.         sal eax, 5
  1055.         sub ecx, eax
  1056.         mov eax, ecx
  1057.    
  1058.     .ELSEIF eax == 100
  1059.         mov eax, dwNumber
  1060.         mov edx, 1374389535
  1061.         mov ecx, eax
  1062.         mul edx
  1063.         mov eax, edx
  1064.         shr eax, 5
  1065.         imul eax, eax, 100
  1066.         sub ecx, eax
  1067.         mov eax, ecx
  1068.    
  1069.     .ELSEIF eax == 120
  1070.         mov eax, dwNumber
  1071.         mov edx, -2004318071
  1072.         mov ecx, eax
  1073.         mul edx
  1074.         mov eax, edx
  1075.         shr eax, 6
  1076.         imul eax, eax, 120
  1077.         sub ecx, eax
  1078.         mov eax, ecx
  1079.        
  1080.     .ELSEIF eax == 125
  1081.         mov eax, dwNumber
  1082.         mov edx, 274877907
  1083.         mov ecx, eax
  1084.         mul edx
  1085.         mov eax, edx
  1086.         shr eax, 3
  1087.         imul eax, eax, 125
  1088.         sub ecx, eax
  1089.         mov eax, ecx
  1090.    
  1091.     .ELSEIF eax == 128
  1092.         mov eax, dwNumber
  1093.         and eax, 127
  1094.    
  1095.     .ELSEIF eax == 135
  1096.         mov eax, dwNumber
  1097.         mov edx, -222702007
  1098.         mov ecx, eax
  1099.         mul edx
  1100.         mov eax, edx
  1101.         shr eax, 7
  1102.         imul eax, eax, 135
  1103.         sub ecx, eax
  1104.         mov eax, ecx
  1105.    
  1106.     .ELSEIF eax == 144
  1107.         mov eax, dwNumber
  1108.         mov edx, 954437177
  1109.         mov ecx, eax
  1110.         mul edx
  1111.         mov eax, edx
  1112.         shr eax, 5
  1113.         lea eax, [eax+eax*8]
  1114.         sal eax, 4
  1115.         sub ecx, eax
  1116.         mov eax, ecx
  1117.    
  1118.     .ELSEIF eax == 150
  1119.         mov eax, dwNumber
  1120.         mov edx, 458129845
  1121.         mov ecx, eax
  1122.         mul edx
  1123.         mov eax, edx
  1124.         shr eax, 4
  1125.         imul eax, eax, 150
  1126.         sub ecx, eax
  1127.         mov eax, ecx
  1128.    
  1129.     .ELSEIF eax == 175
  1130.         mov eax, dwNumber
  1131.         mov edx, 1570730897
  1132.         mov ecx, eax
  1133.         mul edx
  1134.         mov eax, edx
  1135.         shr eax, 6
  1136.         imul eax, eax, 175
  1137.         sub ecx, eax
  1138.         mov eax, ecx
  1139.    
  1140.     .ELSEIF eax == 180
  1141.         mov eax, dwNumber
  1142.         mov ecx, eax
  1143.         mov edx, 381774871
  1144.         shr eax, 2
  1145.         mul edx
  1146.         mov eax, edx
  1147.         shr eax, 2
  1148.         imul eax, eax, 180
  1149.         sub ecx, eax
  1150.         mov eax, ecx
  1151.    
  1152.     .ELSEIF eax == 192
  1153.         mov eax, dwNumber
  1154.         mov edx, -1431655765
  1155.         mov ecx, eax
  1156.         mul edx
  1157.         mov eax, edx
  1158.         shr eax, 7
  1159.         lea eax, [eax+eax*2]
  1160.         sal eax, 6
  1161.         sub ecx, eax
  1162.         mov eax, ecx
  1163.    
  1164.     .ELSEIF eax == 200
  1165.         mov eax, dwNumber
  1166.         mov edx, 1374389535
  1167.         mov ecx, eax
  1168.         mul edx
  1169.         mov eax, edx
  1170.         shr eax, 6
  1171.         imul eax, eax, 200
  1172.         sub ecx, eax
  1173.         mov eax, ecx
  1174.    
  1175.     .ELSEIF eax == 225
  1176.         mov eax, dwNumber
  1177.         mov edx, -1851608123
  1178.         mov ecx, eax
  1179.         mul edx
  1180.         mov eax, edx
  1181.         shr eax, 7
  1182.         imul eax, eax, 225
  1183.         sub ecx, eax
  1184.         mov eax, ecx
  1185.    
  1186.     .ELSEIF eax == 256
  1187.         mov eax, dwNumber
  1188.         movzx eax, al
  1189.    
  1190.     .ELSEIF eax == 270
  1191.         mov eax, dwNumber
  1192.         mov edx, -222702007
  1193.         mov ecx, eax
  1194.         mul edx
  1195.         mov eax, edx
  1196.         shr eax, 8
  1197.         imul eax, eax, 270
  1198.         sub ecx, eax
  1199.         mov eax, ecx
  1200.    
  1201.     .ELSEIF eax == 300
  1202.         mov eax, dwNumber
  1203.         mov edx, 458129845
  1204.         mov ecx, eax
  1205.         mul edx
  1206.         mov eax, edx
  1207.         shr eax, 5
  1208.         imul eax, eax, 300
  1209.         sub ecx, eax
  1210.         mov eax, ecx
  1211.    
  1212.     .ELSEIF eax == 315
  1213.         mov eax, dwNumber
  1214.         mov edx, -1608908383
  1215.         mov ecx, eax
  1216.         mul edx
  1217.         mov eax, ecx
  1218.         sub eax, edx
  1219.         shr eax, 1
  1220.         add eax, edx
  1221.         shr eax, 8
  1222.         imul eax, eax, 315
  1223.         sub ecx, eax
  1224.         mov eax, ecx
  1225.    
  1226.     .ELSEIF eax == 360
  1227.         mov eax, dwNumber
  1228.         mov ecx, eax
  1229.         mov edx, 381774871
  1230.         shr eax, 3
  1231.         mul edx
  1232.         mov eax, edx
  1233.         shr eax, 2
  1234.         imul eax, eax, 360
  1235.         sub ecx, eax
  1236.         mov eax, ecx
  1237.    
  1238.     .ELSEIF eax == 480
  1239.         mov eax, dwNumber
  1240.         mov edx, -2004318071
  1241.         mov ecx, eax
  1242.         mul edx
  1243.         mov eax, edx
  1244.         shr eax, 8
  1245.         imul eax, eax, 480
  1246.         sub ecx, eax
  1247.         mov eax, ecx
  1248.    
  1249.     .ELSEIF eax == 512
  1250.         mov eax, dwNumber
  1251.         and eax, 511
  1252.    
  1253.     .ELSEIF eax == 768
  1254.         mov eax, dwNumber
  1255.         mov edx, -1431655765
  1256.         mov ecx, eax
  1257.         mul edx
  1258.         mov eax, edx
  1259.         shr eax, 9
  1260.         lea eax, [eax+eax*2]
  1261.         sal eax, 8
  1262.         sub ecx, eax
  1263.         mov eax, ecx
  1264.    
  1265.     .ELSEIF eax == 1000
  1266.         mov eax, dwNumber
  1267.         mov edx, 274877907
  1268.         mov ecx, eax
  1269.         mul edx
  1270.         mov eax, edx
  1271.         shr eax, 6
  1272.         imul eax, eax, 1000
  1273.         sub ecx, eax
  1274.         mov eax, ecx
  1275.    
  1276.     .ELSEIF eax == 1024
  1277.         mov eax, dwNumber
  1278.         and eax, 1023
  1279.    
  1280.     .ELSEIF eax == 1080
  1281.         mov eax, dwNumber
  1282.         mov edx, -222702007
  1283.         mov ecx, eax
  1284.         mul edx
  1285.         mov eax, edx
  1286.         shr eax, 10
  1287.         imul eax, eax, 1080
  1288.         sub ecx, eax
  1289.         mov eax, ecx
  1290.    
  1291.     .ELSEIF eax == 1440
  1292.         mov eax, dwNumber
  1293.         mov edx, eax
  1294.         push ebx
  1295.         mov ecx, eax
  1296.         mov ebx, 95443718
  1297.         shr edx, 5
  1298.         mov eax, edx
  1299.         mul ebx
  1300.         mov eax, ecx
  1301.         pop ebx
  1302.         imul edx, edx, 1440
  1303.         sub eax, edx
  1304.    
  1305.     .ELSEIF eax == 1920
  1306.         mov eax, dwNumber
  1307.         mov edx, -2004318071
  1308.         mov ecx, eax
  1309.         mul edx
  1310.         mov eax, edx
  1311.         shr eax, 10
  1312.         imul eax, eax, 1920
  1313.         sub ecx, eax
  1314.         mov eax, ecx
  1315.    
  1316.     .ELSEIF eax == 2000
  1317.         mov eax, dwNumber
  1318.         mov edx, 274877907
  1319.         mov ecx, eax
  1320.         mul edx
  1321.         mov eax, edx
  1322.         shr eax, 7
  1323.         imul eax, eax, 2000
  1324.         sub ecx, eax
  1325.         mov eax, ecx
  1326.        
  1327.     .ELSEIF eax == 2048
  1328.         mov eax, dwNumber
  1329.         and eax, 2047
  1330.    
  1331.     .ELSEIF eax == 2560
  1332.         mov eax, dwNumber
  1333.         mov edx, -858993459
  1334.         mov ecx, eax
  1335.         mul edx
  1336.         mov eax, edx
  1337.         shr eax, 11
  1338.         lea eax, [eax+eax*4]
  1339.         sal eax, 9
  1340.         sub ecx, eax
  1341.         mov eax, ecx
  1342.    
  1343.     .ELSEIF eax == 4096
  1344.         mov eax, dwNumber
  1345.         and eax, 4095
  1346.    
  1347.     .ELSEIF eax == 8192
  1348.         mov eax, dwNumber
  1349.         and eax, 8191
  1350.    
  1351.     .ELSEIF eax == 10000
  1352.         mov eax, dwNumber
  1353.         mov edx, -776530087
  1354.         mov ecx, eax
  1355.         mul edx
  1356.         mov eax, edx
  1357.         shr eax, 13
  1358.         imul eax, eax, 10000
  1359.         sub ecx, eax
  1360.         mov eax, ecx
  1361.    
  1362.     .ELSEIF eax == 16384
  1363.         mov eax, dwNumber
  1364.         and eax, 16383
  1365.        
  1366.     .ELSEIF eax == 32768
  1367.         mov eax, dwNumber
  1368.         and eax, 32767
  1369.    
  1370.     .ELSEIF eax == 65536
  1371.         mov eax, dwNumber
  1372.         movzx eax, ax
  1373.    
  1374.     .ELSEIF eax == 131072
  1375.         mov eax, dwNumber
  1376.         and eax, 131071
  1377.        
  1378.     .ELSEIF eax == 262144
  1379.         mov eax, dwNumber
  1380.         and eax, 262143
  1381.        
  1382.     .ELSEIF eax == 524288
  1383.         mov eax, dwNumber
  1384.         and eax, 524287
  1385.        
  1386.     .ELSEIF eax == 1048576
  1387.         mov eax, dwNumber
  1388.         and eax, 1048575
  1389.    
  1390.     .ELSE
  1391.         mov eax, dwNumber
  1392.         mov ecx, dwMod
  1393.         xor edx, edx
  1394.         div ecx
  1395.         mov eax, edx
  1396.     .ENDIF
  1397.  
  1398.     ret
  1399. _HV_MODX ENDP
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement