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