From 69d136281d0a0d7cd36a091a8a8d10f6b2473754 Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Thu, 27 Jun 2024 08:42:30 -0400 Subject: [PATCH] switch target to x86-64 --- Makefile | 6 +++--- ast.cpp | 4 ++-- llvm.cpp | 8 ++++---- support.c | 36 +++++++++++++++++++----------------- test.fp | 4 ++-- 5 files changed, 30 insertions(+), 28 deletions(-) diff --git a/Makefile b/Makefile index 7d20637..cb6748b 100644 --- a/Makefile +++ b/Makefile @@ -9,9 +9,9 @@ main: $(subst .cpp,.o,$(CXXFILES)) 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 diff --git a/ast.cpp b/ast.cpp index 6aaa8a0..f6e6074 100644 --- a/ast.cpp +++ b/ast.cpp @@ -36,7 +36,7 @@ static inline auto storeEnv(LLVMState& llvmState, llvm::Value *index, llvm::Valu { 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) {} @@ -132,7 +132,7 @@ llvm::Value *CallAST::codegen(LLVMState& llvmState) const 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); } } diff --git a/llvm.cpp b/llvm.cpp index 51d4706..c15d35d 100644 --- a/llvm.cpp +++ b/llvm.cpp @@ -21,7 +21,7 @@ LLVMState::LLVMState(): 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 {inttype->getPointerTo()}, false)), one(llvm::ConstantInt::get(inttype, 1)), @@ -38,7 +38,7 @@ llvm::Value *LLVMState::createPush(llvm::Value *var) { 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); @@ -48,7 +48,7 @@ llvm::Value *LLVMState::createPop() { 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); @@ -75,7 +75,7 @@ llvm::Value *LLVMState::createVariable(const std::string& name) 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() diff --git a/support.c b/support.c index e079de6..e513d06 100644 --- a/support.c +++ b/support.c @@ -2,8 +2,10 @@ #include #include -extern int32_t sp; -extern int32_t stack; +#define cell_t int64_t + +extern cell_t sp; +extern cell_t stack; void emit() { @@ -12,22 +14,22 @@ 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; } @@ -35,44 +37,44 @@ void cswap() 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(" "); for (int i = 0; i < sp; ++i) - printf("%d ", st[i]); + printf("%ld ", st[i]); putchar('\n'); } diff --git a/test.fp b/test.fp index 222d919..3663d15 100644 --- a/test.fp +++ b/test.fp @@ -10,8 +10,8 @@ (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