blob: 2c443b8ba25710f271265a738b2e66fbed8ed2db [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>
11
12#include "basictypes.h"
13#include "ir_defs.h"
sewardj2cd80dc2004-07-02 15:20:40 +000014#include "host_regs.h"
15#include "x86h_defs.h"
sewardjc97096c2004-06-30 09:28:04 +000016
17
18/*---------------------------------------------------------------*/
19/*--- Test ---*/
20/*---------------------------------------------------------------*/
21
22/* HACK */
23extern
sewardj2cd80dc2004-07-02 15:20:40 +000024HInstrArray* /* not really, but for the time being ... */
25 iselBB ( IRBB* bb );
26
sewardj0ec33252004-07-03 13:30:00 +000027/* HACK */
28X86Instr* genSpill_X86 ( HReg rreg, Int offset )
29{
30 assert(!hregIsVirtual(rreg));
31 switch (hregClass(rreg)) {
32 case HRcInt:
33 return
34 X86Instr_Alu32M ( Xalu_MOV, X86RI_Reg(rreg),
35 X86AMode_IR(offset + 0x1000,
36 hregX86_EBP()));
37 default:
38 ppHRegClass(stderr, hregClass(rreg));
39 panic("genSpill_X86: unimplemented regclass");
40 }
41}
42
43/* HACK */
44X86Instr* genReload_X86 ( HReg rreg, Int offset )
45{
46 assert(!hregIsVirtual(rreg));
47 switch (hregClass(rreg)) {
48 case HRcInt:
49 return
50 X86Instr_Alu32R ( Xalu_MOV,
51 X86RMI_Mem(X86AMode_IR(offset + 0x1000,
52 hregX86_EBP())),
53 rreg );
54 default:
55 ppHRegClass(stderr, hregClass(rreg));
56 panic("genReload_X86: unimplemented regclass");
57 }
58}
59
sewardjc97096c2004-06-30 09:28:04 +000060
61int main ( void )
62{
sewardj2cd80dc2004-07-02 15:20:40 +000063 HInstrArray* vcode;
64 IRBB* bb;
65 IRTypeEnv* env = newIRTypeEnv();
sewardjc97096c2004-06-30 09:28:04 +000066
sewardj12952ef2004-07-03 14:52:19 +000067 IRTemp t0 = 0;
sewardjc97096c2004-06-30 09:28:04 +000068 IRTemp t1 = 1;
69 IRTemp t2 = 2;
70
sewardj12952ef2004-07-03 14:52:19 +000071 addToIRTypeEnv ( env, t0, Ity_I32 );
sewardjc97096c2004-06-30 09:28:04 +000072 addToIRTypeEnv ( env, t1, Ity_I32 );
73 addToIRTypeEnv ( env, t2, Ity_I32 );
74
sewardj12952ef2004-07-03 14:52:19 +000075 IRStmt* s10 = IRStmt_Tmp(t0, IRExpr_Const(IRConst_U32(0x2000)));
76 IRStmt* s11 = IRStmt_Tmp(t1, IRExpr_Const(IRConst_U32(0x2001)));
77 IRStmt* s12 = IRStmt_Tmp(t2, IRExpr_Const(IRConst_U32(0x2002)));
sewardj0ec33252004-07-03 13:30:00 +000078
sewardjc97096c2004-06-30 09:28:04 +000079 IRStmt* s1 = IRStmt_Put(8,4, IRExpr_Const(IRConst_U32(99)) );
sewardj12952ef2004-07-03 14:52:19 +000080#if 0
sewardjc97096c2004-06-30 09:28:04 +000081 IRStmt* s2 = IRStmt_Put(7,4, IRExpr_Binop(Iop_Add32,
82 IRExpr_Tmp(t1),
83 IRExpr_Const(IRConst_U32(55))));
sewardj12952ef2004-07-03 14:52:19 +000084#endif
85
86 IRStmt* s2 = IRStmt_Put(9,4,
87 IRExpr_Binop(Iop_Shl32,
88 IRExpr_Tmp(t0),
89 IRExpr_Binop(Iop_Add32,
90 IRExpr_Tmp(t1),
91 IRExpr_Tmp(t2))));
92
93
sewardj0ec33252004-07-03 13:30:00 +000094 s10->link = s11;
sewardj12952ef2004-07-03 14:52:19 +000095 s11->link = s12;
96 s12->link = s1;
sewardjc97096c2004-06-30 09:28:04 +000097 s1->link = s2;
98
sewardj0ec33252004-07-03 13:30:00 +000099 bb = mk_IRBB(env, s10, IRNext_UJump(IRConst_U32(-65565)));
sewardjc97096c2004-06-30 09:28:04 +0000100
101 printf("bb is ...\n");
102 ppIRBB(stdout, bb);
103 printf("\n");
104
sewardj12952ef2004-07-03 14:52:19 +0000105 if (1)
106 vcode = iselBB(bb);
107 else
sewardj2cd80dc2004-07-02 15:20:40 +0000108 {
sewardj0ec33252004-07-03 13:30:00 +0000109 Int i;
110 HReg vr0 = mkHReg(0, HRcInt, True);
111 HReg vr1 = mkHReg(1, HRcInt, True);
112 HReg vr2 = mkHReg(2, HRcInt, True);
113 HReg vr3 = mkHReg(3, HRcInt, True);
114 HReg eax = hregX86_EAX();
115 HReg ebx = hregX86_EBX();
116 HReg ecx = hregX86_ECX();
117 HReg edx = hregX86_EDX();
118 HReg ebp = hregX86_EBP();
119 vcode = newHInstrArray();
120
121 addHInstr(vcode, X86Instr_Alu32R(Xalu_MOV,
122 X86RMI_Imm(0x10001), vr0));
123 addHInstr(vcode, X86Instr_Alu32R(Xalu_MOV,
124 X86RMI_Imm(0x10101), vr1));
125 addHInstr(vcode, X86Instr_Alu32R(Xalu_MOV,
126 X86RMI_Imm(0x10201), vr2));
127 addHInstr(vcode, X86Instr_Alu32R(Xalu_MOV,
128 X86RMI_Imm(0x10301), vr3));
129
130 addHInstr(vcode, X86Instr_Alu32R(Xalu_MOV,
131 X86RMI_Imm(0x99999), eax));
132 addHInstr(vcode, X86Instr_Alu32R(Xalu_MOV,
133 X86RMI_Imm(0x99999), edx));
134
135 addHInstr(vcode, X86Instr_Alu32M(Xalu_MOV,
136 X86RI_Reg(vr0),
137 X86AMode_IR(0x100, ebp)));
138 addHInstr(vcode, X86Instr_Alu32M(Xalu_MOV,
139 X86RI_Reg(vr1),
140 X86AMode_IR(0x101, ebp)));
141 addHInstr(vcode, X86Instr_Alu32M(Xalu_MOV,
142 X86RI_Reg(vr2),
143 X86AMode_IR(0x101, ebp)));
144 addHInstr(vcode, X86Instr_Alu32M(Xalu_MOV,
145 X86RI_Reg(vr3),
146 X86AMode_IR(0x101, ebp)));
147 printf("\nBefore\n");
148 for (i = 0; i < vcode->arr_used; i++) {
149 ppX86Instr(stdout, vcode->arr[i]);
150 printf("\n");
151 }
152 printf("\n");
153 }
154
155 {
156 Int i;
sewardj2cd80dc2004-07-02 15:20:40 +0000157 HInstrArray* rcode;
158 HReg rregs_to_use[4];
159 rregs_to_use[0] = hregX86_EAX();
160 rregs_to_use[1] = hregX86_EBX();
161 rregs_to_use[2] = hregX86_ECX();
162 rregs_to_use[3] = hregX86_EDX();
sewardjc97096c2004-06-30 09:28:04 +0000163
sewardj2cd80dc2004-07-02 15:20:40 +0000164 rcode =
sewardj12952ef2004-07-03 14:52:19 +0000165 doRegisterAllocation(vcode, 5, /* vregs */
sewardj2cd80dc2004-07-02 15:20:40 +0000166 rregs_to_use, 4, /* rregs */
sewardj12952ef2004-07-03 14:52:19 +0000167 isMove_X86Instr,
sewardj2cd80dc2004-07-02 15:20:40 +0000168 getRegUsage_X86Instr,
169 mapRegs_X86Instr,
sewardj0ec33252004-07-03 13:30:00 +0000170 genSpill_X86,
171 genReload_X86
sewardj2cd80dc2004-07-02 15:20:40 +0000172 );
173
sewardj0ec33252004-07-03 13:30:00 +0000174 printf("\nAfter\n");
175 for (i = 0; i < rcode->arr_used; i++) {
176 ppX86Instr(stdout, rcode->arr[i]);
177 printf("\n");
sewardj2cd80dc2004-07-02 15:20:40 +0000178 }
sewardj0ec33252004-07-03 13:30:00 +0000179 printf("\n");
180 }
181
sewardjc97096c2004-06-30 09:28:04 +0000182 return 0;
183}