corda/src/compiler.h

110 lines
3.6 KiB
C
Raw Normal View History

#ifndef COMPILER_H
#define COMPILER_H
2007-11-21 22:15:33 +00:00
#include "system.h"
#include "zone.h"
2008-02-11 17:21:41 +00:00
#include "assembler.h"
2007-11-21 22:15:33 +00:00
namespace vm {
class Compiler {
public:
2008-02-11 17:21:41 +00:00
static const unsigned Aligned = 1 << 0;
static const unsigned NoReturn = 1 << 1;
2007-12-30 22:24:48 +00:00
2008-02-11 17:21:41 +00:00
class Operand { };
2007-12-30 22:24:48 +00:00
virtual ~Compiler() { }
2008-02-11 17:21:41 +00:00
virtual void pushState() = 0;
virtual void popState() = 0;
virtual void init(unsigned logicalCodeSize, unsigned localFootprint) = 0;
virtual void visitLogicalIp(unsigned logicalIp) = 0;
virtual void startLogicalIp(unsigned logicalIp) = 0;
2007-12-16 00:24:15 +00:00
virtual Promise* machineIp(unsigned logicalIp) = 0;
2007-11-26 23:15:53 +00:00
2008-02-11 17:21:41 +00:00
virtual Promise* poolAppend(intptr_t value) = 0;
virtual Promise* poolAppendPromise(Promise* value) = 0;
2007-11-21 22:15:33 +00:00
2008-02-11 17:21:41 +00:00
virtual Operand* constant(intptr_t value) = 0;
virtual Operand* constant8(int64_t value) = 0;
virtual Operand* promiseConstant(Promise* value) = 0;
virtual Operand* promiseConstant8(Promise* value) = 0;
virtual Operand* address(Promise* address) = 0;
2007-12-30 22:24:48 +00:00
virtual Operand* memory(Operand* base,
int displacement = 0,
Operand* index = 0,
unsigned scale = 1,
TraceHandler* traceHandler = 0) = 0;
virtual Operand* stack() = 0;
virtual Operand* base() = 0;
virtual Operand* thread() = 0;
2007-11-21 22:15:33 +00:00
virtual Operand* label() = 0;
2008-02-11 17:21:41 +00:00
virtual void mark(Operand* label) = 0;
virtual void push(Operand* value) = 0;
virtual Operand* pop() = 0;
virtual void push(unsigned count) = 0;
virtual void pop(unsigned count) = 0;
virtual Operand* peek(unsigned index) = 0;
virtual Operand* call(Operand* address,
void* indirection,
unsigned flags,
TraceHandler* traceHandler,
unsigned resultSize,
unsigned argumentCount,
...) = 0;
virtual void return_(Operand* value) = 0;
virtual void store(Operand* src, Operand* dst) = 0;
virtual void store1(Operand* src, Operand* dst) = 0;
virtual void store2(Operand* src, Operand* dst) = 0;
virtual void store4(Operand* src, Operand* dst) = 0;
virtual void store8(Operand* src, Operand* dst) = 0;
virtual Operand* load(Operand* src) = 0;
virtual Operand* load1(Operand* src) = 0;
virtual Operand* load2(Operand* src) = 0;
virtual Operand* load2z(Operand* src) = 0;
virtual Operand* load4(Operand* src) = 0;
virtual Operand* load8(Operand* src) = 0;
virtual Operand* load4To8(Operand* src) = 0;
virtual void cmp(Operand* a, Operand* b) = 0;
virtual void jl(Operand* address) = 0;
virtual void jg(Operand* address) = 0;
virtual void jle(Operand* address) = 0;
virtual void jge(Operand* address) = 0;
virtual void je(Operand* address) = 0;
virtual void jne(Operand* address) = 0;
virtual void jmp(Operand* address) = 0;
virtual Operand* add(Operand* a, Operand* b) = 0;
virtual Operand* sub(Operand* a, Operand* b) = 0;
virtual Operand* mul(Operand* a, Operand* b) = 0;
virtual Operand* div(Operand* a, Operand* b) = 0;
virtual Operand* rem(Operand* a, Operand* b) = 0;
virtual Operand* shl(Operand* a, Operand* b) = 0;
virtual Operand* shr(Operand* a, Operand* b) = 0;
virtual Operand* ushr(Operand* a, Operand* b) = 0;
virtual Operand* and_(Operand* a, Operand* b) = 0;
virtual Operand* or_(Operand* a, Operand* b) = 0;
virtual Operand* xor_(Operand* a, Operand* b) = 0;
virtual Operand* neg(Operand* a) = 0;
virtual unsigned compile() = 0;
2007-12-11 23:52:28 +00:00
virtual unsigned poolSize() = 0;
2008-02-11 17:21:41 +00:00
virtual void writeTo(uint8_t* dst) = 0;
2007-11-26 23:15:53 +00:00
2007-11-21 22:15:33 +00:00
virtual void dispose() = 0;
};
2007-11-21 22:15:33 +00:00
Compiler*
2008-02-11 17:21:41 +00:00
makeCompiler(System* system, Assembler* assembler, Zone* zone);
2007-11-21 22:15:33 +00:00
} // namespace vm
#endif//COMPILER_H