PA-RISC assembly pack: make it work with GNU assembler for HP-UX.
[openssl.git] / crypto / sha / asm / sha512-parisc.pl
index 9ccbdaaf82bc5f2cef71e06cf4a8c77354547db1..d9933f0fec96af04c1fb418e622e1f301711f1c2 100755 (executable)
@@ -1,7 +1,14 @@
-#!/usr/bin/env perl
+#! /usr/bin/env perl
+# Copyright 2009-2016 The OpenSSL Project Authors. All Rights Reserved.
+#
+# Licensed under the OpenSSL license (the "License").  You may not use
+# this file except in compliance with the License.  You can obtain a copy
+# in the file LICENSE in the source distribution or at
+# https://www.openssl.org/source/license.html
+
 
 # ====================================================================
-# Written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL
+# Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
 # project. The module is, however, dual licensed under OpenSSL and
 # CRYPTOGAMS licenses depending on where you obtain it. For further
 # details see http://www.openssl.org/~appro/cryptogams/.
@@ -19,7 +26,7 @@
 # SHA512 performance is >2.9x better than gcc 3.2 generated code on
 # PA-7100LC, PA-RISC 1.1 processor. Then implementation detects if the
 # code is executed on PA-RISC 2.0 processor and switches to 64-bit
-# code path delivering adequate peformance even in "blended" 32-bit
+# code path delivering adequate performance even in "blended" 32-bit
 # build. Though 64-bit code is not any faster than code generated by
 # vendor compiler on PA-8600...
 #
@@ -361,7 +368,7 @@ L\$parisc1
 ___
 
 @V=(  $Ahi,  $Alo,  $Bhi,  $Blo,  $Chi,  $Clo,  $Dhi,  $Dlo,
-      $Ehi,  $Elo,  $Fhi,  $Flo,  $Ghi,  $Glo,  $Hhi,  $Hlo) = 
+      $Ehi,  $Elo,  $Fhi,  $Flo,  $Ghi,  $Glo,  $Hhi,  $Hlo) =
    ( "%r1", "%r2", "%r3", "%r4", "%r5", "%r6", "%r7", "%r8",
      "%r9","%r10","%r11","%r12","%r13","%r14","%r15","%r16");
 $a0 ="%r17";
@@ -412,7 +419,7 @@ $code.=<<___;
         add    $t0,$hlo,$hlo
        shd     $ahi,$alo,$Sigma0[0],$t0
         addc   $t1,$hhi,$hhi           ; h += Sigma1(e)
-       shd     $alo,$ahi,$Sigma0[0],$t1        
+       shd     $alo,$ahi,$Sigma0[0],$t1
         add    $a0,$hlo,$hlo
        shd     $ahi,$alo,$Sigma0[1],$t2
         addc   $a1,$hhi,$hhi           ; h += Ch(e,f,g)
@@ -694,7 +701,7 @@ my $ldd = sub {
   my ($mod,$args) = @_;
   my $orig = "ldd$mod\t$args";
 
-    if ($args =~ /(\-[0-9]+)\(%r([0-9]+)\),%r([0-9]+)/)        # format 3 suffices
+    if ($args =~ /(\-?[0-9]+)\(%r([0-9]+)\),%r([0-9]+)/) # format 3 suffices
     {  my $opcode=(0x14<<26)|($2<<21)|($3<<16)|(($1&0x1FF8)<<1)|(($1>>13)&1);
        $opcode|=(1<<3) if ($mod =~ /^,m/);
        $opcode|=(1<<2) if ($mod =~ /^,mb/);
@@ -707,7 +714,7 @@ my $std = sub {
   my ($mod,$args) = @_;
   my $orig = "std$mod\t$args";
 
-    if ($args =~ /%r([0-9]+),(\-[0-9]+)\(%r([0-9]+)\)/)        # format 3 suffices
+    if ($args =~ /%r([0-9]+),(\-?[0-9]+)\(%r([0-9]+)\)/) # format 3 suffices
     {  my $opcode=(0x1c<<26)|($3<<21)|($1<<16)|(($2&0x1FF8)<<1)|(($2>>13)&1);
        sprintf "\t.WORD\t0x%08x\t; %s",$opcode,$orig;
     }
@@ -760,13 +767,18 @@ sub assemble {
     ref($opcode) eq 'CODE' ? &$opcode($mod,$args) : "\t$mnemonic$mod\t$args";
 }
 
+if (`$ENV{CC} -Wa,-v -c -o /dev/null -x assembler /dev/null 2>&1`
+       =~ /GNU assembler/) {
+    $gnuas = 1;
+}
+
 foreach (split("\n",$code)) {
        s/\`([^\`]*)\`/eval $1/ge;
 
        s/shd\s+(%r[0-9]+),(%r[0-9]+),([0-9]+)/
                $3>31 ? sprintf("shd\t%$2,%$1,%d",$3-32)        # rotation for >=32
                :       sprintf("shd\t%$1,%$2,%d",$3)/e                 or
-       # translate made up instructons: _ror, _shr, _align, _shl
+       # translate made up instructions: _ror, _shr, _align, _shl
        s/_ror(\s+)(%r[0-9]+),/
                ($SZ==4 ? "shd" : "shrpd")."$1$2,$2,"/e                 or
 
@@ -783,7 +795,11 @@ foreach (split("\n",$code)) {
 
        s/^\s+([a-z]+)([\S]*)\s+([\S]*)/&assemble($1,$2,$3)/e if ($SIZE_T==4);
 
-       s/cmpb,\*/comb,/ if ($SIZE_T==4);
+       s/(\.LEVEL\s+2\.0)W/$1w/        if ($gnuas && $SIZE_T==8);
+       s/\.SPACE\s+\$TEXT\$/.text/     if ($gnuas && $SIZE_T==8);
+       s/\.SUBSPA.*//                  if ($gnuas && $SIZE_T==8);
+       s/cmpb,\*/comb,/                if ($SIZE_T==4);
+       s/\bbv\b/bve/                   if ($SIZE_T==8);
 
        print $_,"\n";
 }