mirror of
https://github.com/janet-lang/janet
synced 2025-01-02 20:00:26 +00:00
More work on drawing example and frontend changes.
This commit is contained in:
parent
046d299d77
commit
4396f01297
@ -15,9 +15,15 @@
|
|||||||
(defpointer cursor p32)
|
(defpointer cursor p32)
|
||||||
|
|
||||||
# Linux syscalls
|
# Linux syscalls
|
||||||
(defn-syscall brk:p32 12 [amount:uint])
|
# (defn-syscall brk:p32 12 [amount:uint])
|
||||||
(defn-syscall exit:void 60 [code:int])
|
# (defn-syscall exit:void 60 [code:int])
|
||||||
(defn-syscall write:void 1 [fd:int data:p32 size:uint])
|
# (defn-syscall write:void 1 [fd:int data:p32 size:uint])
|
||||||
|
# (defn-syscall write_string 1 [fd:int data:pointer size:uint])
|
||||||
|
|
||||||
|
# External
|
||||||
|
(defn-external write:void [fd:int mem:pointer size:uint])
|
||||||
|
(defn-external exit:void [x:int])
|
||||||
|
(defn-external malloc:p32 [size:uint])
|
||||||
|
|
||||||
(defsys w32:void [c:cursor x:uint]
|
(defsys w32:void [c:cursor x:uint]
|
||||||
(def p:p32 (load c))
|
(def p:p32 (load c))
|
||||||
@ -34,10 +40,10 @@
|
|||||||
|
|
||||||
(defsys makebmp:p32 [w:uint h:uint]
|
(defsys makebmp:p32 [w:uint h:uint]
|
||||||
(def size:uint (+ 56 (* w h 4)))
|
(def size:uint (+ 56 (* w h 4)))
|
||||||
(def mem:p32 (brk size))
|
(def mem:p32 (malloc size))
|
||||||
|
(def c:cursor (cast (malloc 4)))
|
||||||
#(def cursor_data:p32 mem)
|
#(def cursor_data:p32 mem)
|
||||||
#(def c:cursor (address cursor_data))
|
#(def c:cursor (address cursor_data))
|
||||||
(def c:cursor (cast (brk 4)))
|
|
||||||
(store c mem)
|
(store c mem)
|
||||||
(w16 c 0x4D42) # ascii "BM"
|
(w16 c 0x4D42) # ascii "BM"
|
||||||
(w32 c size)
|
(w32 c size)
|
||||||
@ -72,18 +78,15 @@
|
|||||||
(write 1 mem size)
|
(write 1 mem size)
|
||||||
(return mem))
|
(return mem))
|
||||||
|
|
||||||
(defsys _start:void []
|
(defsys main:int []
|
||||||
(def w:uint 512)
|
(def w:uint 512)
|
||||||
(def h:uint 512)
|
(def h:uint 512)
|
||||||
# (makebmp w h)
|
(makebmp w h)
|
||||||
(def size:uint (+ 56 (* w h 4)))
|
(return 0))
|
||||||
(def mem:p32 (brk size))
|
|
||||||
(store mem (the uint 0x4d424d42))
|
|
||||||
(write 1 mem 4)
|
|
||||||
#(write 1 (cast "hello, world!\n") 14)
|
|
||||||
(exit 0)
|
|
||||||
(return))
|
|
||||||
|
|
||||||
####
|
####
|
||||||
|
|
||||||
(dumpx64)
|
#(dumpx64)
|
||||||
|
|
||||||
|
(print "#include <unistd.h>")
|
||||||
|
(dumpc)
|
||||||
|
@ -153,6 +153,17 @@
|
|||||||
(array/push into ~(pointer-add ,slot ,base-slot ,offset-slot))
|
(array/push into ~(pointer-add ,slot ,base-slot ,offset-slot))
|
||||||
slot)
|
slot)
|
||||||
|
|
||||||
|
'pointer-sub
|
||||||
|
(do
|
||||||
|
(assert (= 2 (length args)))
|
||||||
|
(def [base offset] args)
|
||||||
|
(def base-slot (visit1 base into false type-hint))
|
||||||
|
(def offset-slot (visit1 offset into false 'int))
|
||||||
|
(def slot (get-slot))
|
||||||
|
(when type-hint (array/push into ~(bind ,slot ,type-hint)))
|
||||||
|
(array/push into ~(pointer-subtract ,slot ,base-slot ,offset-slot))
|
||||||
|
slot)
|
||||||
|
|
||||||
# Type hinting
|
# Type hinting
|
||||||
'the
|
'the
|
||||||
(do
|
(do
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
valgrind build/janet examples/sysir/drawing.janet > temp.nasm
|
valgrind build/janet examples/sysir/drawing.janet > temp.c
|
||||||
nasm -felf64 temp.nasm -l temp.lst -o temp.o
|
cc temp.c
|
||||||
ld -o temp.bin -dynamic-linker /lib64/ld-linux-x86-64.so.2 -lc temp.o
|
./a.out > temp.bmp
|
||||||
valgrind ./temp.bin
|
feh temp.bmp
|
||||||
|
@ -682,7 +682,6 @@ static void sysemit_sysv_call(JanetSysx64Context *ctx, JanetSysInstruction instr
|
|||||||
janet_formatb(buffer, "call ");
|
janet_formatb(buffer, "call ");
|
||||||
sysemit_operand(ctx, instruction.call.callee, "\n");
|
sysemit_operand(ctx, instruction.call.callee, "\n");
|
||||||
}
|
}
|
||||||
if (instruction.call.flags & JANET_SYS_CALLFLAG_HAS_DEST) sysemit_movreg(ctx, RAX, instruction.call.dest);
|
|
||||||
if (save_r11) sysemit_popreg(ctx, 11);
|
if (save_r11) sysemit_popreg(ctx, 11);
|
||||||
if (save_r10) sysemit_popreg(ctx, 10);
|
if (save_r10) sysemit_popreg(ctx, 10);
|
||||||
if (save_r9) sysemit_popreg(ctx, 9);
|
if (save_r9) sysemit_popreg(ctx, 9);
|
||||||
@ -691,6 +690,7 @@ static void sysemit_sysv_call(JanetSysx64Context *ctx, JanetSysInstruction instr
|
|||||||
if (save_rdx) sysemit_popreg(ctx, RDX);
|
if (save_rdx) sysemit_popreg(ctx, RDX);
|
||||||
if (save_rsi) sysemit_popreg(ctx, RSI);
|
if (save_rsi) sysemit_popreg(ctx, RSI);
|
||||||
if (save_rdi) sysemit_popreg(ctx, RDI);
|
if (save_rdi) sysemit_popreg(ctx, RDI);
|
||||||
|
if (instruction.call.flags & JANET_SYS_CALLFLAG_HAS_DEST) sysemit_movfromreg(ctx, instruction.call.dest, RAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sysemit_win64_call(JanetSysx64Context *ctx, JanetSysInstruction instruction, uint32_t *args, uint32_t argcount) {
|
static void sysemit_win64_call(JanetSysx64Context *ctx, JanetSysInstruction instruction, uint32_t *args, uint32_t argcount) {
|
||||||
@ -726,13 +726,13 @@ static void sysemit_win64_call(JanetSysx64Context *ctx, JanetSysInstruction inst
|
|||||||
if (argcount > 4) {
|
if (argcount > 4) {
|
||||||
janet_formatb(buffer, "add rsp, %u\n", 8 * (argcount - 4));
|
janet_formatb(buffer, "add rsp, %u\n", 8 * (argcount - 4));
|
||||||
}
|
}
|
||||||
if (instruction.call.flags & JANET_SYS_CALLFLAG_HAS_DEST) sysemit_movreg(ctx, RAX, instruction.call.dest);
|
|
||||||
if (save_r11) sysemit_popreg(ctx, 11);
|
if (save_r11) sysemit_popreg(ctx, 11);
|
||||||
if (save_r10) sysemit_popreg(ctx, 10);
|
if (save_r10) sysemit_popreg(ctx, 10);
|
||||||
if (save_r9) sysemit_popreg(ctx, 9);
|
if (save_r9) sysemit_popreg(ctx, 9);
|
||||||
if (save_r8) sysemit_popreg(ctx, 8);
|
if (save_r8) sysemit_popreg(ctx, 8);
|
||||||
if (save_rdx) sysemit_popreg(ctx, RDX);
|
if (save_rdx) sysemit_popreg(ctx, RDX);
|
||||||
if (save_rcx) sysemit_popreg(ctx, RCX);
|
if (save_rcx) sysemit_popreg(ctx, RCX);
|
||||||
|
if (instruction.call.flags & JANET_SYS_CALLFLAG_HAS_DEST) sysemit_movfromreg(ctx, instruction.call.dest, RAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
void janet_sys_ir_lower_to_x64(JanetSysIRLinkage *linkage, JanetSysTarget target, JanetBuffer *buffer) {
|
void janet_sys_ir_lower_to_x64(JanetSysIRLinkage *linkage, JanetSysTarget target, JanetBuffer *buffer) {
|
||||||
|
Loading…
Reference in New Issue
Block a user