diff options
| -rw-r--r-- | compiler/elymasGlobalStr.ey | 6 | ||||
| -rw-r--r-- | elymas/lib/sys/asmroutines.ey | 60 | ||||
| -rw-r--r-- | elymas/loaded.ey | 1 | ||||
| -rw-r--r-- | elymas/shared.ey | 1 |
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 |
