2007-03-28 Chris Toshok <toshok@ximian.com>
[mono-project.git] / mono / arch / x86 / test.c
blob3511e8fdaf0b7a5b956d640ab562a98a9a724858
1 #include "x86-codegen.h"
2 #include <stdio.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.
6 */
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;
15 printf (".text\n.align 4\n.globl main\n.type main,@function\nmain:\n");
17 x86_prolog (p, 16, X86_CALLER_REGS);
19 x86_cmpxchg_reg_reg (p, X86_EAX, X86_EBP);
20 x86_cmpxchg_membase_reg (p, X86_EAX, 12, X86_EBP);
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?
28 x86_inc_reg (p, X86_EAX);
29 x86_inc_mem (p, mem_addr);
30 x86_inc_membase (p, X86_ESP, 4);
32 x86_nop (p);
33 x86_nop (p);
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);
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);
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);
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);
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);
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);
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);
80 x86_shift_reg_imm (p, X86_SHL, X86_EAX, 1);
81 x86_shift_reg_imm (p, X86_SHL, X86_EDX, 2);
83 x86_shift_mem_imm (p, X86_SHL, mem_addr, 2);
84 x86_shift_membase_imm (p, X86_SHLR, X86_EBP, 8, 4);
87 * Shift by CL
89 x86_shift_reg (p, X86_SHL, X86_EAX);
90 x86_shift_mem (p, X86_SHL, mem_addr);
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);
96 x86_imul_reg_reg (p, X86_EBX, X86_EDX);
97 x86_imul_reg_membase (p, X86_EBX, X86_EBP, 12);
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);
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);
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);
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);
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);
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);
131 x86_cdq (p);
132 x86_wait (p);
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);
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);
158 x86_fst (p, mem_addr, 1, 0);
159 x86_fst (p, mem_addr, 1, 1);
160 x86_fst (p, mem_addr, 0, 1);
162 x86_fist_pop_membase (p, X86_EDX, 4, 1);
163 x86_fist_pop_membase (p, X86_EDX, 4, 0);
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);
170 x86_pushad (p);
171 x86_pushfd (p);
172 x86_popfd (p);
173 x86_popad (p);
175 target = p;
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);
186 x86_jump_code (p, target);
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);
193 x86_set_reg (p, X86_CC_EQ, X86_EAX, 0);
194 x86_set_membase (p, X86_CC_LE, X86_EBP, -8, 0);
196 x86_call_code (p, printf);
197 x86_call_reg (p, X86_ECX);
199 x86_sahf (p);
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);
211 x86_leave (p);
212 x86_ret (p);
213 x86_ret_imm (p, 24);
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);
218 x86_nop (p);
219 x86_epilog (p, X86_CALLER_REGS);
221 size = p-code;
222 for (i = 0; i < size; ++i)
223 printf (".byte %d\n", (unsigned int) code [i]);
224 return 0;