aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDrahflow <drahflow@gmx.de>2013-01-10 17:58:06 +0100
committerDrahflow <drahflow@gmx.de>2013-01-10 17:58:06 +0100
commit492a35eab4c1c09f5fb9b207e3e36bfa96109236 (patch)
tree6abada449ef2c12f2a4c3a998df185a483c17232
parente9feb80dc1c5384cefd6c291827fa328d7acb750 (diff)
First two ints added
-rw-r--r--compiler/elymasAsm.ey45
-rw-r--r--compiler/elymasAsmLib.ey68
-rw-r--r--notes2
3 files changed, 88 insertions, 27 deletions
diff --git a/compiler/elymasAsm.ey b/compiler/elymasAsm.ey
index ef931e6..d3ad34b 100644
--- a/compiler/elymasAsm.ey
+++ b/compiler/elymasAsm.ey
@@ -379,11 +379,23 @@
i imm8
} /orbImmMemDisp8 deff
+ { ==mem
+ mem regno %07 gt { 1 /none /none mem rex } rep
+ %8F
+ /zero mem modrm00
+ } /popqMem deff
+
{ ==reg
reg regno %07 gt { 1 /none /none reg rex } rep
%58 reg regno %07 band add
} /popqReg deff
+ { ==mem
+ mem regno %07 gt { 1 /none /none mem rex } rep
+ %FF
+ /six mem modrm00
+ } /pushqMem deff
+
{ ==reg
reg regno %07 gt { 1 /none /none reg rex } rep
%50 reg regno %07 band add
@@ -535,13 +547,18 @@
# 0 - STACKSTART : global variables
# %0 : current stack pointer
# STACKSTART - ...: real stack
- STACKSIZE sys .asm .alloc ==mainStack
- <
- mainStack .base ==i
- [
- mainStack .base STACKSIZE add imm64
- ] { i sys .asm .poke i 1 add =i } each
- > --
+ [ /mainStack /mainCallStack ] {
+ <
+ STACKSIZE sys .asm .alloc ==stack
+
+ stack .base ==i
+ [
+ stack .base STACKSIZE add imm64
+ ] { i sys .asm .poke i 1 add =i } each
+
+ stack
+ > -12 ==
+ }' each
{ ==opcodes
opcodes len 1 sub PAGESIZE div 1 add PAGESIZE mul sys .asm .alloc /codearea defv
@@ -551,14 +568,20 @@
} /arrayToCode deff
# take an array of instruction bytes and execute it on the given stack
- { ==stack ==opcodes
+ { ==callStack ==valueStack ==opcodes
[
/rbx pushqReg
- stack /rbx movqImmReg
+ /r15 pushqReg
+ valueStack /rbx movqImmReg
/rsp /rbx xchgqRegMem
+ callStack /rbx movqImmReg
+ /r15 /rbx xchgqRegMem
] opcodes [
- stack /rbx movqImmReg
+ callStack /rbx movqImmReg
+ /r15 /rbx xchgqRegMem
+ valueStack /rbx movqImmReg
/rsp /rbx xchgqRegMem
+ /r15 popqReg
/rbx popqReg
retn
] cat cat =opcodes
@@ -567,7 +590,7 @@
.free
} /executeOn deff
- { mainStack .base executeOn } /execute deff
+ { mainStack .base mainCallStack .base executeOn } /execute deff
> /assembler defv
# vim: syn=elymas
diff --git a/compiler/elymasAsmLib.ey b/compiler/elymasAsmLib.ey
index 2a4c56c..9cea01e 100644
--- a/compiler/elymasAsmLib.ey
+++ b/compiler/elymasAsmLib.ey
@@ -23,7 +23,6 @@
struct keys { address -101 def struct -01 . len address add =address } each
} /allocateOffsetStruct deff
- # global data
<
# current end of heap memory (grows upwards)
[ %00 %00 %00 %00 %00 %60 %00 %00 ] ==heapEnd
@@ -247,26 +246,29 @@
# 1 -> integer
# 0 <- sum of the above
[
- /rcx :popqReg
- /rax :popqReg
- 8 /rax /rax :movqMemDisp8Reg
/rbx :popqReg
- 8 /rbx /rbx :movqMemDisp8Reg
- /rax /rbx :addqRegReg
- # allocate int
+ # allocate result int
16 /rdi :movqImmReg
internalAllocate /rax :movqImmReg
/rax :callqReg
- # push int address on program stack
- /rax :pushqReg
-
# type zero does not need to be changed
- # load value
- /rbx 8 /rax :movqRegMemDisp8
- /rcx :pushqReg
+ # actual calculation
+ /rcx :popqReg
+ 8 /rcx /rcx :movqMemDisp8Reg
+
+ /rdx :popqReg
+ 8 /rdx /rdx :movqMemDisp8Reg
+
+ /rcx /rdx :addqRegReg
+ /rdx 8 /rax :movqRegMemDisp8
+
+ # push int address on program stack
+ /rax :pushqReg
+ /rbx :pushqReg
+ :retn
] /eyadd defv
# create a new entry in the current scope for the given name
@@ -366,8 +368,43 @@
# execute top stack element
[
- :retn # FIXME: implement this
- ] /ey* defv
+ 8 /r15 :subqImm8Reg
+ /r15 :popqMem
+
+ /rdx :popqReg
+
+ # enter scope
+ 8 /rdx /rcx :movqMemDisp8Reg
+ /rcx /rcx :testqRegReg
+ /scoped :jnzLbl8
+ currentScope /rax :movqImmReg
+ /rax /rcx :movqMemReg
+ /scoped :label
+ 8 /r15 :subqImm8Reg
+ /rcx /r15 :movqRegMem
+
+ # handle typed function
+ 16 /rdx /rcx :movqMemDisp8Reg
+ /rcx /rcx :testqRegReg
+ /typed :jnzLbl8
+
+ 24 /rdx /rax :movqMemDisp8Reg
+ 8 /rax :addqImm8Reg
+ /rax :callqReg
+ /done :jmpLbl8
+
+ /typed :label
+ :ud2 # TODO handle typed functions and autolooping
+
+ /done :label
+ /r15 /rcx :movqMemReg
+ currentScope /rax :movqImmReg
+ /rcx /rax :movqRegMem
+ 8 /r15 :addqImm8Reg
+ /r15 :pushqMem
+ 8 /r15 :addqImm8Reg
+ :retn
+ ] :labelResolve /ey* defv
> _ ==globalFunctions { defv }' allocateOffsetStruct
{ strToUTF8Bytes _ =*v len _ ==exactLength
@@ -419,6 +456,7 @@
# create function
name | 8 sub /rdi :movqImmReg
currentScope /rsi :movqImmReg
+ /rsi /rsi :movqMemReg
# TODO: put a type here where applicable
/rdx /rdx :xorqRegReg
diff --git a/notes b/notes
index 67ef298..8420389 100644
--- a/notes
+++ b/notes
@@ -177,7 +177,7 @@ Small set in between
* Length in bytes (including header)
bit 63-60: 0 1 0 1
bit 59: reserved for GC
-* scope pointer
+* scope pointer (0 if non-capturing function)
* type pointer (0 if untyped)
* code pointer