0ae82fea92e9da405c23373f2eee814c1b7b97f0
[mono.git] / mono / arch / x86 / test.c
1 #include "x86-codegen.h"
2 #include <stdio.h>
3
4 /* don't run the resulting program, it will destroy your computer,
5  * just objdump -d it to inspect we generated the correct assembler.
6  */
7
8 int main() {
9         unsigned char code [16000];
10         unsigned char *p = code;
11         unsigned char *target;
12         unsigned long mem_addr = 0xdeadbeef;
13         int size, i;
14
15         printf (".text\n.align 4\n.globl main\n.type main,@function\nmain:\n");
16
17         x86_prolog (p, 16, X86_CALLER_REGS);
18
19         x86_cmpxchg_reg_reg (p, X86_EAX, X86_EBP);
20         x86_cmpxchg_membase_reg (p, X86_EAX, 12, X86_EBP);
21
22         x86_xchg_reg_reg (p, X86_EAX, X86_EBP, 4);
23         x86_xchg_reg_reg (p, X86_EAX, X86_EBP, 1); // FIXME?
24         x86_xchg_membase_reg (p, X86_EAX, 12, X86_EBP, 4);
25         x86_xchg_membase_reg (p, X86_EAX, 12, X86_EBP, 2);
26         x86_xchg_membase_reg (p, X86_EAX, 12, X86_EBX, 1); // FIXME?
27
28         x86_inc_reg (p, X86_EAX);
29         x86_inc_mem (p, mem_addr);
30         x86_inc_membase (p, X86_ESP, 4);
31         
32         x86_nop (p);
33         x86_nop (p);
34         
35         x86_dec_reg (p, X86_EAX);
36         x86_dec_reg (p, X86_ECX);
37         x86_dec_mem (p, mem_addr);
38         x86_dec_membase (p, X86_ESP, 4);
39         
40         x86_not_reg (p, X86_EDX);
41         x86_not_reg (p, X86_ECX);
42         x86_not_mem (p, mem_addr);
43         x86_not_membase (p, X86_ESP, 4);
44         x86_not_membase (p, X86_ESP, 0x4444444);
45         x86_not_membase (p, X86_EBP, 0x4444444);
46         x86_not_membase (p, X86_ECX, 0x4444444);
47         x86_not_membase (p, X86_EDX, 0);
48         x86_not_membase (p, X86_EBP, 0);
49
50         x86_neg_reg (p, X86_EAX);
51         x86_neg_reg (p, X86_ECX);
52         x86_neg_mem (p, mem_addr);
53         x86_neg_membase (p, X86_ESP, 8);
54
55         x86_alu_reg_imm (p, X86_ADD, X86_EAX, 5);
56         x86_alu_reg_imm (p, X86_ADD, X86_EBX, -10);
57         x86_alu_reg_imm (p, X86_SUB, X86_EDX, 7);
58         x86_alu_reg_imm (p, X86_OR, X86_ESP, 0xffffedaf);
59         x86_alu_reg_imm (p, X86_CMP, X86_ECX, 1);
60         x86_alu_mem_imm (p, X86_ADC, mem_addr, 2);
61         x86_alu_membase_imm (p, X86_ADC, X86_ESP, -4, 4);
62         x86_alu_membase_imm (p, X86_ADC, X86_ESP, -12, 0xffffedaf);
63
64         x86_alu_mem_reg (p, X86_SUB, mem_addr, X86_EDX);
65         x86_alu_reg_reg (p, X86_ADD, X86_EAX, X86_EBX);
66         x86_alu_reg_mem (p, X86_ADD, X86_EAX, mem_addr);
67         x86_alu_reg_imm (p, X86_ADD, X86_EAX, 0xdeadbeef);
68         x86_alu_reg_membase (p, X86_XOR, X86_EDX, X86_ESP, 4);
69         x86_alu_membase_reg (p, X86_XOR, X86_EBP, 8, X86_ESI);
70
71         x86_test_reg_imm (p, X86_EAX, 16);
72         x86_test_reg_imm (p, X86_EDX, -16);
73         x86_test_mem_imm (p, mem_addr, 1);
74         x86_test_membase_imm (p, X86_EBP, 8, 1);
75
76         x86_test_reg_reg (p, X86_EAX, X86_EDX);
77         x86_test_mem_reg (p, mem_addr, X86_EDX);
78         x86_test_membase_reg (p, X86_ESI, 4, X86_EDX);
79
80         x86_shift_reg_imm (p, X86_SHL, X86_EAX, 1);
81         x86_shift_reg_imm (p, X86_SHL, X86_EDX, 2);
82
83         x86_shift_mem_imm (p, X86_SHL, mem_addr, 2);
84         x86_shift_membase_imm (p, X86_SHLR, X86_EBP, 8, 4);
85
86         /*
87          * Shift by CL
88          */
89         x86_shift_reg (p, X86_SHL, X86_EAX);
90         x86_shift_mem (p, X86_SHL, mem_addr);
91
92         x86_mul_reg (p, X86_EAX, 0);
93         x86_mul_reg (p, X86_EAX, 1);
94         x86_mul_membase (p, X86_EBP, 8, 1);
95
96         x86_imul_reg_reg (p, X86_EBX, X86_EDX);
97         x86_imul_reg_membase (p, X86_EBX, X86_EBP, 12);
98
99         x86_imul_reg_reg_imm (p, X86_EBX, X86_EDX, 10);
100         x86_imul_reg_mem_imm (p, X86_EBX, mem_addr, 20);
101         x86_imul_reg_membase_imm (p, X86_EBX, X86_EBP, 16, 300);
102
103         x86_div_reg (p, X86_EDX, 0);
104         x86_div_reg (p, X86_EDX, 1);
105         x86_div_mem (p, mem_addr, 1);
106         x86_div_membase (p, X86_ESI, 4, 1);
107
108         x86_mov_mem_reg (p, mem_addr, X86_EAX, 4);
109         x86_mov_mem_reg (p, mem_addr, X86_EAX, 2);
110         x86_mov_mem_reg (p, mem_addr, X86_EAX, 1);
111         x86_mov_membase_reg (p, X86_EBP, 4, X86_EAX, 1);
112
113         x86_mov_reg_reg (p, X86_EAX, X86_EAX, 1);
114         x86_mov_reg_reg (p, X86_EAX, X86_EAX, 4);
115         x86_mov_reg_mem (p, X86_EAX, mem_addr, 4);
116         
117         x86_mov_reg_imm (p, X86_EAX, 10);
118         x86_mov_mem_imm (p, mem_addr, 54, 4);
119         x86_mov_mem_imm (p, mem_addr, 54, 1);
120
121         x86_lea_mem (p, X86_EDX, mem_addr);
122         /* test widen */
123         
124         x86_cdq (p);
125         x86_wait (p);
126
127         x86_fp_op_mem (p, X86_FADD, mem_addr, 1);
128         x86_fp_op_mem (p, X86_FSUB, mem_addr, 0);
129         x86_fp_op (p, X86_FSUB, 2);
130         x86_fp_op_reg (p, X86_FMUL, 1, 0);
131         x86_fstp (p, 2);
132         x86_fcompp (p);
133         x86_fnstsw (p);
134         x86_fnstcw (p, mem_addr);
135         x86_fnstcw_membase (p, X86_ESP, -8);
136
137         x86_fldcw_membase (p, X86_ESP, -8);
138         x86_fchs (p);
139         x86_frem (p);
140         x86_fxch (p, 3);
141         x86_fcomip (p, 3);
142         x86_fld_membase (p, X86_ESP, -8, 1);
143         x86_fld_membase (p, X86_ESP, -8, 0);
144         x86_fld80_membase (p, X86_ESP, -8);
145         x86_fild_membase (p, X86_ESP, -8, 1);
146         x86_fild_membase (p, X86_ESP, -8, 0);
147         x86_fld_reg (p, 4);
148         x86_fldz (p);
149         x86_fld1 (p);
150         
151         x86_fst (p, mem_addr, 1, 0);
152         x86_fst (p, mem_addr, 1, 1);
153         x86_fst (p, mem_addr, 0, 1);
154         
155         x86_fist_pop_membase (p, X86_EDX, 4, 1);
156         x86_fist_pop_membase (p, X86_EDX, 4, 0);
157
158         x86_push_reg (p, X86_EBX);
159         x86_push_membase (p, X86_EBP, 8);
160         x86_push_imm (p, -1);
161         x86_pop_reg (p, X86_EBX);
162
163         x86_pushad (p);
164         x86_pushfd (p);
165         x86_popfd (p);
166         x86_popad (p);
167
168         target = p;
169
170         x86_jump32 (p, mem_addr);
171         x86_jump8 (p, 12);
172         x86_jump_reg (p, X86_EAX);
173         x86_jump_membase (p, X86_EDX, 16);
174
175         x86_jump_code (p, target);
176
177         x86_branch8 (p, X86_CC_EQ, 54, 1);
178         x86_branch32 (p, X86_CC_LT, 54, 0);
179         x86_branch (p, X86_CC_GT, target, 0);
180         x86_branch_disp (p, X86_CC_NE, -4, 0);
181
182         x86_call_imm (p, printf);
183         x86_call_reg (p, X86_ECX);
184
185         x86_sahf (p);
186         
187         x86_fsin (p);
188         x86_fcos (p);
189         x86_fabs (p);
190         x86_fpatan (p);
191         x86_fprem (p);
192         x86_fprem1 (p);
193         x86_frndint (p);
194         x86_fsqrt (p);
195         x86_fptan (p);
196         
197         x86_leave (p);
198         x86_ret (p);
199         x86_ret_imm (p, 24);
200         
201         x86_cmov_reg (p, X86_CC_GT, 1, X86_EAX, X86_EDX);
202         x86_cmov_membase (p, X86_CC_GT, 0, X86_EAX, X86_EDX, -4);
203
204         x86_nop (p);
205         x86_epilog (p, X86_CALLEE_REGS);
206
207         size = p-code;
208         for (i = 0; i < size; ++i)
209                 printf (".byte %d\n", (unsigned int) code [i]);
210         return 0;
211 }