diff options
| author | Drahflow <drahflow@gmx.de> | 2015-06-19 10:53:11 +0200 |
|---|---|---|
| committer | Drahflow <drahflow@gmx.de> | 2015-06-19 10:53:11 +0200 |
| commit | 7d93ed172d7c22af7800f3dd23863f0203f7fdae (patch) | |
| tree | a38cb6db9b16ce65b898ee02ec846feb01f5b54c /compiler | |
| parent | dc029b2f218feb125b74f5fffc5bd64ec9459f03 (diff) | |
Position markers for stack subeffect isolation
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/elymasGlobal.ey | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/compiler/elymasGlobal.ey b/compiler/elymasGlobal.ey index 3fc309f..2ecf6b9 100644 --- a/compiler/elymasGlobal.ey +++ b/compiler/elymasGlobal.ey @@ -13,6 +13,7 @@ 1 ==ARRAYMARKER 2 ==QUOTEMARKER + 3 ==POSITIONMARKER < [ @@ -1084,6 +1085,89 @@ :retn ]] /eyrange defv + # put a position marker onto the stack + [[ + /rax :popqReg + POSITIONMARKER :pushqImm32 + /rax :pushqReg + :retn + ]] /ey, defv + + # delete topmost position marker and shift stack + [[ + /rbx :popqReg + /rsp /rsi :movqRegReg + POSITIONMARKER /rax :movqImmReg + /rdx :popqReg + /rax /rdx :cmpqRegReg + /done :jzLbl8 + @loop + 8 /rsi :addqImm8Reg + /rdx /rsi :xchgqRegMem + /rax /rdx :cmpqRegReg + /loop :jnzLbl8 + @done + /rbx :pushqReg + :retn + ]] /ey,-- defv + + # move topmost position marker left/upwards and shift stack + [[ + /rbx :popqReg + /rsp /rsi :movqRegReg + POSITIONMARKER /rax :movqImmReg + /rdx :popqReg + /rax /rdx :cmpqRegReg + /done :jzLbl8 + @loop + 8 /rsi :addqImm8Reg + /rdx /rsi :xchgqRegMem + /rax /rdx :cmpqRegReg + /loop :jnzLbl8 + @done + /rdx 8 /rsi :movqRegMemDisp8 + /rbx :pushqReg + :retn + ]] /ey--, defv + + # access element left (higher up in stack) of topmost position marker + [[ + /rbx :popqReg + /rsp /rdi :movqRegReg + POSITIONMARKER /rax :movqImmReg + /rcx /rcx :xorqRegReg + /rcx :decqReg + :repnz :scasq + /rdi :pushqMem + /rbx :pushqReg + :retn + ]] /ey_, defv + + # access element right (lower in stack) of topmost position marker + [[ + /rbx :popqReg + /rsp /rdi :movqRegReg + POSITIONMARKER /rax :movqImmReg + /rcx /rcx :xorqRegReg + /rcx :decqReg + :repnz :scasq + 16 neg /rdi :pushqMemDisp8 + /rbx :pushqReg + :retn + ]] /ey,_ defv + + # delete stack up to and including topmost position marker + [[ + /rbx :popqReg + POSITIONMARKER /rax :movqImmReg + @loop + /rdx :popqReg + /rax /rdx :cmpqRegReg + /loop :jnzLbl8 + /rbx :pushqReg + :retn + ]] /ey,--- defv + # create a new scope capturing the current one [ ::INITIALSCOPESIZE /rdi :movqImmReg |
