aboutsummaryrefslogtreecommitdiff
path: root/elymas/lib
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/lib
parent88d9a0aba7f998522510a2514b20c2bcfd5411d0 (diff)
Assembler routines for some common operations
Diffstat (limited to 'elymas/lib')
-rw-r--r--elymas/lib/sys/asmroutines.ey60
1 files changed, 60 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