diff options
| author | Drahflow <drahflow@gmx.de> | 2016-01-07 15:00:28 +0100 |
|---|---|---|
| committer | Drahflow <drahflow@gmx.de> | 2016-01-07 15:00:28 +0100 |
| commit | 58573fc342f5e4574bf67146b0656973f452bf13 (patch) | |
| tree | dfdb1c282b815e453dc4d42ae4dd2e63adbb0a84 /elymas | |
| parent | 88d9a0aba7f998522510a2514b20c2bcfd5411d0 (diff) | |
Assembler routines for some common operations
Diffstat (limited to 'elymas')
| -rw-r--r-- | elymas/lib/sys/asmroutines.ey | 60 | ||||
| -rw-r--r-- | elymas/loaded.ey | 1 | ||||
| -rw-r--r-- | elymas/shared.ey | 1 |
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 |
