]> code.bitgloo.com Git - clyne/forspll.git/commitdiff
switch target to x86-64
authorClyne Sullivan <clyne@bitgloo.com>
Thu, 27 Jun 2024 12:42:30 +0000 (08:42 -0400)
committerClyne Sullivan <clyne@bitgloo.com>
Thu, 27 Jun 2024 12:42:30 +0000 (08:42 -0400)
Makefile
ast.cpp
llvm.cpp
support.c
test.fp

index 7d20637e62cd813d157b519428cfaa08093ec33d..cb6748bbcbf4fa02c72e339c16b85113f40d9c3d 100644 (file)
--- 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 6aaa8a0ab6a43bf1a5c0d2758e1f2f2295266494..f6e607442e777de34c0ca9f27d58c2b7bf00f42c 100644 (file)
--- 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);
             }
         }
 
index 51d47061631fe3277d3ee0cf739d8c20ad5c96b4..c15d35df0aeb77f2e1a1478b8b5d7d161960cb66 100644 (file)
--- 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()
index e079de6af6045349a7055fdf47775cda9670f8b7..e513d06d13fbc97cceee5866ffb53158a7282309 100644 (file)
--- 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 222d919edb627475192fb9183716539b13fd1e24..3663d155a5bc6c01c82845405904d4efb64ad5ea 100644 (file)
--- 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