blob: 6aa6a767611c12ab846af394a69401562ccae71c [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
38#define N_ORIGBUF 200
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 */
sewardja8fc22c2004-10-09 09:33:54 +000068 1, /* verbosity */
sewardjbad34a92004-07-22 01:14:11 +000069 //False,
70 True,
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
sewardj1f40a0a2004-07-21 12:28:07 +0000105 // if (bb_number == 50) exit(1);
sewardj81bd5502004-07-21 18:49:27 +0000106 {
sewardj1f40a0a2004-07-21 12:28:07 +0000107 for (i = 0; i < 1; 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);
sewardj1f40a0a2004-07-21 12:28:07 +0000125 LibVEX_ClearTemporary(True);
sewardjced9fe52004-07-07 11:55:36 +0000126
127#if 0
sewardjce605f92004-07-05 14:39:15 +0000128 Int* p;
129 Int i, j, n = 0;
sewardj887a11a2004-07-05 17:26:47 +0000130 LibVEX_Init ( &failure_exit, &log_bytes,
sewardjce605f92004-07-05 14:39:15 +0000131 1, 1, False, 10 );
132 for (j = 0; j < 5000; j++) {
sewardj887a11a2004-07-05 17:26:47 +0000133 LibVEX_Clear(False);
sewardjce605f92004-07-05 14:39:15 +0000134 for (i = 0; i < 2000; i++) {
135 n++;
136 p = LibVEX_Alloc(16);
137 p[0] = p[1] = p[2] = p[3] = 44;
138 }
139 }
sewardj887a11a2004-07-05 17:26:47 +0000140 LibVEX_Clear(True);
sewardjce605f92004-07-05 14:39:15 +0000141 printf("Did %d allocs\n", n);
sewardjced9fe52004-07-07 11:55:36 +0000142#endif
sewardjce605f92004-07-05 14:39:15 +0000143 return 0;
144}
145
146/*---------------------------------------------------------------*/
147/*--- Test (old) ---*/
148/*---------------------------------------------------------------*/
149
150#if 0
151
sewardj887a11a2004-07-05 17:26:47 +0000152#include "libvex_basictypes.h"
sewardjce605f92004-07-05 14:39:15 +0000153#include "ir_defs.h"
154#include "host_regs.h"
155#include "x86h_defs.h"
156
157
sewardjc97096c2004-06-30 09:28:04 +0000158/* HACK */
159extern
sewardj2cd80dc2004-07-02 15:20:40 +0000160HInstrArray* /* not really, but for the time being ... */
sewardj194d54a2004-07-03 19:08:18 +0000161 iselBB_X86Instr ( IRBB* bb );
sewardj0ec33252004-07-03 13:30:00 +0000162
sewardjc97096c2004-06-30 09:28:04 +0000163
164int main ( void )
165{
sewardj2cd80dc2004-07-02 15:20:40 +0000166 HInstrArray* vcode;
167 IRBB* bb;
168 IRTypeEnv* env = newIRTypeEnv();
sewardjc97096c2004-06-30 09:28:04 +0000169
sewardj12952ef2004-07-03 14:52:19 +0000170 IRTemp t0 = 0;
sewardjc97096c2004-06-30 09:28:04 +0000171 IRTemp t1 = 1;
172 IRTemp t2 = 2;
173
sewardj12952ef2004-07-03 14:52:19 +0000174 addToIRTypeEnv ( env, t0, Ity_I32 );
sewardjc97096c2004-06-30 09:28:04 +0000175 addToIRTypeEnv ( env, t1, Ity_I32 );
176 addToIRTypeEnv ( env, t2, Ity_I32 );
177
sewardj12952ef2004-07-03 14:52:19 +0000178 IRStmt* s10 = IRStmt_Tmp(t0, IRExpr_Const(IRConst_U32(0x2000)));
179 IRStmt* s11 = IRStmt_Tmp(t1, IRExpr_Const(IRConst_U32(0x2001)));
180 IRStmt* s12 = IRStmt_Tmp(t2, IRExpr_Const(IRConst_U32(0x2002)));
sewardj0ec33252004-07-03 13:30:00 +0000181
sewardjc97096c2004-06-30 09:28:04 +0000182 IRStmt* s1 = IRStmt_Put(8,4, IRExpr_Const(IRConst_U32(99)) );
sewardj12952ef2004-07-03 14:52:19 +0000183#if 0
sewardjc97096c2004-06-30 09:28:04 +0000184 IRStmt* s2 = IRStmt_Put(7,4, IRExpr_Binop(Iop_Add32,
185 IRExpr_Tmp(t1),
186 IRExpr_Const(IRConst_U32(55))));
sewardj12952ef2004-07-03 14:52:19 +0000187#endif
188
189 IRStmt* s2 = IRStmt_Put(9,4,
190 IRExpr_Binop(Iop_Shl32,
191 IRExpr_Tmp(t0),
192 IRExpr_Binop(Iop_Add32,
193 IRExpr_Tmp(t1),
194 IRExpr_Tmp(t2))));
195
196
sewardj0ec33252004-07-03 13:30:00 +0000197 s10->link = s11;
sewardj12952ef2004-07-03 14:52:19 +0000198 s11->link = s12;
199 s12->link = s1;
sewardjc97096c2004-06-30 09:28:04 +0000200 s1->link = s2;
201
sewardj0ec33252004-07-03 13:30:00 +0000202 bb = mk_IRBB(env, s10, IRNext_UJump(IRConst_U32(-65565)));
sewardjc97096c2004-06-30 09:28:04 +0000203
204 printf("bb is ...\n");
205 ppIRBB(stdout, bb);
206 printf("\n");
207
sewardj3b9d65e2004-07-03 19:52:16 +0000208 if (0)
sewardj194d54a2004-07-03 19:08:18 +0000209 vcode = iselBB_X86Instr(bb);
sewardj12952ef2004-07-03 14:52:19 +0000210 else
sewardj2cd80dc2004-07-02 15:20:40 +0000211 {
sewardj0ec33252004-07-03 13:30:00 +0000212 Int i;
213 HReg vr0 = mkHReg(0, HRcInt, True);
214 HReg vr1 = mkHReg(1, HRcInt, True);
215 HReg vr2 = mkHReg(2, HRcInt, True);
216 HReg vr3 = mkHReg(3, HRcInt, True);
217 HReg eax = hregX86_EAX();
218 HReg ebx = hregX86_EBX();
219 HReg ecx = hregX86_ECX();
220 HReg edx = hregX86_EDX();
221 HReg ebp = hregX86_EBP();
222 vcode = newHInstrArray();
sewardj3b9d65e2004-07-03 19:52:16 +0000223 vcode->n_vregs = 4;
sewardj0ec33252004-07-03 13:30:00 +0000224
225 addHInstr(vcode, X86Instr_Alu32R(Xalu_MOV,
226 X86RMI_Imm(0x10001), vr0));
227 addHInstr(vcode, X86Instr_Alu32R(Xalu_MOV,
228 X86RMI_Imm(0x10101), vr1));
229 addHInstr(vcode, X86Instr_Alu32R(Xalu_MOV,
230 X86RMI_Imm(0x10201), vr2));
231 addHInstr(vcode, X86Instr_Alu32R(Xalu_MOV,
232 X86RMI_Imm(0x10301), vr3));
233
234 addHInstr(vcode, X86Instr_Alu32R(Xalu_MOV,
235 X86RMI_Imm(0x99999), eax));
236 addHInstr(vcode, X86Instr_Alu32R(Xalu_MOV,
237 X86RMI_Imm(0x99999), edx));
238
239 addHInstr(vcode, X86Instr_Alu32M(Xalu_MOV,
240 X86RI_Reg(vr0),
241 X86AMode_IR(0x100, ebp)));
242 addHInstr(vcode, X86Instr_Alu32M(Xalu_MOV,
243 X86RI_Reg(vr1),
244 X86AMode_IR(0x101, ebp)));
245 addHInstr(vcode, X86Instr_Alu32M(Xalu_MOV,
246 X86RI_Reg(vr2),
247 X86AMode_IR(0x101, ebp)));
248 addHInstr(vcode, X86Instr_Alu32M(Xalu_MOV,
249 X86RI_Reg(vr3),
250 X86AMode_IR(0x101, ebp)));
251 printf("\nBefore\n");
252 for (i = 0; i < vcode->arr_used; i++) {
253 ppX86Instr(stdout, vcode->arr[i]);
254 printf("\n");
255 }
256 printf("\n");
257 }
258
259 {
260 Int i;
sewardj2cd80dc2004-07-02 15:20:40 +0000261 HInstrArray* rcode;
262 HReg rregs_to_use[4];
263 rregs_to_use[0] = hregX86_EAX();
264 rregs_to_use[1] = hregX86_EBX();
265 rregs_to_use[2] = hregX86_ECX();
266 rregs_to_use[3] = hregX86_EDX();
sewardjc97096c2004-06-30 09:28:04 +0000267
sewardj2cd80dc2004-07-02 15:20:40 +0000268 rcode =
sewardj194d54a2004-07-03 19:08:18 +0000269 doRegisterAllocation(vcode,
sewardj3b9d65e2004-07-03 19:52:16 +0000270 rregs_to_use, 3, /* rregs */
sewardj12952ef2004-07-03 14:52:19 +0000271 isMove_X86Instr,
sewardj2cd80dc2004-07-02 15:20:40 +0000272 getRegUsage_X86Instr,
273 mapRegs_X86Instr,
sewardj0ec33252004-07-03 13:30:00 +0000274 genSpill_X86,
275 genReload_X86
sewardj2cd80dc2004-07-02 15:20:40 +0000276 );
277
sewardj0ec33252004-07-03 13:30:00 +0000278 printf("\nAfter\n");
279 for (i = 0; i < rcode->arr_used; i++) {
sewardjfbcaf332004-07-08 01:46:01 +0000280 ppX86Instr(stdout, rcode->arr[i]);
281 printf("\n");
sewardj2cd80dc2004-07-02 15:20:40 +0000282 }
sewardj0ec33252004-07-03 13:30:00 +0000283 printf("\n");
284 }
285
sewardjc97096c2004-06-30 09:28:04 +0000286 return 0;
287}
sewardjce605f92004-07-05 14:39:15 +0000288#endif