2 #include "sparc-codegen.h"
4 /* don't run the resulting program, it will destroy your computer,
5 * just objdump -d it to inspect we generated the correct assembler.
12 guint32 code_buffer
[500];
13 guint32 local_size
= 0, stack_size
= 0, code_size
= 6;
14 guint32 arg_pos
, simpletype
;
16 int i
, stringp
, cur_out_reg
, size
;
20 printf (".text\n.align 4\n.globl main\n.type main,@function\nmain:\n");
23 * Standard function prolog.
25 sparc_save_imm (p
, sparc_sp
, -112-stack_size
, sparc_sp
);
26 cur_out_reg
= sparc_o0
;
30 sparc_mov_reg_reg (p
, sparc_i2
, cur_out_reg
);
34 sparc_ld_imm (p
, sparc_i3
, arg_pos
, cur_out_reg
);
36 sparc_ld_imm (p
, sparc_i3
, arg_pos
+4, cur_out_reg
);
39 * Insert call to function
41 sparc_jmpl (p
, sparc_i0
, 0, sparc_callsite
);
44 sparc_jmpl_imm (p
, sparc_i7
, 8, sparc_zero
);
45 sparc_restore (p
, sparc_zero
, sparc_zero
, sparc_zero
);
47 sparc_ldsb (p
, sparc_i3
, sparc_l0
, sparc_o5
);
48 sparc_ldsb_imm (p
, sparc_i3
, 2, sparc_o5
);
50 sparc_ldsh (p
, sparc_i3
, sparc_l0
, sparc_o5
);
51 sparc_ldsh_imm (p
, sparc_i3
, 2, sparc_o5
);
53 sparc_ldub (p
, sparc_i3
, sparc_l0
, sparc_o5
);
54 sparc_ldub_imm (p
, sparc_i3
, 2, sparc_o5
);
56 sparc_lduh (p
, sparc_i3
, sparc_l0
, sparc_o5
);
57 sparc_lduh_imm (p
, sparc_i3
, 2, sparc_o5
);
59 sparc_ldf (p
, sparc_i3
, sparc_l0
, sparc_o5
);
60 sparc_ldf_imm (p
, sparc_i3
, 2, sparc_o5
);
62 sparc_stb (p
, sparc_i3
, sparc_l0
, sparc_l2
);
63 sparc_stb_imm (p
, sparc_i3
, sparc_o5
, 2);
65 sparc_sethi (p
, 0xff000000, sparc_o2
);
66 sparc_rdy (p
, sparc_l0
);
67 sparc_wry (p
, sparc_l0
, sparc_l1
);
68 sparc_wry_imm (p
, sparc_l0
, 16);
71 sparc_flush (p
, sparc_l4
, 0);
73 sparc_and (p
, sparc_cc
, sparc_l0
, sparc_l1
, sparc_o1
);
74 sparc_and_imm (p
, FALSE
, sparc_l0
, 0xff, sparc_o1
);
75 sparc_andn (p
, sparc_cc
, sparc_l0
, sparc_l1
, sparc_o1
);
76 sparc_or (p
, sparc_cc
, sparc_l0
, sparc_l1
, sparc_o1
);
77 sparc_orn (p
, sparc_cc
, sparc_l0
, sparc_l1
, sparc_o1
);
78 sparc_xor (p
, sparc_cc
, sparc_l0
, sparc_l1
, sparc_o1
);
79 sparc_xnor (p
, sparc_cc
, sparc_l0
, sparc_l1
, sparc_o1
);
81 sparc_sll (p
, sparc_l0
, sparc_l1
, sparc_o1
);
82 sparc_sll_imm (p
, sparc_l0
, 2, sparc_o1
);
83 sparc_srl (p
, sparc_l0
, sparc_l1
, sparc_o1
);
84 sparc_srl_imm (p
, sparc_l0
, 2, sparc_o1
);
85 sparc_sra (p
, sparc_l0
, sparc_l1
, sparc_o1
);
86 sparc_sra_imm (p
, sparc_l0
, 2, sparc_o1
);
88 sparc_add (p
, sparc_cc
, sparc_l0
, sparc_l1
, sparc_o1
);
89 sparc_add_imm (p
, FALSE
, sparc_l0
, 0xff, sparc_o1
);
90 sparc_addx (p
, sparc_cc
, sparc_l0
, sparc_l1
, sparc_o1
);
91 sparc_sub (p
, sparc_cc
, sparc_l0
, sparc_l1
, sparc_o1
);
92 sparc_subx (p
, sparc_cc
, sparc_l0
, sparc_l1
, sparc_o1
);
94 sparc_muls (p
, sparc_l0
, sparc_l1
, sparc_o1
);
95 sparc_umul (p
, sparc_cc
, sparc_l0
, sparc_l1
, sparc_o1
);
96 sparc_smul (p
, sparc_cc
, sparc_l0
, sparc_l1
, sparc_o1
);
97 sparc_udiv (p
, sparc_cc
, sparc_l0
, sparc_l1
, sparc_o1
);
98 sparc_sdiv (p
, sparc_cc
, sparc_l0
, sparc_l1
, sparc_o1
);
100 sparc_branch (p
, FALSE
, sparc_bne
, -12);
103 sparc_test (p
, sparc_l4
);
104 sparc_cmp (p
, sparc_l4
, sparc_l6
);
105 sparc_cmp_imm (p
, sparc_l4
, 4);
106 sparc_restore_simple (p
);
108 sparc_set (p
, 0xff000000, sparc_l7
);
109 sparc_set (p
, 1, sparc_l7
);
110 sparc_set (p
, 0xff0000ff, sparc_l7
);
112 sparc_not (p
, sparc_g2
);
113 sparc_neg (p
, sparc_g3
);
114 sparc_clr_reg (p
, sparc_g4
);
117 size
= (p
-code_buffer
)*4;
118 ins
= (gchar
*)code_buffer
;
119 for (i
= 0; i
< size
; ++i
)
120 printf (".byte %d\n", (unsigned int) ins
[i
]);