home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / crypl200.zip / BNLIB / LBNALPHA.S < prev    next >
Text File  |  1996-05-16  |  6KB  |  195 lines

  1. /*
  2.  * DEC Alpha 64-bit math primitives.  These use 64-bit words
  3.  * unless otherwise noted.
  4.  *
  5.  * Copyright (c) 1995, Colin Plumb.
  6.  * For licensing and other legal details, see the file legal.c.
  7.  *
  8.  * The DEC assembler apparently does some instruction scheduling,
  9.  * but I tried to do some of my own, and tries to spread things
  10.  * out over the register file to give the assembler more room
  11.  * to schedule things.
  12.  *
  13.  * Alpha OSF/1 register usage conventions:
  14.  * r0       - v0      - Temp, holds integer return value
  15.  * r1..r8   - t0..t7  - Temp, trashed by procedure call
  16.  * r9..r14  - s0..s5  - Saved across procedure calls
  17.  * r15      - s6/FP   - Frame pointer, saved across procedure calls
  18.  * r16..r21 - a0..a5  - Argument registers, all trashed by procedure call
  19.  * r22..r25 - t8..t11 - Temp, trashed by procedure call
  20.  * r26      - ra      - Return address
  21.  * r27      - t12/pv  - Procedure value, trashed by procedure call
  22.  * r28      - at      - Assembler temp, trashed by procedure call
  23.  * r29      - gp      - Global pointer
  24.  * r30      - sp      - Stack pointer
  25.  * r31      - zero    - hardwired to zero
  26.  */
  27.     .text
  28.     .align    4
  29.     .globl    lbnMulN1_64
  30. /* I have no idea what the '2' at the end of the .ent line means. */
  31.     .ent    lbnMulN1_64 2
  32. /*
  33.  * Arguments: $16 = out, $17 = in, $18 = len<32>, $19 = k
  34.  * Other registers: $0 = carry word, $1 = product low,
  35.  * $2 = product high, $3 = input word
  36.  */
  37. lbnMulN1_64:
  38.     ldq    $3,0($17)    /* Load first word of input */
  39.     subl    $18,1,$18
  40.     mulq    $3,$19,$1    /* Do low half of first multiply */
  41.     umulh    $3,$19,$0    /* Do second half of first multiply */
  42.     stq    $1,0($16)
  43.     beq    $18,m64_done
  44. m64_loop:
  45.     ldq    $3,8($17)
  46.     addq    $17,8,$17
  47.     mulq    $3,$19,$1    /* Do bottom half of multiply */
  48.     subl    $18,1,$18
  49.     umulh    $3,$19,$2    /* Do top half of multiply */
  50.     addq    $0,$1,$1    /* Add carry word from previous multiply */
  51.     stq    $1,8($16)
  52.     cmpult    $1,$0,$0    /* Compute carry bit from add */
  53.     addq    $16,8,$16
  54.     addq    $2,$0,$0    /* Add carry bit to carry word */
  55.  
  56.     beq    $18,m64_done
  57.  
  58.     ldq    $3,8($17)
  59.     addq    $17,8,$17
  60.     mulq    $3,$19,$1    /* Do bottom half of multiply */
  61.     subl    $18,1,$18
  62.     umulh    $3,$19,$2    /* Do top half of multiply */
  63.     addq    $0,$1,$1    /* Add carry word from previous multiply */
  64.     stq    $1,8($16)
  65.     cmpult    $1,$0,$0    /* Compute carry bit from add */
  66.     addq    $16,8,$16
  67.     addq    $2,$0,$0    /* Add carry bit to carry word */
  68.  
  69.     bne    $18,m64_loop
  70. m64_done:
  71.     stq    $0,8($16)    /* Store last word of result */
  72.     ret    $31,($26),1
  73. /* The '1' in the hint field means procedure return - software convention */
  74.     .end lbnMulN1_64
  75.  
  76.  
  77.     .text
  78.     .align    4
  79.     .globl    lbnMulAdd1_64
  80.     .ent    lbnMulAdd1_64 2
  81. /*
  82.  * Arguments: $16 = out, $17 = in, $18 = len<32>, $19 = k
  83.  * Other registers: $0 = product high, $1 = product low,
  84.  * $2 = product high temp, $3 = input word, $4 = output word
  85.  * $5 = carry bit from add to out
  86.  */
  87. lbnMulAdd1_64:
  88.     ldq    $3,0($17)    /* Load first word of input */
  89.     subl    $18,1,$18
  90.     mulq    $3,$19,$1    /* Do low half of first multiply */
  91.     ldq    $4,0($16)    /* Load first word of output */
  92.     umulh    $3,$19,$2    /* Do second half of first multiply */
  93.     addq    $4,$1,$4
  94.     cmpult    $4,$1,$5    /* Compute borrow bit from subtract */
  95.     stq    $4,0($16)
  96.     addq    $5,$2,$0    /* Add carry bit to high word */
  97.     beq    $18,ma64_done
  98. ma64_loop:
  99.     ldq    $3,8($17)    /* Load next word of input */
  100.     addq    $17,8,$17
  101.     ldq    $4,8($16)    /* Load next word of output */
  102.     mulq    $3,$19,$1    /* Do bottom half of multiply */
  103.     subl    $18,1,$18
  104.     addq    $0,$1,$1    /* Add carry word from previous multiply */
  105.     umulh    $3,$19,$2    /* Do top half of multiply */
  106.     cmpult    $1,$0,$0    /* Compute carry bit from add */
  107.     addq    $4,$1,$4    /* Add product to loaded word */
  108.     cmpult    $4,$1,$5    /* Compute carry bit from add */
  109.     stq    $4,8($16)
  110.     addq    $5,$0,$5    /* Add carry bits together */
  111.     addq    $16,8,$16
  112.     addq    $5,$2,$0    /* Add carry bits to carry word */
  113.  
  114.     beq    $18,ma64_done
  115.  
  116.     ldq    $3,8($17)    /* Load next word of input */
  117.     addq    $17,8,$17
  118.     ldq    $4,8($16)    /* Load next word of output */
  119.     mulq    $3,$19,$1    /* Do bottom half of multiply */
  120.     subl    $18,1,$18
  121.     addq    $0,$1,$1    /* Add carry word from previous multiply */
  122.     umulh    $3,$19,$2    /* Do top half of multiply */
  123.     cmpult    $1,$0,$0    /* Compute carry bit from add */
  124.     addq    $4,$1,$4    /* Add product to loaded word */
  125.     cmpult    $4,$1,$5    /* Compute carry bit from add */
  126.     stq    $4,8($16)
  127.     addq    $5,$0,$5    /* Add carry bits together */
  128.     addq    $16,8,$16
  129.     addq    $5,$2,$0    /* Add carry bits to carry word */
  130.  
  131.     bne    $18,ma64_loop
  132. ma64_done:
  133.     ret    $31,($26),1
  134.     .end lbnMulAdd1_64
  135.  
  136.  
  137.     .text
  138.     .align    4
  139.     .globl    lbnMulSub1_64
  140.     .ent    lbnMulSub1_64 2
  141. /*
  142.  * Arguments: $16 = out, $17 = in, $18 = len<32>, $19 = k
  143.  * Other registers: $0 = carry word, $1 = product low,
  144.  * $2 = product high temp, $3 = input word, $4 = output word
  145.  * $5 = borrow bit from subtract
  146.  */
  147. lbnMulSub1_64:
  148.     ldq    $3,0($17)    /* Load first word of input */
  149.     subl    $18,1,$18
  150.     mulq    $3,$19,$1    /* Do low half of first multiply */
  151.     ldq    $4,0($16)    /* Load first word of output */
  152.     umulh    $3,$19,$2    /* Do second half of first multiply */
  153.     cmpult    $4,$1,$5    /* Compute borrow bit from subtract */
  154.     subq    $4,$1,$4
  155.     addq    $5,$2,$0    /* Add carry bit to high word */
  156.     stq    $4,0($16)
  157.     beq    $18,ms64_done
  158. ms64_loop:
  159.     ldq    $3,8($17)    /* Load next word of input */
  160.     addq    $17,8,$17
  161.     ldq    $4,8($16)    /* Load next word of output */
  162.     mulq    $3,$19,$1    /* Do bottom half of multiply */
  163.     subl    $18,1,$18
  164.     addq    $0,$1,$1    /* Add carry word from previous multiply */
  165.     umulh    $3,$19,$2    /* Do top half of multiply */
  166.     cmpult    $1,$0,$0    /* Compute carry bit from add */
  167.     cmpult    $4,$1,$5    /* Compute borrow bit from subtract */
  168.     subq    $4,$1,$4
  169.     addq    $5,$0,$5    /* Add carry bits together */
  170.     stq    $4,8($16)
  171.     addq    $5,$2,$0    /* Add carry bits to carry word */
  172.     addq    $16,8,$16
  173.  
  174.     beq    $18,ms64_done
  175.  
  176.     ldq    $3,8($17)    /* Load next word of input */
  177.     addq    $17,8,$17
  178.     ldq    $4,8($16)    /* Load next word of output */
  179.     mulq    $3,$19,$1    /* Do bottom half of multiply */
  180.     subl    $18,1,$18
  181.     addq    $0,$1,$1    /* Add carry word from previous multiply */
  182.     umulh    $3,$19,$2    /* Do top half of multiply */
  183.     cmpult    $1,$0,$0    /* Compute carry bit from add */
  184.     cmpult    $4,$1,$5    /* Compute borrow bit from subtract */
  185.     subq    $4,$1,$4
  186.     addq    $5,$0,$5    /* Add carry bits together */
  187.     stq    $4,8($16)
  188.     addq    $5,$2,$0    /* Add carry bits to carry word */
  189.     addq    $16,8,$16
  190.  
  191.     bne    $18,ms64_loop
  192. ms64_done:
  193.     ret    $31,($26),1
  194.     .end lbnMulSub1_64
  195.