aboutsummaryrefslogtreecommitdiff
path: root/elymas
diff options
context:
space:
mode:
authorDrahflow <drahflow@gmx.de>2016-01-07 15:00:28 +0100
committerDrahflow <drahflow@gmx.de>2016-01-07 15:00:28 +0100
commit58573fc342f5e4574bf67146b0656973f452bf13 (patch)
treedfdb1c282b815e453dc4d42ae4dd2e63adbb0a84 /elymas
parent88d9a0aba7f998522510a2514b20c2bcfd5411d0 (diff)
Assembler routines for some common operations
Diffstat (limited to 'elymas')
-rw-r--r--elymas/lib/sys/asmroutines.ey60
-rw-r--r--elymas/loaded.ey1
-rw-r--r--elymas/shared.ey1
3 files changed, 62 insertions, 0 deletions
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