1.data	128
2idfmt:
3.c	"received %d\n"
4failure_message:
5.c	"numbers don't add up to zero\n"
6report_message:
7.c	"failed: got %i instead of %i\n"
8succeeded_message:
9.c	"succeeded\n"
10
11.code
12	jmpi main
13
14/*
15static int
16identity (int arg)
17{
18  printf ("received %i\n", arg);
19  return arg;
20}
21 */
22	name identify
23identify:
24	prolog
25	arg $i
26	getarg %v0 $i
27	prepare
28		pushargi idfmt
29		ellipsis
30		pushargr %v0
31	finishi @printf
32	retr %v0
33	epilog
34
35	name identity_func
36identity_func:
37	prolog
38	arg $i
39	getarg %r1 $i
40
41	/* Store the argument on the stack.  */
42	allocai $(__WORDSIZE >> 3) $off
43	stxi $off %fp %r1
44
45	/* Store the negative of the argument on the stack.  */
46	allocai $(__WORDSIZE >> 3) $neg
47	negr %r2 %r1
48	stxi $neg %fp %r2
49
50	/* Invoke FUNC.  */
51	prepare
52		pushargr %r1
53	finishi identify
54
55	/* Ignore the result.  */
56
57	/* Restore the negative and the argument from the stack.  */
58	ldxi %r2 %fp $neg
59	ldxi %v1 %fp $off
60
61	/* Make sure they still add to zero.  */
62	addr %r0 %v1 %r2
63	bnei branch %r0 0
64
65	/* Return it.  */
66	retr %v1
67
68	/* Display a failure message.  */
69branch:
70	prepare
71		pushargi failure_message
72		ellipsis
73	finishi @printf
74
75	/* Leave.  */
76	retr %v1
77	epilog
78
79	name main
80main:
81	prolog
82	prepare
83		pushargi 7777
84	finishi identity_func
85	retval %r0
86	beqi succeeded %r0 7777
87	prepare
88		pushargi report_message
89		ellipsis
90		pushargr %r0
91		pushargi 7777
92	finishi @printf
93	reti 1
94succeeded:
95	prepare
96		pushargi succeeded_message
97		ellipsis
98	finishi @printf
99	reti 0
100	epilog
101