Eliminate conditional final subtraction in Montgomery assembler modules.
[openssl.git] / crypto / bn / asm / alpha-mont.pl
index d84093754804d82484aca34cabab8952816e8835..09f53a3622bad2330f3eb60e4246e1ff8b7227f8 100644 (file)
@@ -258,56 +258,48 @@ bn_mul_mont:
        stq     $hi1,16($tp)
        bne     $tj,.Louter
 \f
-       s8addq  $num,sp,$ap
-       mov     $rp,$bp
+       s8addq  $num,sp,$tj     # &tp[num]
+       mov     $rp,$bp         # put rp aside
        mov     sp,$tp
-       mov     0,$hi0
-
-       bne     $hi1,.Lsub
-       cmpult  $nj,$lo1,AT
-       bne     AT,.Lsub
-
-.align 4
-.Lcopy:        ldq     AT,($tp)
-       lda     $tp,8($tp)
-       stq     AT,($rp)
-       cmpult  $tp,$ap,AT
-       stq     zero,-8($tp)
-       nop
-       lda     $rp,8($rp)
-       bne     AT,.Lcopy
-       mov     1,v0
-       br      .Lexit
+       mov     sp,$ap
+       srl     $nj,62,AT       # boundary condition...
+       beq     AT,.Lcopy       # ... is met
+       mov     0,$hi0          # clear borrow bit
 
 .align 4
 .Lsub: ldq     $lo0,($tp)
        ldq     $lo1,($np)
-       subq    $lo0,$lo1,$lo1
+       lda     $tp,8($tp)
+       lda     $np,8($np)
+       subq    $lo0,$lo1,$lo1  # tp[i]-np[i]
        cmpult  $lo0,$lo1,AT
        subq    $lo1,$hi0,$lo0
        cmpult  $lo1,$lo0,$hi0
-       lda     $tp,8($tp)
        or      $hi0,AT,$hi0
-       lda     $np,8($np)
        stq     $lo0,($rp)
-       cmpult  $tp,$ap,v0
+       cmpult  $tp,$tj,v0
        lda     $rp,8($rp)
        bne     v0,.Lsub
 
-       subq    $hi1,$hi0,$hi0
+       subq    $hi1,$hi0,$hi0  # handle upmost overflow bit
        mov     sp,$tp
-       cmpule  $hi1,$hi0,AT
-       mov     $bp,$rp
-       bne     AT,.Lcopy
+       mov     $bp,$rp         # restore rp
+
+       and     sp,$hi0,$ap
+       bic     $bp,$hi0,$bp
+       bis     $bp,$ap,$ap     # ap=borrow?tp:rp
 
 .align 4
-.Lzap: stq     zero,($tp)
-       cmpult  $tp,$ap,AT
+.Lcopy:        ldq     $aj,($ap)       # copy or in-place refresh
        lda     $tp,8($tp)
-       bne     AT,.Lzap
+       lda     $rp,8($rp)
+       lda     $ap,8($ap)
+       stq     zero,-8($tp)    # zap tp
+       cmpult  $tp,$tj,AT
+       stq     $aj,-8($rp)
+       bne     AT,.Lcopy
        mov     1,v0
 
-.align 4
 .Lexit:
        .set    noreorder
        mov     fp,sp