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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
#include <glib.h>
#include "sparc-codegen.h"
/* don't run the resulting program, it will destroy your computer,
* just objdump -d it to inspect we generated the correct assembler.
*/
int
main ()
{
guint32 *p;
guint32 code_buffer [500];
guint32 local_size = 0, stack_size = 0, code_size = 6;
guint32 arg_pos, simpletype;
unsigned char *ins;
int i, stringp, cur_out_reg, size;
p = code_buffer;
printf (".text\n.align 4\n.globl main\n.type main,@function\nmain:\n");
/*
* Standard function prolog.
*/
sparc_save_imm (p, sparc_sp, -112-stack_size, sparc_sp);
cur_out_reg = sparc_o0;
arg_pos = 0;
if (1) {
sparc_mov_reg_reg (p, sparc_i2, cur_out_reg);
++cur_out_reg;
}
sparc_ld_imm (p, sparc_i3, arg_pos, cur_out_reg);
++cur_out_reg;
sparc_ld_imm (p, sparc_i3, arg_pos+4, cur_out_reg);
++cur_out_reg;
/*
* Insert call to function
*/
sparc_jmpl (p, sparc_i0, 0, sparc_callsite);
sparc_nop (p);
sparc_jmpl_imm (p, sparc_i7, 8, sparc_zero);
sparc_restore (p, sparc_zero, sparc_zero, sparc_zero);
sparc_ldsb (p, sparc_i3, sparc_l0, sparc_o5);
sparc_ldsb_imm (p, sparc_i3, 2, sparc_o5);
sparc_ldsh (p, sparc_i3, sparc_l0, sparc_o5);
sparc_ldsh_imm (p, sparc_i3, 2, sparc_o5);
sparc_ldub (p, sparc_i3, sparc_l0, sparc_o5);
sparc_ldub_imm (p, sparc_i3, 2, sparc_o5);
sparc_lduh (p, sparc_i3, sparc_l0, sparc_o5);
sparc_lduh_imm (p, sparc_i3, 2, sparc_o5);
sparc_ldf (p, sparc_i3, sparc_l0, sparc_o5);
sparc_ldf_imm (p, sparc_i3, 2, sparc_o5);
sparc_stb (p, sparc_i3, sparc_l0, sparc_l2);
sparc_stb_imm (p, sparc_i3, sparc_o5, 2);
sparc_sethi (p, 0xff000000, sparc_o2);
sparc_rdy (p, sparc_l0);
sparc_wry (p, sparc_l0, sparc_l1);
sparc_wry_imm (p, sparc_l0, 16);
sparc_stbar (p);
sparc_unimp (p, 24);
sparc_flush (p, sparc_l4, 0);
sparc_and (p, sparc_cc, sparc_l0, sparc_l1, sparc_o1);
sparc_and_imm (p, FALSE, sparc_l0, 0xff, sparc_o1);
sparc_andn (p, sparc_cc, sparc_l0, sparc_l1, sparc_o1);
sparc_or (p, sparc_cc, sparc_l0, sparc_l1, sparc_o1);
sparc_orn (p, sparc_cc, sparc_l0, sparc_l1, sparc_o1);
sparc_xor (p, sparc_cc, sparc_l0, sparc_l1, sparc_o1);
sparc_xnor (p, sparc_cc, sparc_l0, sparc_l1, sparc_o1);
sparc_sll (p, sparc_l0, sparc_l1, sparc_o1);
sparc_sll_imm (p, sparc_l0, 2, sparc_o1);
sparc_srl (p, sparc_l0, sparc_l1, sparc_o1);
sparc_srl_imm (p, sparc_l0, 2, sparc_o1);
sparc_sra (p, sparc_l0, sparc_l1, sparc_o1);
sparc_sra_imm (p, sparc_l0, 2, sparc_o1);
sparc_add (p, sparc_cc, sparc_l0, sparc_l1, sparc_o1);
sparc_add_imm (p, FALSE, sparc_l0, 0xff, sparc_o1);
sparc_addx (p, sparc_cc, sparc_l0, sparc_l1, sparc_o1);
sparc_sub (p, sparc_cc, sparc_l0, sparc_l1, sparc_o1);
sparc_subx (p, sparc_cc, sparc_l0, sparc_l1, sparc_o1);
sparc_muls (p, sparc_l0, sparc_l1, sparc_o1);
sparc_umul (p, sparc_cc, sparc_l0, sparc_l1, sparc_o1);
sparc_smul (p, sparc_cc, sparc_l0, sparc_l1, sparc_o1);
sparc_udiv (p, sparc_cc, sparc_l0, sparc_l1, sparc_o1);
sparc_sdiv (p, sparc_cc, sparc_l0, sparc_l1, sparc_o1);
sparc_branch (p, FALSE, sparc_bne, -12);
sparc_ret (p);
sparc_retl (p);
sparc_test (p, sparc_l4);
sparc_cmp (p, sparc_l4, sparc_l6);
sparc_cmp_imm (p, sparc_l4, 4);
sparc_restore_simple (p);
sparc_set (p, 0xff000000, sparc_l7);
sparc_set (p, 1, sparc_l7);
sparc_set (p, 0xff0000ff, sparc_l7);
sparc_not (p, sparc_g2);
sparc_neg (p, sparc_g3);
sparc_clr_reg (p, sparc_g4);
size = (p-code_buffer)*4;
ins = (gchar*)code_buffer;
for (i = 0; i < size; ++i)
printf (".byte %d\n", (unsigned int) ins [i]);
return 0;
}
|