aboutsummaryrefslogtreecommitdiff
path: root/compiler/elymasGlobalSysDyn.ey
blob: 0f1c542b00ce8e07769dbe33ed453fed06f23136 (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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# dynamic variables with stack
<
  "dyn" enterSubScope

  5 ==DYNAMICVARIABLEMARKER

  <
    # get dynamic variable value
    # 0 -> dynamic variable object
    # 0 <- non-zero if a value is defined, zero otherwise
    # 1 <- current value (if it exists)
    [[
      /rbx :popqReg

      /rdx :popqReg
      DYNAMICVARIABLEMARKER /rax :movqImmReg
      :STACKBOTTOMMARKER /rcx :movqImmReg
      /r15 /rsi :movqRegReg
      8 /rsi :subqImm8Reg

      @scanStack
      8 /rsi :addqImm8Reg

      /rsi /rax :cmpqMemReg
      /dynamicVariableMarker :jzLbl8
      /rsi /rcx :cmpqMemReg
      /scanStack :jnzLbl8

      # no value was found
      /rax /rax :xorqRegReg
      63 /rax :btsqImm8Reg
      /rax :pushqReg

      /rbx :pushqReg
      :retn

      @dynamicVariableMarker
      8 /rsi /rdx :cmpqMemDisp8Reg
      /scanStack :jnzLbl8 # wrong variable

      16 /rsi :pushqMemDisp8
      /rax /rax :xorqRegReg
      /rax :incqReg
      63 /rax :btsqImm8Reg
      /rax :pushqReg

      /rbx :pushqReg
      :retn
    ]] /eyget defv

    # set dynamic variable and execute function
    # 0 -> dynamic variable object
    # 1 -> value to set
    # 2 -> object to execute
    [[
      8 /r15 :subqImm8Reg
      /r15 :popqMem

      24 /r15 :subqImm8Reg
      8 /r15 :popqMemDisp8
      16 /r15 :popqMemDisp8
      DYNAMICVARIABLEMARKER /rax :movqImmReg
      /rax /r15 :movqRegMem

      |ey* /rax :movqImmReg
      /rax :callqReg

      24 /r15 :addqImm8Reg
      /r15 :pushqMem
      8 /r15 :addqImm8Reg
      :retn
    ]] /eywith defv
  > _ ==globalFunctions { defv }' ::allocateOffsetStruct

  [
    globalFunctions keys eydeff { | }' createScopeEntries
    createScopeExtensionEntries
  ] :execute

  leaveSubScope
> --

# vim: syn=elymas