summary refs log tree commit diff
AgeCommit message (Collapse)Author
2015-09-15simplify call handling in spillerQuentin Carbonneaux
2015-09-15heavy modification of call handlingQuentin Carbonneaux
The IR generated by calls was very bulky because two instructions were used for marking the live range of a clobber. This patch attempts to store the information of what registers are use/def/clobber in the call instruction itself, this leads to more compact code (even more when we'll have SSE registers). However, I find that the amount of extra code needed is not really easonable. Fortunately it is not too invasive, thus if the complexity creeps in, it should be easy to revert.
2015-09-15emit stack fixup only when necessaryQuentin Carbonneaux
2015-09-15cosmetic indentation style fixQuentin Carbonneaux
2015-09-15reshuffle instructions around callQuentin Carbonneaux
2015-09-15drop arity information from OpDescQuentin Carbonneaux
2015-09-15add a simple function call testQuentin Carbonneaux
2015-09-15hack to enable proper regalloc on callsQuentin Carbonneaux
I add the dual to dummy uses: dummy defs. They are compiled to nothing, but help preserving the invariants I had when writing the register allocator. Clearly, there should be a better way.
2015-09-15fix alignment for structs on the stackQuentin Carbonneaux
2015-09-15diagnose float structsQuentin Carbonneaux
2015-09-15implement aggregate passing in regsQuentin Carbonneaux
2015-09-15start function call lowering (wip)Quentin Carbonneaux
2015-09-15add parsing code for function callsQuentin Carbonneaux
2015-09-15define a new CMPS macro, shorten TypeQuentin Carbonneaux
2015-09-15make type size unsignedQuentin Carbonneaux
2015-09-15fix minor type parsing bugsQuentin Carbonneaux
2015-09-15turn test files in one function definitionQuentin Carbonneaux
2015-09-15start work on aggregate typesQuentin Carbonneaux
The parser now has some code to parse the description of structured types. I tried to be even less specific than LLVM "type" by creating just enough abstraction so that I can deal with both AARCH64 and x64. The base types used in the definition of an aggregate are really just syntactic sugar to give a structure a size and an alignment. Only the location of float components matters for the compilation. In particular this means that the front-ends have to know how the ABI works to pass/return small integer types. This also means that the font-end has to be aware of the layout of structures. Chris Lattner has a proposition [1] for LLVM that is still pending and goes in the direction of giving more control of the ABI the front-end. [1]: http://www.nondot.org/sabre/LLVMNotes/ExtendedIntegerResults.txt
2015-09-15add source and authorship to cprime.ssaQuentin Carbonneaux
2015-09-15add the first generated test!Quentin Carbonneaux
2015-09-15split some long callsQuentin Carbonneaux
2015-09-15new alignment testQuentin Carbonneaux
This test also exposes a loose handling of clobbers, I think it should be possible to compile it without spilling.
2015-09-15get rid of OTruncQuentin Carbonneaux
2015-09-15fix two bugs in new emitQuentin Carbonneaux
2015-09-15update emit to the new settingQuentin Carbonneaux
2015-09-15new meaning for comparison typesQuentin Carbonneaux
Before, they designated the width of the comparison result, but now, it specifies the size of the arguments.
2015-09-15the wide bit of OAddr matters!Quentin Carbonneaux
2015-09-15more modifications to regaQuentin Carbonneaux
2015-09-15add a size to all operations (wip)Quentin Carbonneaux
2015-09-15add new prime finding programQuentin Carbonneaux
2015-09-15fix invalid test in emitQuentin Carbonneaux
It could be that the destination of the copy is a spill location, so we have to check the type of i.to first.
2015-09-15my assumptions in dopm() were wrongQuentin Carbonneaux
revert commit d0e9e3ada106dfe8dcda7a0099b341000f00afb2.
2015-09-15output labels only when necessaryQuentin Carbonneaux
2015-09-15simplify rega's dopm()Quentin Carbonneaux
2015-09-15make spiller aware of parallel assignmentsQuentin Carbonneaux
2015-09-15fix comments in pmovQuentin Carbonneaux
2015-09-15update dopm()Quentin Carbonneaux
I could never figure out a correct version without the tests. I'm now fairly confident dopm() will work as we need it to.
2015-09-15write more tests for dopm()Quentin Carbonneaux
2015-09-15add helpful diagnosticsQuentin Carbonneaux
2015-09-15add test scaffolding codeQuentin Carbonneaux
2015-09-15start exhaustive testing dopm()Quentin Carbonneaux
2015-09-15work in progress on parallel movesQuentin Carbonneaux
The old code was broken for sure, this one might be. I have to create a test bench for the dopm function. It would also test the parallel move lowering (pmgen and folks).
2015-09-15use loop frequency in ties of rpoQuentin Carbonneaux
2015-09-15fix two bugs in regaQuentin Carbonneaux
The first one was not so bad, when we a parallel move clobbers one machine register in use, we used to free the temporary t* using it, mark the register as unavailable and allocate a new location for the t*. But this fails when all the registers are in use. In that case, the destination of the move must be in a register r1, so I require a swap of the register to copy (used by t*) with r1 and update the map accordingly. I would like to move all the above logic in a function dealing with clobbers in general. The second bug is in the parallel move compiler, this one was a little more nasty and could have caused much debugging pain. It would be reasonable to test it in a similar way that I did for the slota() allocator.
2015-09-15change cmp $0, %reg, to test %reg, %regQuentin Carbonneaux
2015-09-15fix emit(OCopy) and use pointers in max.ssaQuentin Carbonneaux
2015-09-15alloc16 comes for free, iiuc the abiQuentin Carbonneaux
2015-09-15remove non-critical diagnosticsQuentin Carbonneaux
2015-09-15add truncation operationQuentin Carbonneaux
It would be nicer to have some kind of subtyping where a l variable can be used in place of a w variable but it is more complications than a truncation insutruction. In some cases, it might be less efficient than the above solution by requiring two registers instead of one. (I.e when both the truncated variable and the long variable live together.) We have to see what are the usage patterns.
2015-09-15remove dead code from regaQuentin Carbonneaux
An invariant is that all registers allocated at some point have a hint. This makes the code removed by this commit dead because of the if condition testing for empty hints.