aboutsummaryrefslogtreecommitdiff
path: root/compiler/elymasGlobalSysOpt.ey
diff options
context:
space:
mode:
authorDrahflow <drahflow@gmx.de>2013-09-20 14:51:02 +0200
committerDrahflow <drahflow@gmx.de>2013-09-20 14:51:02 +0200
commiteea02bbc59f4f0ece2756cdc846d351238d2b6a7 (patch)
treec849207f9373bbbc47abb40ed8fc7b6708b1e48e /compiler/elymasGlobalSysOpt.ey
parentcb5d3e47e54a188ecbb5385f80b0bdadf9297b33 (diff)
Client-side optimizer
Diffstat (limited to 'compiler/elymasGlobalSysOpt.ey')
-rw-r--r--compiler/elymasGlobalSysOpt.ey144
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