On Thu, Aug 22, 2019 at 12:47:28PM -0500, Tom Uban via cctalk wrote: [...] > On a possible related note, I am looking for information on converting CISC > instructions to VLIW RISC.
Do you mean the theoretical basis, or implementing it? And is this ahead-of-time ("I want to run *this* binary"), or just-in-time ("I want to run *any* binary, including self-modifying code")? It's basically a compiler pipeline: deserialise the input code into an AST, then serialise it into output code. It's just that the input code is actual machine code rather than human-ented text. Various real-world implementations exist. QEMU, for example. VMWare also does it for ring-0 code if the host lacks VT-x. UAE definitely does it, and possiblt so does MAME. As you can see, it's basically a solved problem as far as computer science is concerned. If you have a copy of the Dragon Book to hand, you may as well give it a gander. The general concepts are timeless, but the actual nitty-gritty is only useful if you are still living in the 1970s, so don't spend too much time in the details of the algorithms because modern machines are so different that many of the book's design assumptions are now invalidated. (I base this opinion on my 1986 edition, although the TOC I've seen for the 2006 edition suggests that it's been dragged kicking and screaming into the 1990s.) There are *loads* of academic papers that you will have to wade through to advance from the Dragon Book's description of a kinder era to modern compiler design. Some of it remains an unsolved problem. You can see why the Dragon Book handwaves over the hard bits. To actually implement something that performs well and will actually be finished before your new VLIW RISC hardware is obsolete, I recommend you look at reusing existing compilers rather than implemting your own. The daddy of backends is LLVM. Unless your VLIW RISC is already supported, you get to learn how to implement an LLVM backend. It seems to be a common undergraduate assignment to implement an LLVM backend for an arbitrary RISC CPU (often MIPS) so you should be able to find myriad terrible implementations on GitHub to draw inspiration from. Another possibility is QEMU's TCG. I wasn't really aware of it until I did a quick search when compising this response, but I like what I see and now want to look much closer at it. Once you've done that, you need to decompile your CISC code into your chosen backend's IR. This involves a lot of tedious gruntwork, but is otherwise not that difficult. Have fun!