Commit Graph

281 Commits

Author SHA1 Message Date
Quentin Carbonneaux
e5983ba1a2 fix 2 bad bugs in rega and improve substraction
The substraction contrained the register allocator
to allocate a different register for the result and
the second operand, now, we use a neg trick to compile
it down.  The machinery that was setup is, regardless,
interesting and will have to be used for floating
point computations (division).

The first bug in rega made broke the explicited loop
invariant:  we were using register allocation unavailable
information from other blocks.  It's still unclear
how we got wrong results from that considering mappings
are all 0-initialized.

The second bug is a stupid one, one sizeof operator was
missing from a memcpy...
2015-09-15 23:01:30 -04:00
Quentin Carbonneaux
7cb3e8587f use nreg only when != NReg 2015-09-15 23:01:30 -04:00
Quentin Carbonneaux
078522cf5d use a temporary for constant comparisons 2015-09-15 23:01:30 -04:00
Quentin Carbonneaux
dba612623f fix limit bug in spill
I think this was not a big issue because the register
allocator does not consume a register when it encounters
obviously dead code.
2015-09-15 23:01:30 -04:00
Quentin Carbonneaux
d673d8fcd2 remove useless TODO for now 2015-09-15 23:01:30 -04:00
Quentin Carbonneaux
9c7b06d68f quick fix for comparisons with constants 2015-09-15 23:01:30 -04:00
Quentin Carbonneaux
246a48ba94 start work on comparisons
There are two things I overlooked so far.

1. Binary instructions like cmp that do not have a result
   in registers need the size suffix sometimes, for example
   when comparing a spill location with a constant.

2. The register allocator needs to be adapted to support the
   comparison instruction: it is not possible to compare two
   spill locations without using a register.
2015-09-15 23:01:30 -04:00
Quentin Carbonneaux
1477dffe32 use cmp $0, it works with spill slots 2015-09-15 23:01:30 -04:00
Quentin Carbonneaux
df358ad6d2 use correct sizes during reg allocation 2015-09-15 23:01:30 -04:00
Quentin Carbonneaux
d586852552 print registers with numbers 2015-09-15 23:01:30 -04:00
Quentin Carbonneaux
6f2a7a245a adapt emit to new Ref setting 2015-09-15 23:01:30 -04:00
Quentin Carbonneaux
0c20fda622 use regs of the correct type in isel 2015-09-15 23:01:30 -04:00
Quentin Carbonneaux
9456200d91 use a new Ref type for registers
This might not be a good idea, the problem was that
many spurious registers would be added to the Bits
data-structures during compilation (and would
always remain 0).  However, doing the above
modification de-uniformizes the handling of temps
and regs, this makes the code longer and not
really nicer.  Also, additional Bits structures
are required to track the registers independently.

Overall this might be a bad idea to revert.
2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
93601b6d02 patch isel to use symbol types 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
033dce6e17 silence clang warning 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
53e6393295 avoid name conflicts in enums 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
8d2d674466 start change of representation for registers 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
cf307002d9 start work on word/long handling 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
dff7044a2c replace IA with X for x64 instructions 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
0d5fb419e3 avoid keyword clash by using cons for constants 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
a2a2231027 cosmetic modifications to parse.c 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
d8d17705c4 clean the commutativity + fix bug in emit
The commutativity information only makes sense for
arithmetic expressions.  To account for that, I introduced
a new tri-valued boolean type B3.  Memory operations, for
example, will receive an undefined commutativity trit.

