prog: main test.fp
./main < test.fp > forsp.ir
- llc -march=x86 -filetype=obj -relocation-model=pic forsp.ir -O2
- $(CC) -c support.c -m32 -O2
- $(CC) support.o forsp.ir.o -m32 -O2
+ llc -march=x86-64 -filetype=obj -relocation-model=pic forsp.ir -O2
+ $(CC) -c support.c -O2
+ $(CC) support.o forsp.ir.o -O2
clean:
rm -f a.out main *.ir *.o
{
auto ptrty = llvmState.inttype->getPointerTo();
auto var = llvmState.builder.CreateGEP(ptrty, scope.back().env, {index});
- return llvmState.builder.CreateStore(val, var, false);
+ return llvmState.builder.CreateStore(val, var);
}
NumberAST::NumberAST(const std::string& n): BaseAST(n) {}
if (!v.native) {
auto index = llvm::ConstantInt::get(llvmState.inttype, i++);
auto m = llvmState.builder.CreateGEP(ptrty, mem, {index});
- llvmState.builder.CreateStore(loadEnv(llvmState, v.value), m, false);
+ llvmState.builder.CreateStore(loadEnv(llvmState, v.value), m);
}
}
ctx(),
modul("forsp", ctx),
builder(ctx),
- inttype(llvm::Type::getInt32Ty(ctx)),
+ inttype(llvm::Type::getInt64Ty(ctx)),
stacktype(llvm::VectorType::get(inttype, 16, false)),
ftype(llvm::FunctionType::get(llvm::Type::getVoidTy(ctx), llvm::ArrayRef<llvm::Type *> {inttype->getPointerTo()}, false)),
one(llvm::ConstantInt::get(inttype, 1)),
{
auto dspval = builder.CreateLoad(inttype, llvmSp);
auto inc = builder.CreateAdd(dspval, one);
- builder.CreateStore(inc, llvmSp, false);
+ builder.CreateStore(inc, llvmSp);
auto gep = builder.CreateGEP(stacktype, llvmStack, {zero, dspval});
return builder.CreateStore(var, gep);
{
auto dspval = builder.CreateLoad(inttype, llvmSp);
auto dec = builder.CreateSub(dspval, one);
- builder.CreateStore(dec, llvmSp, false);
+ builder.CreateStore(dec, llvmSp);
auto gep = builder.CreateGEP(stacktype, llvmStack, {zero, dec});
return builder.CreateLoad(inttype, gep);
llvm::Constant *LLVMState::createInt(int n)
{
- return llvm::ConstantInt::get(ctx, llvm::APInt(32, n, true));
+ return llvm::ConstantInt::get(ctx, llvm::APInt(64, n, true));
}
void LLVMState::output()
#include <stdint.h>
#include <stdlib.h>
-extern int32_t sp;
-extern int32_t stack;
+#define cell_t int64_t
+
+extern cell_t sp;
+extern cell_t stack;
void emit()
{
void _print()
{
- printf("%d\n", *(&stack + --sp));
+ printf("%ld\n", *(&stack + --sp));
}
void sub()
{
- int32_t *st = &stack;
+ cell_t *st = &stack;
st[sp - 2] -= st[sp - 1];
--sp;
}
void cswap()
{
- int32_t *st = &stack;
+ cell_t *st = &stack;
--sp;
if (st[sp]) {
- int32_t tmp = st[sp - 1];
+ cell_t tmp = st[sp - 1];
st[sp - 1] = st[sp - 2];
st[sp - 2] = tmp;
}
void eq()
{
- int32_t *st = &stack;
+ cell_t *st = &stack;
--sp;
st[sp - 1] = st[sp - 1] == st[sp];
}
void alloc()
{
- int32_t *st = &stack;
- st[sp - 1] = (int32_t)malloc(st[sp - 1] * sizeof(int32_t));
+ cell_t *st = &stack;
+ st[sp - 1] = (cell_t)malloc(st[sp - 1] * sizeof(cell_t));
}
void dealloc()
{
- int32_t *st = &stack;
+ cell_t *st = &stack;
--sp;
- free((int32_t *)st[sp]);
+ free((cell_t *)st[sp]);
}
void peek()
{
- int32_t *st = &stack;
- st[sp - 1] = *(int32_t *)st[sp - 1];
+ cell_t *st = &stack;
+ st[sp - 1] = *(cell_t *)st[sp - 1];
}
void poke()
{
- int32_t *st = &stack;
+ cell_t *st = &stack;
sp -= 2;
- int32_t *ptr = (int32_t *)st[sp + 1];
+ cell_t *ptr = (cell_t *)st[sp + 1];
*ptr = st[sp];
}
void dumpstack()
{
- int32_t *st = &stack;
+ cell_t *st = &stack;
printf("<stack> ");
for (int i = 0; i < sp; ++i)
- printf("%d ", st[i]);
+ printf("%ld ", st[i]);
putchar('\n');
}
(10 emit) $cr
; if-stmt
- ($c $t $f c ^f ^t rot cswap $_ force) $if
- ($f $t $c $fn ^f ^t ^c fn) $endif
+ (force cswap drop force) $if
+ ($f $t $c $fn ^f ^t ^c fn) $endif
; range
($self $fn $start $end