Backend for the ZPU - a stack based / zero operand CPU

Hi all,

Zylin has implemented the world smallest 32 bit CPU with
a GCC backend. (I shall stand corrected if anyone claims
& proves otherwise :slight_smile:

Implementing a GCC backend for a zero operand/stack based
architecture proved pretty tricky, but I'm quite pleased with
the resulting code. I did make alterations to the architecture
to make it fit GCC without sacrificing CPU size.

I have been following llvm.org from a distance, since I finished
the GCC backend a couple of years back and there has not
really been a reason to build a new compiler for the ZPU.

My llvm.org knowledge is ... shallow ... but I'm hoping that
someone would find the time & pity to answer my questions:

Q: Is a stack based / zero operand CPU and llvm a good match? (GCC
wasn't)

Q: Should I expect better code density / performance from llvm than GCC for
said architecture?

Q: Can llvm help move global data into flash(i.e. determine that global C
variables are in fact constants)?

The ZPU would probably be most effective in highly space constrained
applications(kBytes of code/data), such that it would fit entirely onto
an FPGA/CPLD. It has very high code density (~80% of ARM Thumb)

Overview of architecture(documentation is definitely the weak side of
the ZPU):

http://www.zylin.com/zpu_arch.html

The ZPU is now hosted at:

http://www.opencores.org/projects.cgi/web/zpu/overview

My llvm.org knowledge is ... shallow ... but I'm hoping that
someone would find the time & pity to answer my questions:

Q: Is a stack based / zero operand CPU and llvm a good match? (GCC
wasn't)

I'm not really sure, I'm not too familiar with these architectures. One advantage of llvm is that it is relatively easy to do custom code generation phases. For example, you probably don't want to run the register allocator at all.

Q: Should I expect better code density / performance from llvm than GCC for
said architecture?

Hard to say. In general, LLVM has better high level optimizations than GCC, so if that is a factor, yes.

Q: Can llvm help move global data into flash(i.e. determine that global C
variables are in fact constants)?

LLVM does aggressively mark globals as const when there are no stores to them.

-Chris

You might try looking at the recent work on PIC16. If you look through the list archives, one of the developers wrote about his experiences using LLVM for such a constrained architecture. To summarize: while LLVM didn't offhand support the oddities of his architecture, it was easier to modifying to work with them than other compilers he had worked with.

--Owen