The code emitter was buggy when rega emitted instructions
like 'rax = add 1, rax', this is now fixed using the
commutativity information (we rewrite it in 'rax = add
rax, 1').
2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
1a78659dfa cosmetics 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
390045cae1 compress parsref code a little 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
92be2fdd17 start improving constants support 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
837c46ca81 add TODO 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
33b0d919e8 add support for in-block reg. contraints 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
bd0a00e555 perform isel before code emission 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
d8e40a56ec emit some x86-sepcific instructions 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
5fe13b14e2 compile emit module 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
fd964388f7 add a code emitter for at&t syntax 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
5f14d7fd7c silence clang warning 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
854ecd4009 add crippled dce to the allocator 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
8899449c39 complete a crude register allocator 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
ee784dbfcd start work on parallel moves 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
33fe5637c5 initiate work on reg allocation 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
8aa8070248 simplify spiller
It seems that this logic of shuffling stuff around
between blocks should be handled by the register
allocator instead: it *will* have to shuffle
between registers, so we might as well mix some
spill locations in.
2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
b6633a13bc finish spiller, now needs testing! 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
48f90356e0 new euclidean division test 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
5bd9deac8d add more printing support 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
e3356b23d5 standardize error message 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
f938fccd2b factor some spilling logic 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
da652b93f3 comment and fix if(BSET(..)) bug 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
5ac9fbd8e4 new spill test 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
36da4b30cc test isel 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
df0836e475 isel logic was moved to spill 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
2981a267f4 add slot addressing and some more spilling 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
ea811ab7c2 add simple spill test 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
49130f9edd prepare for block processing 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
abdcbe845a this makefile fu was useless 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
ee961fb487 always preserve last build 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
eb1df2b81e refine assertion in cost computation 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
4f4d4cce6f rework spilling code for jump arguments 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
0d1595c770 refine precision of loop use sets 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
2a4fbbc6e0 move some debug output out of main 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
7202c7dedf simplify tests for hd 2015-09-15 23:01:29 -04:00
Quentin Carbonneaux
1891a810e8 nicer debug, bug fixed in loop detection 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
58c314eeaf cosmetics 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
b35a7d2acd alt.ssa was in buggy ssa form 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
890c0ada0e attempt to fix loop uses/pressure in spill 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
5ad565e299 improve output, add debug array 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
bb2541693e correct phi usage accounting 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
6e8e6d3368 show more spilling data 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
037c1bf141 simplifications 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
a6168e6ed5 attempt more correct loop marking 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
3538e769a7 add a live-through temporary to test alt 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
4f9a5df76b more testing code 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
7f8a6d025c test code for the spiller 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
595ad96a34 cosmetics 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
8165e327e0 start working with loops in spill.c 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
0f0ee0466e rework liveness to compute reg pressure 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
7be3711bb6 add pressure in left block of alt.ssa 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
18cdbc1e7d add fun example! 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
226bbb5b71 fix some instruction emitting code 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
73add5daae start work on spiller 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
32cb8d315a define curi as a global too 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
186e68a8d3 single bit bitfield needs to be unsigned 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
bba9cf47c9 fix small type issues 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
a244ca17f1 start simple work on isel 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
a280eb6597 export error functions 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
e5a7482b54 rename mod to rem 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
c16532b9b0 remove useless typedefs 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
9ecfdf6334 cosmetics 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
77bdb3ae9e move main function out of parse.c 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
7295adcade fix allocation bug 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
9b2823a9f4 simplify liveness 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
f3eb798d54 do not use _ in identifiers 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
395891e95c fix phi handling in liveness 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
d7548fa5d7 add rpo test and some liveness code 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
58bd1de264 add tests for ssa fixing 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
6c5c11cb1d simplify block handling 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
22c69707ce cosmetics 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
7e53000a1f use argument array for all instructions 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
60f60425cd object files depend on lisc.h 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
17e48f5221 change Ref to a struct 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
065565be83 move opdesc definition 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
0cb8198493 fix some more parsing bugs 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
5a21c7af52 patch jumps too in ssafix 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
66c006eb6d fix some parsing bug of phi nodes 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
68c6feefbd add pretty printing function 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
ba1b430524 compile ssa 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
9c958d75a3 update ssa module 2015-09-15 23:01:28 -04:00
Quentin Carbonneaux
a9b2d0338b change phi nodes representation 2015-09-15 23:01:27 -04:00
Quentin Carbonneaux
476e54c5d5 change example to hypothetical syntax 2015-09-15 23:01:27 -04:00
Quentin Carbonneaux
afb46fe317 remove unused lo.c 2015-09-15 23:01:27 -04:00
Quentin Carbonneaux
529920d4f4 give blocks an id 2015-09-15 23:01:27 -04:00
Quentin Carbonneaux
d165818c66 remove useless parameter in top,bot def 2015-09-15 23:01:27 -04:00
Quentin Carbonneaux
8f5548f558 update ssafix, still buggy 2015-09-15 23:01:27 -04:00
Quentin Carbonneaux
cff56263fa compile the ssa module 2015-09-15 23:01:27 -04:00
Quentin Carbonneaux
e4f07478ce fix naming 2015-09-15 23:01:27 -04:00
Quentin Carbonneaux
cec786d530 first blood at ssa reconstruction 2015-09-15 23:01:27 -04:00
Quentin Carbonneaux
5f39a368ac free old rpo information before overwriting 2015-09-15 23:01:27 -04:00
Quentin Carbonneaux
851e79f959 add rpo information to functions 2015-09-15 23:01:27 -04:00
Quentin Carbonneaux
11db0b61d9 properly clear predecessors in fillpreds 2015-09-15 23:01:27 -04:00
Quentin Carbonneaux
935ab611f0 add predecessor computation 2015-09-15 23:01:27 -04:00
Quentin Carbonneaux
1d62b4bf47 fix multiple block definition check 2015-09-15 23:01:27 -04:00
Quentin Carbonneaux
1e0d8e2f64 add a Makefile in lisc 2015-09-15 23:01:27 -04:00
Quentin Carbonneaux
4796ee984f add gitignore in lisc 2015-09-15 23:01:27 -04:00
Quentin Carbonneaux
ebe91da7fe cosmetics 2015-09-15 23:01:27 -04:00
Quentin Carbonneaux
653cc83c00 forward decls of enums are not allowed in iso c 2015-09-15 23:01:27 -04:00
Quentin Carbonneaux
15be4030ac factoring? in the lexer 2015-09-15 23:01:27 -04:00
Quentin Carbonneaux
a7f459b291 remove useless errstr 2015-09-15 23:01:27 -04:00
Quentin Carbonneaux
3765d2c33d rename branching cnd to jez 2015-09-15 23:01:27 -04:00
Quentin Carbonneaux
6d0ffe2291 fix comment 2015-09-15 23:01:27 -04:00
Quentin Carbonneaux
a3e217c58f add a sample program 2015-09-15 23:01:27 -04:00
Quentin Carbonneaux
a40982bb2a add comments 2015-09-15 23:01:27 -04:00
Quentin Carbonneaux
7c92b5a0c4 trivial bugs 2015-09-15 23:01:27 -04:00
Quentin Carbonneaux
fc814c5873 attempt to complete the crappy parser 2015-09-15 23:01:27 -04:00
Quentin Carbonneaux
a9d8bf7a2d change references representation 2015-09-15 23:01:27 -04:00
Quentin Carbonneaux
762330d6fa try writing a parser, painful 2015-09-15 23:01:27 -04:00
Quentin Carbonneaux
fae1b41e9d some new C 2015-09-15 23:01:27 -04:00