aboutsummaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
authorDrahflow <drahflow@gmx.de>2013-10-04 12:50:41 +0200
committerDrahflow <drahflow@gmx.de>2013-10-04 12:50:41 +0200
commitef3ff192922d1b3a51ee85de64c210f0e8101271 (patch)
treead71ab2ac9c6c68cc3fad9016450b3785367ce23 /compiler
parentbb5a9deb5f17b0e4cc89c8577b745a44ae5b1bdd (diff)
"Hello World" via libc6
Diffstat (limited to 'compiler')
-rw-r--r--compiler/elymasGlobalSysAsm.ey191
-rw-r--r--compiler/elymasGlobalSysOpt.ey125
2 files changed, 191 insertions, 125 deletions
diff --git a/compiler/elymasGlobalSysAsm.ey b/compiler/elymasGlobalSysAsm.ey
index eb4527e..f233a7b 100644
--- a/compiler/elymasGlobalSysAsm.ey
+++ b/compiler/elymasGlobalSysAsm.ey
@@ -231,6 +231,197 @@
:retn
]] /eyrawCodeAddress defv
+ # replace code block by other 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
+ /r15 :popqMem # new references source
+ 8 /r15 :popqMemDisp8 # new opcode 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
+ /rax ::unboxInteger
+ :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
+
+ # TODO old references still around (and possibly used by later code)
+
+ 24 /r15 :pushqMemDisp8
+ 32 /r15 :addqImm8Reg
+ :retn
+ ]] /eyreplace defv
+
+ # create unscoped, untyped function from opcode array
+ # 0 -> new opcodes as integer array
+ # 1 -> new references as array
+ [[
+ 24 /r15 :subqImm8Reg
+ 16 /r15 :popqMemDisp8 # store return address
+ /r15 :popqMem # new references source
+ 8 /r15 :popqMemDisp8 # new opcode 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
+ /rax ::unboxInteger
+ :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
+
+ # create function object
+ /rax /rdi :movqRegReg
+ /rsi /rsi :xorqRegReg # non-capturing
+ /rdx /rdx :xorqRegReg # untyped
+ ::internalAllocateFunction /rax :movqImmReg
+ /rax :callqReg
+
+ # rax == function object on heap
+ /rax :pushqReg
+
+ 16 /r15 :pushqMemDisp8
+ 24 /r15 :addqImm8Reg
+ :retn
+ ]] /eycreateFunction defv
+
+ # returns internalAllocateInteger into userspace
+ # 0 <- ::internalAllocateInteger as integer
+ [[
+ /rbx :popqReg
+
+ ::internalAllocateInteger /rax :movqImmReg
+ /rax :callqReg
+ /rax :pushqReg
+
+ ::internalAllocateInteger /rdx :movqImmReg
+ /rdx 8 /rax :movqRegMemDisp8
+
+ /rbx :pushqReg
+ :retn
+ ]] /eyinternalAllocateInteger 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
# (template) program boot sequence after freeze
[[
/rsp :movqImmOOBReg %EE %EE %EE %EE %EE %EE %EE %EE # 10
diff --git a/compiler/elymasGlobalSysOpt.ey b/compiler/elymasGlobalSysOpt.ey
index 49d9282..17db6ba 100644
--- a/compiler/elymasGlobalSysOpt.ey
+++ b/compiler/elymasGlobalSysOpt.ey
@@ -10,131 +10,6 @@
[[
: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
- /rax ::unboxInteger
- :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
-
- # TODO old references still around (and possibly used by later code)
-
- 24 /r15 :pushqMemDisp8
- 32 /r15 :addqImm8Reg
- :retn
- ]] /eyreplace defv
-
- # returns internalAllocateInteger into userspace
- # 0 <- ::internalAllocateInteger as integer
- [[
- /rbx :popqReg
-
- ::internalAllocateInteger /rax :movqImmReg
- /rax :callqReg
- /rax :pushqReg
-
- ::internalAllocateInteger /rdx :movqImmReg
- /rdx 8 /rax :movqRegMemDisp8
-
- /rbx :pushqReg
- :retn
- ]] /eyinternalAllocateInteger 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
[