[System.Net] Add support for .pac proxy config scripts on mac
[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, *start, *end;
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_regp_reg (p, X86_EAX, X86_EAX, 4);
114         x86_mov_membase_reg (p, X86_EAX, 0, X86_EAX, 4);
115         x86_mov_reg_membase (p, X86_EAX, X86_EAX, 0, 4);
116         x86_mov_reg_memindex (p, X86_ECX, X86_EAX, 34, X86_EDX, 2, 4);
117         x86_mov_reg_memindex (p, X86_ECX, X86_NOBASEREG, 34, X86_EDX, 2, 4);
118         x86_mov_memindex_reg (p, X86_EAX, X86_EAX, 0, X86_EDX, 2, 4);
119         x86_mov_reg_reg (p, X86_EAX, X86_EAX, 1);
120         x86_mov_reg_reg (p, X86_EAX, X86_EAX, 4);
121         x86_mov_reg_mem (p, X86_EAX, mem_addr, 4);
122         
123         x86_mov_reg_imm (p, X86_EAX, 10);
124         x86_mov_mem_imm (p, mem_addr, 54, 4);
125         x86_mov_mem_imm (p, mem_addr, 54, 1);
126
127         x86_lea_mem (p, X86_EDX, mem_addr);
128         /* test widen */
129         x86_widen_memindex (p, X86_EDX, X86_ECX, 0, X86_EBX, 2, 1, 0);
130         
131         x86_cdq (p);
132         x86_wait (p);
133
134         x86_fp_op_mem (p, X86_FADD, mem_addr, 1);
135         x86_fp_op_mem (p, X86_FSUB, mem_addr, 0);
136         x86_fp_op (p, X86_FSUB, 2);
137         x86_fp_op_reg (p, X86_FMUL, 1, 0);
138         x86_fstp (p, 2);
139         x86_fcompp (p);
140         x86_fnstsw (p);
141         x86_fnstcw (p, mem_addr);
142         x86_fnstcw_membase (p, X86_ESP, -8);
143
144         x86_fldcw_membase (p, X86_ESP, -8);
145         x86_fchs (p);
146         x86_frem (p);
147         x86_fxch (p, 3);
148         x86_fcomip (p, 3);
149         x86_fld_membase (p, X86_ESP, -8, 1);
150         x86_fld_membase (p, X86_ESP, -8, 0);
151         x86_fld80_membase (p, X86_ESP, -8);
152         x86_fild_membase (p, X86_ESP, -8, 1);
153         x86_fild_membase (p, X86_ESP, -8, 0);
154         x86_fld_reg (p, 4);
155         x86_fldz (p);
156         x86_fld1 (p);
157         
158         x86_fst (p, mem_addr, 1, 0);
159         x86_fst (p, mem_addr, 1, 1);
160         x86_fst (p, mem_addr, 0, 1);
161         
162         x86_fist_pop_membase (p, X86_EDX, 4, 1);
163         x86_fist_pop_membase (p, X86_EDX, 4, 0);
164
165         x86_push_reg (p, X86_EBX);
166         x86_push_membase (p, X86_EBP, 8);
167         x86_push_imm (p, -1);
168         x86_pop_reg (p, X86_EBX);
169
170         x86_pushad (p);
171         x86_pushfd (p);
172         x86_popfd (p);
173         x86_popad (p);
174
175         target = p;
176
177         start = p;
178         x86_jump32 (p, mem_addr);
179         x86_patch (start, target);
180         start = p;
181         x86_jump8 (p, 12);
182         x86_patch (start, target);
183         x86_jump_reg (p, X86_EAX);
184         x86_jump_membase (p, X86_EDX, 16);
185
186         x86_jump_code (p, target);
187
188         x86_branch8 (p, X86_CC_EQ, 54, 1);
189         x86_branch32 (p, X86_CC_LT, 54, 0);
190         x86_branch (p, X86_CC_GT, target, 0);
191         x86_branch_disp (p, X86_CC_NE, -4, 0);
192
193         x86_set_reg (p, X86_CC_EQ, X86_EAX, 0);
194         x86_set_membase (p, X86_CC_LE, X86_EBP, -8, 0);
195
196         x86_call_code (p, printf);
197         x86_call_reg (p, X86_ECX);
198
199         x86_sahf (p);
200         
201         x86_fsin (p);
202         x86_fcos (p);
203         x86_fabs (p);
204         x86_fpatan (p);
205         x86_fprem (p);
206         x86_fprem1 (p);
207         x86_frndint (p);
208         x86_fsqrt (p);
209         x86_fptan (p);
210         
211         x86_leave (p);
212         x86_ret (p);
213         x86_ret_imm (p, 24);
214         
215         x86_cmov_reg (p, X86_CC_GT, 1, X86_EAX, X86_EDX);
216         x86_cmov_membase (p, X86_CC_GT, 0, X86_EAX, X86_EDX, -4);
217
218         x86_nop (p);
219         x86_epilog (p, X86_CALLER_REGS);
220
221         size = p-code;
222         for (i = 0; i < size; ++i)
223                 printf (".byte %d\n", (unsigned int) code [i]);
224         return 0;
225 }