diff options
| author | Drahflow <drahflow@gmx.de> | 2013-08-09 00:23:58 +0200 |
|---|---|---|
| committer | Drahflow <drahflow@gmx.de> | 2013-08-09 00:23:58 +0200 |
| commit | e0f0e21df4600a73470323c2b35663d58c13c614 (patch) | |
| tree | 011ed2a6e3e399003a902b66b98d05477f76f105 /compiler | |
| parent | 088a3d6ce8c73d70248ea3550692ad47349980d6 (diff) | |
Optimizing scoping functions as well
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/elymasGlobal.ey | 110 |
1 files changed, 109 insertions, 1 deletions
diff --git a/compiler/elymasGlobal.ey b/compiler/elymasGlobal.ey index 633d6ab..2d09941 100644 --- a/compiler/elymasGlobal.ey +++ b/compiler/elymasGlobal.ey @@ -976,6 +976,33 @@ > _ ==globalFunctions { defv }' ::allocateOffsetStruct < + # untyped scoped function jumppad + # rdi -> function code to call + # rsi -> scope to install + [[ + 8 /r15 :subqImm8Reg + /r15 :popqMem + + ::currentScope /rax :movqImmReg + /rax /rcx :movqMemReg + 8 /r15 :subqImm8Reg + /rcx /r15 :movqRegMem + /rsi /rax :movqRegMem + + /rdi :callqReg + + /r15 /rcx :movqMemReg + ::currentScope /rax :movqImmReg + /rcx /rax :movqRegMem + 8 /r15 :addqImm8Reg + + /r15 :pushqMem + 8 /r15 :addqImm8Reg + :retn + ]] /internalConstantNormalFunctionScopedUntypedJumpPad defv + > { defv }' ::allocateOffsetStruct + + < # resolve identifier without quoting considerations and act accordingly # 0 -> identifier to resolve [[ @@ -1106,6 +1133,14 @@ :ud2 @patchConstantActive + /rdx :popqReg # fetch resolved object + + 7 /rdx /cl :movbMemDisp8Reg + %F0 /cl :andbImmReg + %50 /cl :cmpbImmReg + /patchConstantNormalFunction :jeLbl8 + + @patchConstantActiveGeneral 8 /r15 /rdi :movqMemDisp8Reg 8 /rdi :addqImm8Reg @@ -1113,7 +1148,7 @@ /rbx :popqReg /rax :movqImmOOBReg ] ::loadToRdi - /rdi :popqMem + /rdx /rdi :movqRegMem 8 /rdi :addqImm8Reg [ /rax :pushqReg @@ -1130,6 +1165,79 @@ 8 /r15 :addqImm8Reg /rdi :jmpqReg # continue with freshly patched code + @patchConstantNormalFunction + 8 /rdx /rcx :movqMemDisp8Reg + /rcx /rcx :testqRegReg + /patchConstantNormalFunctionUnscoped :jzLbl32 + + # @patchConstantNormalFunctionScoped + 16 /rdx /rcx :movqMemDisp8Reg + /rcx /rcx :testqRegReg + /patchConstantNormalFunctionScopedUntyped :jzLbl32 + /patchConstantActiveGeneral :jmpLbl32 + + @patchConstantNormalFunctionScopedUntyped + 8 /r15 /rdi :movqMemDisp8Reg + 8 /rdi :addqImm8Reg + + 8 /rdx /rcx :movqMemDisp8Reg # load function scope + + 24 /rdx /rdx :movqMemDisp8Reg # load actual function code + 8 /rdx :addqImm8Reg + + [ + /rsi :movqImmOOBReg + ] ::loadToRdi + /rcx /rdi :movqRegMem + 8 /rdi :addqImm8Reg + [ + /rdi :movqImmOOBReg + ] ::loadToRdi + /rdx /rdi :movqRegMem + 8 /rdi :addqImm8Reg + [ + internalConstantNormalFunctionScopedUntypedJumpPad /rax :movqImmReg + /rax :jmpqReg + ] ::loadToRdi + + 8 /r15 /rdi :movqMemDisp8Reg + 8 /rdi :addqImm8Reg + + 16 /r15 :addqImm8Reg + /r15 :pushqMem + 8 /r15 :addqImm8Reg + /rdi :jmpqReg # continue with freshly patched code + + @patchConstantNormalFunctionUnscoped + 16 /rdx /rcx :movqMemDisp8Reg + /rcx /rcx :testqRegReg + /patchConstantNormalFunctionUnscopedUntyped :jzLbl32 + /patchConstantActiveGeneral :jmpLbl32 + + @patchConstantNormalFunctionUnscopedUntyped + 8 /r15 /rdi :movqMemDisp8Reg + 8 /rdi :addqImm8Reg + + 24 /rdx /rdx :movqMemDisp8Reg # load actual function code + 8 /rdx :addqImm8Reg + + [ + /rax :movqImmOOBReg + ] ::loadToRdi + /rdx /rdi :movqRegMem + 8 /rdi :addqImm8Reg + [ + /rax :jmpqReg + ] ::loadToRdi + + 8 /r15 /rdi :movqMemDisp8Reg + 8 /rdi :addqImm8Reg + + 16 /r15 :addqImm8Reg + /r15 :pushqMem + 8 /r15 :addqImm8Reg + /rdi :jmpqReg # continue with freshly patched code + @patchConstantPassive 8 /r15 /rdi :movqMemDisp8Reg 8 /rdi :addqImm8Reg |
