blob: 0bf552a377b59381e91113cb4e7cbbf416285e1c [file] [log] [blame]
sewardjc97096c2004-06-30 09:28:04 +00001
2/*---------------------------------------------------------------*/
3/*--- ---*/
4/*--- This file (test_main.c) is ---*/
5/*--- Copyright (c) 2004 OpenWorks LLP. All rights reserved. ---*/
6/*--- ---*/
7/*---------------------------------------------------------------*/
8
9#include <stdio.h>
10#include <stdlib.h>
sewardjced9fe52004-07-07 11:55:36 +000011#include <assert.h>
sewardjc97096c2004-06-30 09:28:04 +000012
sewardjced9fe52004-07-07 11:55:36 +000013#include "libvex_basictypes.h"
14#include "libvex.h"
sewardjc97096c2004-06-30 09:28:04 +000015
16/*---------------------------------------------------------------*/
17/*--- Test ---*/
18/*---------------------------------------------------------------*/
19
sewardjce605f92004-07-05 14:39:15 +000020
sewardj2b515872004-07-05 20:50:45 +000021__attribute__ ((noreturn))
sewardj41f43bc2004-07-08 14:23:22 +000022static
sewardjce605f92004-07-05 14:39:15 +000023void failure_exit ( void )
24{
25 fprintf(stdout, "VEX did failure_exit. Bye.\n");
26 exit(1);
27}
28
sewardj41f43bc2004-07-08 14:23:22 +000029static
sewardjce605f92004-07-05 14:39:15 +000030void log_bytes ( Char* bytes, Int nbytes )
31{
32 fwrite ( bytes, 1, nbytes, stdout );
33}
34
sewardjced9fe52004-07-07 11:55:36 +000035#define N_LINEBUF 10000
sewardj41f43bc2004-07-08 14:23:22 +000036static Char linebuf[N_LINEBUF];
sewardjced9fe52004-07-07 11:55:36 +000037
sewardjf05537e2004-10-14 01:08:12 +000038#define N_ORIGBUF 1000
sewardj4459baa2004-09-10 20:00:46 +000039#define N_TRANSBUF 5000
sewardjced9fe52004-07-07 11:55:36 +000040
sewardj4459baa2004-09-10 20:00:46 +000041static UChar origbuf[N_ORIGBUF];
42static UChar transbuf[N_TRANSBUF];
sewardjced9fe52004-07-07 11:55:36 +000043
sewardj1f40a0a2004-07-21 12:28:07 +000044static Bool verbose = True;
sewardjced9fe52004-07-07 11:55:36 +000045
46int main ( int argc, char** argv )
sewardjce605f92004-07-05 14:39:15 +000047{
sewardjced9fe52004-07-07 11:55:36 +000048 FILE* f;
49 Int i;
sewardj4459baa2004-09-10 20:00:46 +000050 UInt u, sum;
sewardjced9fe52004-07-07 11:55:36 +000051 Addr32 orig_addr;
52 Int bb_number;
53 Int orig_nbytes, trans_used, orig_used;
54 TranslateResult tres;
55
56 if (argc != 2) {
57 fprintf(stderr, "usage: vex file.org\n");
58 exit(1);
59 }
60 f = fopen(argv[1], "r");
61 if (!f) {
62 fprintf(stderr, "can't open `%s'\n", argv[1]);
63 exit(1);
64 }
65
66 LibVEX_Init ( &failure_exit, &log_bytes,
sewardj1f40a0a2004-07-21 12:28:07 +000067 1, /* debug_paranoia */
sewardjf05537e2004-10-14 01:08:12 +000068 0, /* verbosity */
69 False,
70 //True, /* valgrind support */
sewardja8fc22c2004-10-09 09:33:54 +000071 50 /*100*/ /* max insns per bb */);
sewardjced9fe52004-07-07 11:55:36 +000072
sewardj86898e82004-07-22 17:26:12 +000073#if 0
sewardjea64e142004-07-22 16:47:21 +000074 {extern void test_asm86(void);
75 test_asm86();
76 return 0;
77 }
sewardj86898e82004-07-22 17:26:12 +000078#endif
sewardjea64e142004-07-22 16:47:21 +000079
sewardjced9fe52004-07-07 11:55:36 +000080 while (!feof(f)) {
81 fgets(linebuf, N_LINEBUF,f);
82 //printf("%s", linebuf);
83 assert(linebuf[0] != 0);
84 if (linebuf[0] != '.') continue;
85 /* first line is: . bb-number bb-addr n-bytes */
86 assert(3 == sscanf(&linebuf[1], " %d %x %d\n",
87 & bb_number,
88 & orig_addr, & orig_nbytes ));
89 assert(orig_nbytes >= 1);
90 assert(!feof(f));
91 fgets(linebuf, N_LINEBUF,f);
92 assert(linebuf[0] == '.');
93 /* second line is: . byte byte byte etc */
94 //printf("%s", linebuf);
sewardj1f40a0a2004-07-21 12:28:07 +000095 if (verbose)
sewardj4459baa2004-09-10 20:00:46 +000096 printf("============ Basic Block %d, "
97 "Start %x, nbytes %2d ============",
sewardj1f40a0a2004-07-21 12:28:07 +000098 bb_number, orig_addr, orig_nbytes);
sewardjced9fe52004-07-07 11:55:36 +000099 assert(orig_nbytes >= 1 && orig_nbytes <= N_ORIGBUF);
100 for (i = 0; i < orig_nbytes; i++) {
101 assert(1 == sscanf(&linebuf[2 + 3*i], "%x", &u));
102 origbuf[i] = (UChar)u;
103 }
104
sewardjf05537e2004-10-14 01:08:12 +0000105 if (bb_number == 1000) break;
sewardj81bd5502004-07-21 18:49:27 +0000106 {
sewardjf05537e2004-10-14 01:08:12 +0000107 for (i = 0; i < 100; i++)
sewardjced9fe52004-07-07 11:55:36 +0000108 tres =
109 LibVEX_Translate ( InsnSetX86, InsnSetX86,
110 origbuf, (Addr64)orig_addr, &orig_used,
111 transbuf, N_TRANSBUF, &trans_used,
sewardj58800ff2004-07-28 01:51:10 +0000112 NULL, NULL, 0 );
sewardj4459baa2004-09-10 20:00:46 +0000113 if (tres != TransOK)
114 printf("\ntres = %d\n", (Int)tres);
sewardjced9fe52004-07-07 11:55:36 +0000115 assert(tres == TransOK);
116 assert(orig_used == orig_nbytes);
sewardj1f40a0a2004-07-21 12:28:07 +0000117 }
sewardj4459baa2004-09-10 20:00:46 +0000118 sum = 0;
119 for (i = 0; i < trans_used; i++)
120 sum += (UInt)transbuf[i];
121 printf ( " %6.2f ... %d\n", (double)trans_used / (double)orig_used, sum );
sewardjced9fe52004-07-07 11:55:36 +0000122 }
123
124 fclose(f);
sewardjf05537e2004-10-14 01:08:12 +0000125 printf("\n");
sewardj1f40a0a2004-07-21 12:28:07 +0000126 LibVEX_ClearTemporary(True);
sewardjced9fe52004-07-07 11:55:36 +0000127
128#if 0
sewardjce605f92004-07-05 14:39:15 +0000129 Int* p;
130 Int i, j, n = 0;
sewardj887a11a2004-07-05 17:26:47 +0000131 LibVEX_Init ( &failure_exit, &log_bytes,
sewardjce605f92004-07-05 14:39:15 +0000132 1, 1, False, 10 );
133 for (j = 0; j < 5000; j++) {
sewardj887a11a2004-07-05 17:26:47 +0000134 LibVEX_Clear(False);
sewardjce605f92004-07-05 14:39:15 +0000135 for (i = 0; i < 2000; i++) {
136 n++;
137 p = LibVEX_Alloc(16);
138 p[0] = p[1] = p[2] = p[3] = 44;
139 }
140 }
sewardj887a11a2004-07-05 17:26:47 +0000141 LibVEX_Clear(True);
sewardjce605f92004-07-05 14:39:15 +0000142 printf("Did %d allocs\n", n);
sewardjced9fe52004-07-07 11:55:36 +0000143#endif
sewardjce605f92004-07-05 14:39:15 +0000144 return 0;
145}
146
147/*---------------------------------------------------------------*/
148/*--- Test (old) ---*/
149/*---------------------------------------------------------------*/
150
151#if 0
152
sewardj887a11a2004-07-05 17:26:47 +0000153#include "libvex_basictypes.h"
sewardjce605f92004-07-05 14:39:15 +0000154#include "ir_defs.h"
155#include "host_regs.h"
156#include "x86h_defs.h"
157
158
sewardjc97096c2004-06-30 09:28:04 +0000159/* HACK */
160extern
sewardj2cd80dc2004-07-02 15:20:40 +0000161HInstrArray* /* not really, but for the time being ... */
sewardj194d54a2004-07-03 19:08:18 +0000162 iselBB_X86Instr ( IRBB* bb );
sewardj0ec33252004-07-03 13:30:00 +0000163
sewardjc97096c2004-06-30 09:28:04 +0000164
165int main ( void )
166{
sewardj2cd80dc2004-07-02 15:20:40 +0000167 HInstrArray* vcode;
168 IRBB* bb;
169 IRTypeEnv* env = newIRTypeEnv();
sewardjc97096c2004-06-30 09:28:04 +0000170
sewardj12952ef2004-07-03 14:52:19 +0000171 IRTemp t0 = 0;
sewardjc97096c2004-06-30 09:28:04 +0000172 IRTemp t1 = 1;
173 IRTemp t2 = 2;
174
sewardj12952ef2004-07-03 14:52:19 +0000175 addToIRTypeEnv ( env, t0, Ity_I32 );
sewardjc97096c2004-06-30 09:28:04 +0000176 addToIRTypeEnv ( env, t1, Ity_I32 );
177 addToIRTypeEnv ( env, t2, Ity_I32 );
178
sewardj12952ef2004-07-03 14:52:19 +0000179 IRStmt* s10 = IRStmt_Tmp(t0, IRExpr_Const(IRConst_U32(0x2000)));
180 IRStmt* s11 = IRStmt_Tmp(t1, IRExpr_Const(IRConst_U32(0x2001)));
181 IRStmt* s12 = IRStmt_Tmp(t2, IRExpr_Const(IRConst_U32(0x2002)));
sewardj0ec33252004-07-03 13:30:00 +0000182
sewardjc97096c2004-06-30 09:28:04 +0000183 IRStmt* s1 = IRStmt_Put(8,4, IRExpr_Const(IRConst_U32(99)) );
sewardj12952ef2004-07-03 14:52:19 +0000184#if 0
sewardjc97096c2004-06-30 09:28:04 +0000185 IRStmt* s2 = IRStmt_Put(7,4, IRExpr_Binop(Iop_Add32,
186 IRExpr_Tmp(t1),
187 IRExpr_Const(IRConst_U32(55))));
sewardj12952ef2004-07-03 14:52:19 +0000188#endif
189
190 IRStmt* s2 = IRStmt_Put(9,4,
191 IRExpr_Binop(Iop_Shl32,
192 IRExpr_Tmp(t0),
193 IRExpr_Binop(Iop_Add32,
194 IRExpr_Tmp(t1),
195 IRExpr_Tmp(t2))));
196
197
sewardj0ec33252004-07-03 13:30:00 +0000198 s10->link = s11;
sewardj12952ef2004-07-03 14:52:19 +0000199 s11->link = s12;
200 s12->link = s1;
sewardjc97096c2004-06-30 09:28:04 +0000201 s1->link = s2;
202
sewardj0ec33252004-07-03 13:30:00 +0000203 bb = mk_IRBB(env, s10, IRNext_UJump(IRConst_U32(-65565)));
sewardjc97096c2004-06-30 09:28:04 +0000204
205 printf("bb is ...\n");
206 ppIRBB(stdout, bb);
207 printf("\n");
208
sewardj3b9d65e2004-07-03 19:52:16 +0000209 if (0)
sewardj194d54a2004-07-03 19:08:18 +0000210 vcode = iselBB_X86Instr(bb);
sewardj12952ef2004-07-03 14:52:19 +0000211 else
sewardj2cd80dc2004-07-02 15:20:40 +0000212 {
sewardj0ec33252004-07-03 13:30:00 +0000213 Int i;
214 HReg vr0 = mkHReg(0, HRcInt, True);
215 HReg vr1 = mkHReg(1, HRcInt, True);
216 HReg vr2 = mkHReg(2, HRcInt, True);
217 HReg vr3 = mkHReg(3, HRcInt, True);
218 HReg eax = hregX86_EAX();
219 HReg ebx = hregX86_EBX();
220 HReg ecx = hregX86_ECX();
221 HReg edx = hregX86_EDX();
222 HReg ebp = hregX86_EBP();
223 vcode = newHInstrArray();
sewardj3b9d65e2004-07-03 19:52:16 +0000224 vcode->n_vregs = 4;
sewardj0ec33252004-07-03 13:30:00 +0000225
226 addHInstr(vcode, X86Instr_Alu32R(Xalu_MOV,
227 X86RMI_Imm(0x10001), vr0));
228 addHInstr(vcode, X86Instr_Alu32R(Xalu_MOV,
229 X86RMI_Imm(0x10101), vr1));
230 addHInstr(vcode, X86Instr_Alu32R(Xalu_MOV,
231 X86RMI_Imm(0x10201), vr2));
232 addHInstr(vcode, X86Instr_Alu32R(Xalu_MOV,
233 X86RMI_Imm(0x10301), vr3));
234
235 addHInstr(vcode, X86Instr_Alu32R(Xalu_MOV,
236 X86RMI_Imm(0x99999), eax));
237 addHInstr(vcode, X86Instr_Alu32R(Xalu_MOV,
238 X86RMI_Imm(0x99999), edx));
239
240 addHInstr(vcode, X86Instr_Alu32M(Xalu_MOV,
241 X86RI_Reg(vr0),
242 X86AMode_IR(0x100, ebp)));
243 addHInstr(vcode, X86Instr_Alu32M(Xalu_MOV,
244 X86RI_Reg(vr1),
245 X86AMode_IR(0x101, ebp)));
246 addHInstr(vcode, X86Instr_Alu32M(Xalu_MOV,
247 X86RI_Reg(vr2),
248 X86AMode_IR(0x101, ebp)));
249 addHInstr(vcode, X86Instr_Alu32M(Xalu_MOV,
250 X86RI_Reg(vr3),
251 X86AMode_IR(0x101, ebp)));
252 printf("\nBefore\n");
253 for (i = 0; i < vcode->arr_used; i++) {
254 ppX86Instr(stdout, vcode->arr[i]);
255 printf("\n");
256 }
257 printf("\n");
258 }
259
260 {
261 Int i;
sewardj2cd80dc2004-07-02 15:20:40 +0000262 HInstrArray* rcode;
263 HReg rregs_to_use[4];
264 rregs_to_use[0] = hregX86_EAX();
265 rregs_to_use[1] = hregX86_EBX();
266 rregs_to_use[2] = hregX86_ECX();
267 rregs_to_use[3] = hregX86_EDX();
sewardjc97096c2004-06-30 09:28:04 +0000268
sewardj2cd80dc2004-07-02 15:20:40 +0000269 rcode =
sewardj194d54a2004-07-03 19:08:18 +0000270 doRegisterAllocation(vcode,
sewardj3b9d65e2004-07-03 19:52:16 +0000271 rregs_to_use, 3, /* rregs */
sewardj12952ef2004-07-03 14:52:19 +0000272 isMove_X86Instr,
sewardj2cd80dc2004-07-02 15:20:40 +0000273 getRegUsage_X86Instr,
274 mapRegs_X86Instr,
sewardj0ec33252004-07-03 13:30:00 +0000275 genSpill_X86,
276 genReload_X86
sewardj2cd80dc2004-07-02 15:20:40 +0000277 );
278
sewardj0ec33252004-07-03 13:30:00 +0000279 printf("\nAfter\n");
280 for (i = 0; i < rcode->arr_used; i++) {
sewardjfbcaf332004-07-08 01:46:01 +0000281 ppX86Instr(stdout, rcode->arr[i]);
282 printf("\n");
sewardj2cd80dc2004-07-02 15:20:40 +0000283 }
sewardj0ec33252004-07-03 13:30:00 +0000284 printf("\n");
285 }
286
sewardjc97096c2004-06-30 09:28:04 +0000287 return 0;
288}
sewardjce605f92004-07-05 14:39:15 +0000289#endif