perlasm/ppc-xlate.pl: add .quad directive
[openssl.git] / crypto / perlasm / ppc-xlate.pl
index 755524c9cff6b46bcc6ab327199f4e03f6d0acd9..cab368c49b51de0dda5f68fc45a4b8e11e976bbf 100755 (executable)
@@ -31,14 +31,12 @@ my $globl = sub {
                                $ret .= ".type  $name,\@function";
                                last;
                              };
-       /linux.*64/     && do { $ret .= ".globl .$name\n";
-                               $ret .= ".type  .$name,\@function\n";
+       /linux.*64/     && do { $ret .= ".globl $name\n";
+                               $ret .= ".type  $name,\@function\n";
                                $ret .= ".section       \".opd\",\"aw\"\n";
-                               $ret .= ".globl $name\n";
                                $ret .= ".align 3\n";
                                $ret .= "$name:\n";
                                $ret .= ".quad  .$name,.TOC.\@tocbase,0\n";
-                               $ret .= ".size  $name,24\n";
                                $ret .= ".previous\n";
 
                                $name = ".$name";
@@ -62,6 +60,17 @@ my $machine = sub {
     }
     ".machine  $arch";
 };
+my $size = sub {
+    if ($flavour =~ /linux/)
+    {  shift;
+       my $name = shift; $name =~ s|^[\.\_]||;
+       my $ret  = ".size       $name,.-".($flavour=~/64/?".":"").$name;
+       $ret .= "\n.size        .$name,.-.$name" if ($flavour=~/64/);
+       $ret;
+    }
+    else
+    {  "";     }
+};
 my $asciz = sub {
     shift;
     my $line = join(",",@_);
@@ -70,6 +79,25 @@ my $asciz = sub {
     else
     {  "";     }
 };
+my $quad = sub {
+    shift;
+    my @ret;
+    my ($hi,$lo);
+    for (@_) {
+       if (/^0x([0-9a-f]*?)([0-9a-f]{1,8})$/io)
+       {  $hi=$1?"0x$1":"0"; $lo="0x$2";  }
+       elsif (/^([0-9]+)$/o)
+       {  $hi=$1>>32; $lo=$1&0xffffffff;  } # error-prone with 32-bit perl
+       else
+       {  $hi=undef; $lo=$_; }
+
+       if (defined($hi))
+       {  push(@ret,$flavour=~/lei$/o?".long\t$lo,$hi":".long\t$hi,$lo");  }
+       else
+       {  push(@ret,".quad     $lo");  }
+    }
+    join("\n",@ret);
+};
 
 ################################################################
 # simplified mnemonics not handled by at least one assembler
@@ -101,6 +129,13 @@ my $bnelr = sub {
        "       .long   ".sprintf "0x%x",19<<26|$bo<<21|2<<16|16<<1 :
        "       bclr    $bo,2";
 };
+my $beqlr = sub {
+    my $f = shift;
+    my $bo = $f=~/-/ ? 12+2 : 12;      # optional "not to be taken" hint
+    ($flavour =~ /linux/) ?            # GNU as doesn't allow most recent hints
+       "       .long   ".sprintf "0x%X",19<<26|$bo<<21|2<<16|16<<1 :
+       "       bclr    $bo,2";
+};
 # GNU assembler can't handle extrdi rA,rS,16,48, or when sum of last two
 # arguments is 64, with "operand out of range" error.
 my $extrdi = sub {