aboutsummaryrefslogtreecommitdiff
path: root/elymas/lib/sys/asmroutines.ey
blob: 3be080de1aa64599300fd07e867e17292d64c486 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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