diff options
| author | Drahflow <drahflow@gmx.de> | 2013-09-20 14:51:02 +0200 |
|---|---|---|
| committer | Drahflow <drahflow@gmx.de> | 2013-09-20 14:51:02 +0200 |
| commit | eea02bbc59f4f0ece2756cdc846d351238d2b6a7 (patch) | |
| tree | c849207f9373bbbc47abb40ed8fc7b6708b1e48e /compiler/elymasGlobalSysOpt.ey | |
| parent | cb5d3e47e54a188ecbb5385f80b0bdadf9297b33 (diff) | |
Client-side optimizer
Diffstat (limited to 'compiler/elymasGlobalSysOpt.ey')
| -rw-r--r-- | compiler/elymasGlobalSysOpt.ey | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/compiler/elymasGlobalSysOpt.ey b/compiler/elymasGlobalSysOpt.ey new file mode 100644 index 0000000..01fb1c0 --- /dev/null +++ b/compiler/elymasGlobalSysOpt.ey @@ -0,0 +1,144 @@ +< + "opt" enterSubScope + + < + # stub + # 0 -> code object + # 0 <- same code object (if different object, optimization would have taken place) + [[ + :retn + ]] /eyhook defv + + # replace code block by better code + # 0 -> code block to replate (and patch) + # 1 -> new opcodes as integer array + # 2 -> new references as array + [[ + 32 /r15 :subqImm8Reg + 24 /r15 :popqMemDisp8 # store return address + 16 /r15 :popqMemDisp8 # code block to patch + 8 /r15 :popqMemDisp8 # new opcode source + /r15 :popqMem # new references source + + # copy new opcodes + :quoteEncodingBufferCode /rdi :movqImmReg + + 8 /r15 /rsi :movqMemDisp8Reg + /rsi /ecx :movlMemReg + 8 /rsi :addqImm8Reg + 3 /rcx :shrqImm8Reg + /rcx :decqReg + /noOpcodesToCopy :jzLbl8 + + @opcodeCopyLoop + /rsi /rax :movqMemReg + 8 /rax /rax :movqMemDisp8Reg + :stosb + 8 /rsi :addqImm8Reg + /opcodeCopyLoop :loopLbl8 + + @noOpcodesToCopy + /rdi /rbp :movqRegReg + + # copy new references + :quoteEncodingBufferObjects /rdi :movqImmReg + + /r15 /rsi :movqMemReg + /rsi /ecx :movlMemReg + 8 /rsi :addqImm8Reg + 3 /rcx :shrqImm8Reg + /rcx :decqReg + /noReferencesToCopy :jzLbl8 + + @referencesCopyLoop + /rsi /rax :movqMemReg + 8 /rax /rax :movqMemDisp8Reg + :stosq + 8 /rsi :addqImm8Reg + /referencesCopyLoop :loopLbl8 + + @noReferencesToCopy + /rbp /rdi :xchgqRegReg + + ::internalAllocateCodeFromEncodingBuffer /rax :movqImmReg + /rax :callqReg + + # patch old code + 16 /r15 /rdi :movqMemDisp8Reg + 8 /rdi /rbp :movqMemDisp8Reg + 16 1 /rbp /rdi /rbp :leaqMemIndexScaleDisp8Reg + + # CHECK + /rdi /ecx :movlMemReg + /rdi /rcx :addqRegReg + /rcx /rbp :cmpqRegReg + /patchSpaceAvailable :jbLbl8 + + "attepmting to patch reference, but no space is available" ::outputError + :ud2 + + @patchSpaceAvailable + # END CHECK + + 16 /rdi :addqImm8Reg + + [ + /rax :movqImmOOBReg + ] ::loadToRdi + 16 /rax :addqImm8Reg + /rax /rdi :movqRegMem + 16 /rax :subqImm8Reg + /rax 0 /rbp :movqRegMemDisp8 + 8 /rdi :addqImm8Reg + 8 /rbp :addqImm8Reg + [ + /rax :jmpqReg + ] ::loadToRdi + + 24 /r15 :pushqMemDisp8 + 32 /r15 :addqImm8Reg + :retn + ]] /eyreplace defv + + # returns currentScope into userspace + # 0 <- ::currentScope as integer + [[ + /rbx :popqReg + + ::internalAllocateInteger /rax :movqImmReg + /rax :callqReg + /rax :pushqReg + + ::currentScope /rdx :movqImmReg + /rdx 8 /rax :movqRegMemDisp8 + + /rbx :pushqReg + :retn + ]] /eycurrentScope defv + + # returns internalAllocateScope into userspace + # 0 <- ::internalAllocateScope as integer + [[ + /rbx :popqReg + + ::internalAllocateInteger /rax :movqImmReg + /rax :callqReg + /rax :pushqReg + + ::internalAllocateScope /rdx :movqImmReg + /rdx 8 /rax :movqRegMemDisp8 + + /rbx :pushqReg + :retn + ]] /eyinternalAllocateScope defv + > _ ==globalFunctions { defv }' ::allocateOffsetStruct + + [ + globalFunctions keys eydeff { | }' createScopeEntries + createScopeExtensionEntries + ] :execute + + leaveSubScope +> -- + +# vim: syn=elymas |
