aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compiler/elymasGlobalStr.ey6
-rw-r--r--elymas/lib/sys/asmroutines.ey60
-rw-r--r--elymas/loaded.ey1
-rw-r--r--elymas/shared.ey1
4 files changed, 65 insertions, 3 deletions
diff --git a/compiler/elymasGlobalStr.ey b/compiler/elymasGlobalStr.ey
index be0b65d..4e9861a 100644
--- a/compiler/elymasGlobalStr.ey
+++ b/compiler/elymasGlobalStr.ey
@@ -411,7 +411,7 @@
]] /eybitTest defv
# bit set
- # 0 -> string to extract bit from
+ # 0 -> string to set bit in
# 1 -> bit index to set
[[
/rbx :popqReg
@@ -427,8 +427,8 @@
]] /eybitSet defv
# bit reset
- # 0 -> string to extract bit from
- # 1 -> bit index to set
+ # 0 -> string to reset bit in
+ # 1 -> bit index to reset
[[
/rbx :popqReg
diff --git a/elymas/lib/sys/asmroutines.ey b/elymas/lib/sys/asmroutines.ey
new file mode 100644
index 0000000..3be080d
--- /dev/null
+++ b/elymas/lib/sys/asmroutines.ey
@@ -0,0 +1,60 @@
+# assembly-optimized routines for various use cases
+
+<
+ sys .asm "::" via
+ sys .asm .ops ":" via
+ sys .asm .ops .|label "@" deff
+ sys .asm .|peek =*:peek
+ sys .asm .|poke =*:poke
+
+ { :labelRecord [ } "[[" deff
+ { ] :labelResolve } "]]" deff
+
+
+ # concatenate an array full of strings into one, i.e. { |cat fold }"
+ # 0 -> array of strings
+ # 0 <- string obtained by concatenating all string from the array
+ [[
+ /rbx :popqReg
+
+ # sum individual lengths
+ 0 /rsp /rax :movqMemDisp8Reg
+ /rax /esi :movlMemReg
+ /rax /rsi :addqRegReg
+
+ /rdi /rdi :xorqRegReg
+ 8 /rsi :subqImm8Reg
+ @countLoop
+ /rsi /rdx :movqMemReg
+ 16 /rdx /rdi :addqMemDisp8Reg
+ 8 /rsi :subqImm8Reg
+ /rsi /rax :cmpqRegReg
+ /countLoop :jnzLbl8
+
+ ::internalAllocateString /rax :movqImmReg
+ /rax :callqReg
+
+ /rdx :popqReg # pop source array
+ /rax :pushqReg # push target string
+
+ 24 /rax /rdi :leaqMemDisp8Reg
+ /rdx /eax :movlMemReg
+ /rdx /rax :addqRegReg
+
+ 8 /rdx :addqImm8Reg
+ @copyLoop
+ /rdx /rsi :movqMemReg
+ 16 /rsi /rcx :movqMemDisp8Reg
+ 24 /rsi :addqImm8Reg
+ :reprcx :movsb
+
+ 8 /rdx :addqImm8Reg
+ /rdx /rax :cmpqRegReg
+ /copyLoop :jnzLbl8
+
+ /rbx :pushqReg
+ :retn
+ ]] [ ] ::createFunction /catstrarray deffd
+> /asmroutines sys .defv
+
+# vim: syn=elymas
diff --git a/elymas/loaded.ey b/elymas/loaded.ey
index 0e8ef86..f4b07e4 100644
--- a/elymas/loaded.ey
+++ b/elymas/loaded.ey
@@ -4,6 +4,7 @@
"lib/util.ey"
"lib/err.ey"
"lib/bin.ey"
+ "lib/sys/asmroutines.ey"
sys .?linux { "lib/sys/linux.ey" } rep
sys .?linux { # FIXME: port these to other architectures one day
"lib/sys.ey"
diff --git a/elymas/shared.ey b/elymas/shared.ey
index ab65273..c7bf1b9 100644
--- a/elymas/shared.ey
+++ b/elymas/shared.ey
@@ -4,6 +4,7 @@
"lib/util.ey"
"lib/err.ey"
"lib/bin.ey"
+ "lib/sys/asmroutines.ey"
sys .?linux { "lib/sys/linux.ey" } rep
"lib/sys/so.ey"
sys .?linux { # FIXME: port these to other architectures one day