aboutsummaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
Diffstat (limited to 'compiler')
-rw-r--r--compiler/elymasAsm.ey9
-rw-r--r--compiler/elymasGlobal.ey78
2 files changed, 65 insertions, 22 deletions
diff --git a/compiler/elymasAsm.ey b/compiler/elymasAsm.ey
index 54f6c7a..5d28e96 100644
--- a/compiler/elymasAsm.ey
+++ b/compiler/elymasAsm.ey
@@ -584,6 +584,15 @@
disp imm8
} /movbMemDisp8Reg deff
+ { ==mem ==reg
+ reg bit8assert
+ mem bit64assert
+
+ reg regno %07 gt mem regno %07 gt or { 0 reg /none mem rex } rep
+ %88
+ reg mem modrm00
+ } /movbRegMem deff
+
{ ==mem ==i
mem bit64assert
i 65536 lt assert
diff --git a/compiler/elymasGlobal.ey b/compiler/elymasGlobal.ey
index a5e58c7..d9c8524 100644
--- a/compiler/elymasGlobal.ey
+++ b/compiler/elymasGlobal.ey
@@ -1576,6 +1576,27 @@
::unscopingFunctionHeader ::unscopingFunctionFooter -102* /ey}' defv
> _ ==globalMacros { defv }' ::allocateOffsetStruct
+ { =*resolve ==createScopeEntry
+ { ==name
+ # create function
+ name resolve 8 sub /rdi :movqImmReg # adjust for expected (but non-existent) code block header size
+ /rsi /rsi :xorqRegReg # library functions don't have a captured scope
+ # TODO: put a type here where applicable
+ /rdx /rdx :xorqRegReg
+
+ ::internalAllocateFunction /rax :movqImmReg
+ /rax :callqReg
+ /rax :pushqReg
+
+ # create string
+ name "ey(.*)" regex assert ::constStringCode _ len dearray
+
+ # enter into current (i.e. global) scope
+ createScopeEntry /rax :movqImmReg
+ /rax :callqReg
+ } each
+ } /createScopeEntries deff
+
[
globalFunctions keys len
globalFunctions2 keys len add
@@ -1589,31 +1610,44 @@
::currentScope /rdi :movqImmReg
/rax /rdi :movqRegMem
- { ==createScopeEntry
- { ==name
- # create function
- name | 8 sub /rdi :movqImmReg
- /rsi /rsi :xorqRegReg # library functions don't have a captured scope
- # TODO: put a type here where applicable
- /rdx /rdx :xorqRegReg
+ globalFunctions keys eydeff { | }' createScopeEntries
+ globalFunctions2 keys eydeff { | }' createScopeEntries
+ globalFunctions3 keys eydeff { | }' createScopeEntries
+ globalMacros keys eydefq { | }' createScopeEntries
+ ] :execute
- ::internalAllocateFunction /rax :movqImmReg
- /rax :callqReg
- /rax :pushqReg
+ { ==name
+ [[
+ INITIALSCOPESIZE /rdi :movqImmReg
+ ::currentScope /rsi :movqImmReg
+ 8 /r15 :subqImm8Reg
+ /rsi /rsi :movqMemReg
+ /rsi /r15 :movqRegMem # save scope
+ ::internalAllocateScope /rax :movqImmReg
+ /rax :callqReg
+ /rax :pushqReg
- # create string
- name "ey(.*)" regex assert ::constStringCode _ len dearray
+ /rax :pushqReg
+ /rax :movqImmOOBReg name ::string
+ /rax :pushqReg
+ |eydefv /rax :movqImmReg
+ /rax :callqReg
- # enter into current (i.e. global) scope
- createScopeEntry /rax :movqImmReg
- /rax :callqReg
- } each
- } /createScopeEntries deff
- globalFunctions keys eydeff createScopeEntries
- globalFunctions2 keys eydeff createScopeEntries
- globalFunctions3 keys eydeff createScopeEntries
- globalMacros keys eydefq createScopeEntries
- ] :execute
+ ::currentScope /rsi :movqImmReg
+ /rsi :popqMem
+ ]] :execute
+ } /enterSubScope deff
+
+ {
+ [[
+ ::currentScope /rsi :movqImmReg
+ /r15 /rax :movqMemReg
+ 8 /r15 :addqImm8Reg
+ /rax /rsi :movqRegMem
+ ]] :execute
+ } /leaveSubScope deff
+
+ "elymasGlobalSys.ey" include
> /global defv
# vim: syn=elymas