hc
2024-03-22 a0752693d998599af469473b8dc239ef973a012f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#! /usr/bin/env perl
# Copyright 2008-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
 
$output = pop;
open STDOUT,">$output";
 
$0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
push(@INC,"${dir}.");
 
require "uplink-common.pl";
 
local $V=8;    # max number of args uplink functions may accept...
my $loc0 = "r".(32+$V);
print <<___;
.text
.global    OPENSSL_Uplink#
.type    OPENSSL_Uplink#,\@function
 
___
for ($i=1;$i<=$N;$i++) {
print <<___;
.proc    lazy$i#
lazy$i:
   .prologue
{ .mii;    .save    ar.pfs,$loc0
   alloc    loc0=ar.pfs,$V,3,2,0
   .save    b0,loc1
   mov    loc1=b0
   addl    loc2=\@ltoff(OPENSSL_UplinkTable#),gp    };;
   .body
{ .mmi;    ld8    out0=[loc2]
   mov    out1=$i                    };;
{ .mib;    add    loc2=8*$i,out0
   br.call.sptk.many    b0=OPENSSL_Uplink#    };;
{ .mmi;    ld8    r31=[loc2];;
   ld8    r30=[r31],8                };;
{ .mii;    ld8    gp=[r31]
   mov    b6=r30
   mov    b0=loc1                    };;
{ .mib;    mov    ar.pfs=loc0
   br.many    b6                    };;
.endp    lazy$i#
 
___
}
print <<___;
.data
.global OPENSSL_UplinkTable#
OPENSSL_UplinkTable:    data8   $N      // amount of following entries
___
for ($i=1;$i<=$N;$i++) {   print "      data8   \@fptr(lazy$i#)\n";   }
print <<___;
.size   OPENSSL_UplinkTable,.-OPENSSL_UplinkTable#
___
 
close STDOUT;