x86_64: Don't assume 8-byte pointer size
[openssl.git] / crypto / aes / asm / aesni-mb-x86_64.pl
index 3b2b569481fac1a5c70e67d407e301a6ac8ede15..0b86285d30195f29e0a6e6d94e79495f672c5896 100644 (file)
@@ -54,6 +54,11 @@ $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
 ( $xlate="${dir}../../perlasm/x86_64-xlate.pl" and -f $xlate) or
 die "can't locate x86_64-xlate.pl";
 
+push(@INC,"${dir}","${dir}../../perlasm");
+require "x86_64-support.pl";
+
+$ptr_size=&pointer_size($flavour);
+
 $avx=0;
 
 if (`$ENV{CC} -Wa,-v -c -o /dev/null -x assembler /dev/null 2>&1`
@@ -88,6 +93,8 @@ $inp="%rdi";  # 1st arg
 $key="%rsi";   # 2nd arg
 $num="%edx";
 
+$inp_elm_size=2*$ptr_size+8+16;
+
 @inptr=map("%r$_",(8..11));
 @outptr=map("%r$_",(12..15));
 
@@ -163,21 +170,25 @@ $code.=<<___;
 .Lenc4x_body:
        movdqu  ($key),$zero                    # 0-round key
        lea     0x78($key),$key                 # size optimization
-       lea     40*2($inp),$inp
+       lea     $inp_elm_size*2($inp),$inp
 
 .Lenc4x_loop_grande:
        mov     $num,24(%rsp)                   # original $num
        xor     $num,$num
 ___
 for($i=0;$i<4;$i++) {
+    $inptr_reg=&pointer_register($flavour,@inptr[$i]);
+    $outptr_reg=&pointer_register($flavour,@outptr[$i]);
     $code.=<<___;
-       mov     `40*$i+16-40*2`($inp),$one      # borrow $one for number of blocks
-       mov     `40*$i+0-40*2`($inp),@inptr[$i]
+       # borrow $one for number of blocks
+       mov     `$inp_elm_size*$i+2*$ptr_size-$inp_elm_size*2`($inp),$one
+       mov     `$inp_elm_size*$i+0-$inp_elm_size*2`($inp),$inptr_reg
        cmp     $num,$one
-       mov     `40*$i+8-40*2`($inp),@outptr[$i]
+       mov     `$inp_elm_size*$i+$ptr_size-$inp_elm_size*2`($inp),$outptr_reg
        cmovg   $one,$num                       # find maximum
        test    $one,$one
-       movdqu  `40*$i+24-40*2`($inp),@out[$i]  # load IV
+       # load IV
+       movdqu  `$inp_elm_size*$i+2*$ptr_size+8-$inp_elm_size*2`($inp),@out[$i]
        mov     $one,`32+4*$i`(%rsp)            # initialize counters
        cmovle  %rsp,@inptr[$i]                 # cancel input
 ___
@@ -335,14 +346,15 @@ $code.=<<___;
 
        #pxor   @inp[0],@out[0]
        #pxor   @inp[1],@out[1]
-       #movdqu @out[0],`40*0+24-40*2`($inp)    # output iv FIX ME!
+       # output iv FIX ME!
+       #movdqu @out[0],`$inp_elm_size*0+2*$ptr_size+8-$inp_elm_size*2`($inp)
        #pxor   @inp[2],@out[2]
-       #movdqu @out[1],`40*1+24-40*2`($inp)
+       #movdqu @out[1],`$inp_elm_size*1+2*$ptr_size+8-$inp_elm_size*2`($inp)
        #pxor   @inp[3],@out[3]
-       #movdqu @out[2],`40*2+24-40*2`($inp)    # won't fix, let caller
-       #movdqu @out[3],`40*3+24-40*2`($inp)    # figure this out...
+       #movdqu @out[2],`$inp_elm_size*2+2*$ptr_size+8-$inp_elm_size*2`($inp)   # won't fix, let caller
+       #movdqu @out[3],`$inp_elm_size*3+2*$ptr_size+8-$inp_elm_size*2`($inp)   # figure this out...
 
-       lea     `40*4`($inp),$inp
+       lea     `$inp_elm_size*4`($inp),$inp
        dec     $num
        jnz     .Lenc4x_loop_grande
 
@@ -440,21 +452,25 @@ $code.=<<___;
 .Ldec4x_body:
        movdqu  ($key),$zero                    # 0-round key
        lea     0x78($key),$key                 # size optimization
-       lea     40*2($inp),$inp
+       lea     $inp_elm_size*2($inp),$inp
 
 .Ldec4x_loop_grande:
        mov     $num,24(%rsp)                   # original $num
        xor     $num,$num
 ___
 for($i=0;$i<4;$i++) {
+    $inptr_reg=&pointer_register($flavour,@inptr[$i]);
+    $outptr_reg=&pointer_register($flavour,@outptr[$i]);
     $code.=<<___;
-       mov     `40*$i+16-40*2`($inp),$one      # borrow $one for number of blocks
-       mov     `40*$i+0-40*2`($inp),@inptr[$i]
+       # borrow $one for number of blocks
+       mov     `$inp_elm_size*$i+2*$ptr_size-$inp_elm_size*2`($inp),$one
+       mov     `$inp_elm_size*$i+0-$inp_elm_size*2`($inp),$inptr_reg
        cmp     $num,$one
-       mov     `40*$i+8-40*2`($inp),@outptr[$i]
+       mov     `$inp_elm_size*$i+$ptr_size-$inp_elm_size*2`($inp),$outptr_reg
        cmovg   $one,$num                       # find maximum
        test    $one,$one
-       movdqu  `40*$i+24-40*2`($inp),@inp[$i]  # load IV
+       # load IV
+       movdqu  `$inp_elm_size*$i+2*$ptr_size+8-$inp_elm_size*2`($inp),@inp[$i]
        mov     $one,`32+4*$i`(%rsp)            # initialize counters
        cmovle  %rsp,@inptr[$i]                 # cancel input
 ___
@@ -610,7 +626,7 @@ $code.=<<___;
 .cfi_def_cfa   %rax,8
        mov     24(%rsp),$num
 
-       lea     `40*4`($inp),$inp
+       lea     `$inp_elm_size*4`($inp),$inp
        dec     $num
        jnz     .Ldec4x_loop_grande
 
@@ -709,7 +725,7 @@ $code.=<<___;
        vzeroupper
        vmovdqu ($key),$zero                    # 0-round key
        lea     0x78($key),$key                 # size optimization
-       lea     40*4($inp),$inp
+       lea     `$inp_elm_size*4`($inp),$inp
        shr     \$1,$num
 
 .Lenc8x_loop_grande:
@@ -718,14 +734,20 @@ $code.=<<___;
 ___
 for($i=0;$i<8;$i++) {
   my $temp = $i ? $offload : $offset;
+    $ptr_reg=&pointer_register($flavour,@ptr[$i]);
+    $temp_reg=&pointer_register($flavour,$temp);
     $code.=<<___;
-       mov     `40*$i+16-40*4`($inp),$one      # borrow $one for number of blocks
-       mov     `40*$i+0-40*4`($inp),@ptr[$i]   # input pointer
+       # borrow $one for number of blocks
+       mov     `$inp_elm_size*$i+2*$ptr_size-$inp_elm_size*4`($inp),$one
+       # input pointer
+       mov     `$inp_elm_size*$i+0-$inp_elm_size*4`($inp),$ptr_reg
        cmp     $num,$one
-       mov     `40*$i+8-40*4`($inp),$temp      # output pointer
+       # output pointer
+       mov     `$inp_elm_size*$i+$ptr_size-$inp_elm_size*4`($inp),$temp_reg
        cmovg   $one,$num                       # find maximum
        test    $one,$one
-       vmovdqu `40*$i+24-40*4`($inp),@out[$i]  # load IV
+       # load IV
+       vmovdqu `$inp_elm_size*$i+2*$ptr_size+8-$inp_elm_size*4`($inp),@out[$i]
        mov     $one,`32+4*$i`(%rsp)            # initialize counters
        cmovle  %rsp,@ptr[$i]                   # cancel input
        sub     @ptr[$i],$temp                  # distance between input and output
@@ -910,7 +932,7 @@ $code.=<<___;
        mov     16(%rsp),%rax                   # original %rsp
 .cfi_def_cfa   %rax,8
        #mov    24(%rsp),$num
-       #lea    `40*8`($inp),$inp
+       #lea    `$inp_elm_size*8`($inp),$inp
        #dec    $num
        #jnz    .Lenc8x_loop_grande
 
@@ -1002,7 +1024,7 @@ $code.=<<___;
        vzeroupper
        vmovdqu ($key),$zero                    # 0-round key
        lea     0x78($key),$key                 # size optimization
-       lea     40*4($inp),$inp
+       lea     `$inp_elm_size*4`($inp),$inp
        shr     \$1,$num
 
 .Ldec8x_loop_grande:
@@ -1011,14 +1033,20 @@ $code.=<<___;
 ___
 for($i=0;$i<8;$i++) {
   my $temp = $i ? $offload : $offset;
+    $ptr_reg=&pointer_register($flavour,@ptr[$i]);
+    $temp_reg=&pointer_register($flavour,$temp);
     $code.=<<___;
-       mov     `40*$i+16-40*4`($inp),$one      # borrow $one for number of blocks
-       mov     `40*$i+0-40*4`($inp),@ptr[$i]   # input pointer
+       # borrow $one for number of blocks
+       mov     `$inp_elm_size*$i+2*$ptr_size-$inp_elm_size*4`($inp),$one
+       # input pointer
+       mov     `$inp_elm_size*$i+0-$inp_elm_size*4`($inp),$ptr_reg
        cmp     $num,$one
-       mov     `40*$i+8-40*4`($inp),$temp      # output pointer
+       # output pointer
+       mov     `$inp_elm_size*$i+$ptr_size-$inp_elm_size*4`($inp),$temp_reg
        cmovg   $one,$num                       # find maximum
        test    $one,$one
-       vmovdqu `40*$i+24-40*4`($inp),@out[$i]  # load IV
+       # load IV
+       vmovdqu `$inp_elm_size*$i+2*$ptr_size+8-$inp_elm_size*4`($inp),@out[$i]
        mov     $one,`32+4*$i`(%rsp)            # initialize counters
        cmovle  %rsp,@ptr[$i]                   # cancel input
        sub     @ptr[$i],$temp                  # distance between input and output
@@ -1234,7 +1262,7 @@ $code.=<<___;
        mov     16(%rsp),%rax                   # original %rsp
 .cfi_def_cfa   %rax,8
        #mov    24(%rsp),$num
-       #lea    `40*8`($inp),$inp
+       #lea    `$inp_elm_size*8`($inp),$inp
        #dec    $num
        #jnz    .Ldec8x_loop_grande