aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClyne Sullivan <clyne@bitgloo.com>2024-06-27 08:42:30 -0400
committerClyne Sullivan <clyne@bitgloo.com>2024-06-27 08:42:30 -0400
commit69d136281d0a0d7cd36a091a8a8d10f6b2473754 (patch)
treea4af5c118af92edb19854045b0bdd60df63ff4c1
parent0d8932e96934dbeb0f1e21872693ca833a64341f (diff)
switch target to x86-64
-rw-r--r--Makefile6
-rw-r--r--ast.cpp4
-rw-r--r--llvm.cpp8
-rw-r--r--support.c36
-rw-r--r--test.fp4
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<llvm::Type *> {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 <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()
{
@@ -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("<stack> ");
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