diff options
| author | Drahflow <drahflow@gmx.de> | 2013-01-10 17:58:06 +0100 |
|---|---|---|
| committer | Drahflow <drahflow@gmx.de> | 2013-01-10 17:58:06 +0100 |
| commit | 492a35eab4c1c09f5fb9b207e3e36bfa96109236 (patch) | |
| tree | 6abada449ef2c12f2a4c3a998df185a483c17232 | |
| parent | e9feb80dc1c5384cefd6c291827fa328d7acb750 (diff) | |
First two ints added
| -rw-r--r-- | compiler/elymasAsm.ey | 45 | ||||
| -rw-r--r-- | compiler/elymasAsmLib.ey | 68 | ||||
| -rw-r--r-- | notes | 2 |
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 @@ -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 |
