aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDrahflow <drahflow@gmx.de>2015-06-22 13:26:49 +0200
committerDrahflow <drahflow@gmx.de>2015-06-22 13:26:49 +0200
commitc928ded416dd1cd5ef01df1e5768c07868000e86 (patch)
tree721204394f46f6b2f11f2830a85ab2359c18079e
parent483c65f6132fb81113227c67da79bf5fe66166ec (diff)
Finally rewrite extension area access to constant scope size
... also fixes a nasty bug when STATICWRITE from PUSH in rewriteIntegerTrace
-rw-r--r--compiler/elymasAsmLib.ey4
-rw-r--r--compiler/elymasGlobal.ey7
-rw-r--r--compiler/elymasGlobalSys.ey2
-rw-r--r--elymas/lib/sys/opt.ey62
4 files changed, 26 insertions, 49 deletions
diff --git a/compiler/elymasAsmLib.ey b/compiler/elymasAsmLib.ey
index 4d51ce5..a8f0987 100644
--- a/compiler/elymasAsmLib.ey
+++ b/compiler/elymasAsmLib.ey
@@ -1398,7 +1398,7 @@
# rdi <- number of parent pointers followed
# rsi <- entry index * 8 within scope
# rbp <- 0 if within scope data area
- # 1 if within extension area
+ # scope object length if within extension area
[[
/rax /rax :xorqRegReg
/rax :pushqReg
@@ -1529,11 +1529,11 @@
/ecx /rdi :cmplRegMem # TODO this fails for > 4 GB scopes
/inDataArea :jaLbl8
+ /rdi /ebp :movlMemReg # load scope length
/rdi /ecx :sublMemReg # substract scope length
24 /rdi /rdi :movqMemDisp8Reg # load extension area pointer
/rdi /rdi :testqRegReg
/outsideExtensionArea :jzLbl8
- /rbp :incqReg
8 /rcx :addqImm8Reg # add extension area header length
@inDataArea
diff --git a/compiler/elymasGlobal.ey b/compiler/elymasGlobal.ey
index 77fcb0e..cfa58cf 100644
--- a/compiler/elymasGlobal.ey
+++ b/compiler/elymasGlobal.ey
@@ -1623,7 +1623,7 @@
/patchStaticFollowParents :loopLbl8
@patchStaticNoFollowParents
- %01 /bpl :testbImmReg
+ /rbp /rbp :testqRegReg
/patchStaticLoadFromExtensionArea :jnzLbl8
# @patchStaticLoadFromScope
@@ -1639,11 +1639,10 @@
40 /rsi :addqImm8Reg # now: rsi == offset of entry in extension area + scope length
[
24 /rax /rcx :movqMemDisp8Reg # load extension area pointer
- /rax /edx :movlMemReg # load scope length
- /rdx :negqReg # prepare for substraction
/rbx :popqReg
- %EE 1 /rdx /rcx /rax :movqMemIndexScaleDisp32Reg # load entry
+ %EE /rcx /rax :movqMemDisp32Reg # load entry
] ::loadToRdi
+ /rbp /rsi :subqRegReg # substract scope object length
/esi 4 neg /rdi :movlRegMemDisp8 # patch offset
@patchStaticLoadTail
diff --git a/compiler/elymasGlobalSys.ey b/compiler/elymasGlobalSys.ey
index b44de09..e00009c 100644
--- a/compiler/elymasGlobalSys.ey
+++ b/compiler/elymasGlobalSys.ey
@@ -49,7 +49,7 @@
# 2 <- memory address of entry (only present if resolution successful)
# 3 <- number of parent pointers followed (only present if resolution successful)
# 4 <- entry index * 8 within scope (only present if resolution successful)
- # 5 <- 0 if within scope data area, 1 if within extension area (only present if resolution successful)
+ # 5 <- 0 if within scope data area, scope object size if within extension area (only present if resolution successful)
# TODO simplify by returning unboxed ints where appropriate maybe
[[
8 /r15 :subqImm8Reg
diff --git a/elymas/lib/sys/opt.ey b/elymas/lib/sys/opt.ey
index 3d6e922..92f3d14 100644
--- a/elymas/lib/sys/opt.ey
+++ b/elymas/lib/sys/opt.ey
@@ -108,10 +108,8 @@
[
24 /rax /rcx :movqMemDisp8Reg # load extension area pointer
- /rax /edx :movlMemReg # load scope length
- /rdx :negqReg # prepare for substraction
/rbx :popqReg
- 0 1 /rdx /rcx /rax :movqMemIndexScaleDisp32Reg # load entry
+ 0 /rcx /rax :movqMemDisp32Reg # load entry
] ==:staticLoadFromExtensionPattern
[
@@ -474,7 +472,7 @@
constant executingScope sys .resolveInfo _ ==loadedObject {
==mode -- ==parentCount 32 add ==offsetInScope ==inExtensionArea
- inExtensionArea { offsetInScope 8 add =offsetInScope } rep
+ inExtensionArea 0 gt { offsetInScope inExtensionArea sub 8 add =offsetInScope 1 =inExtensionArea } rep
[
{ mode 16 div 1 band }' { # static case
@@ -509,7 +507,7 @@
constant executingScope sys .resolveInfo {
==mode -- ==parentCount 32 add ==offsetInScope ==inExtensionArea
- inExtensionArea { offsetInScope 8 add =offsetInScope } rep
+ inExtensionArea 0 gt { offsetInScope inExtensionArea sub 8 add =offsetInScope 1 =inExtensionArea } rep
mode 16 div 1 band {
[ NOP ] =last
@@ -528,9 +526,9 @@
constant executingScope sys .resolveInfo {
==mode -- ==parentCount 32 add ==offsetInScope ==inExtensionArea
- inExtensionArea { offsetInScope 8 add =offsetInScope } rep
+ inExtensionArea 0 gt { offsetInScope inExtensionArea sub 8 add =offsetInScope 1 =inExtensionArea } rep
- inExtensionArea not { # FIXME: implement the extension area case
+ inExtensionArea not { # FIXME: implement the extension area case, needs to create extension area on write
mode 16 div 1 band {
[ NOP ] =last
[ STATICWRITE offsetInScope parentCount inExtensionArea ] =entry
@@ -567,7 +565,7 @@
constant relevantScope sys .resolveInfo _ ==loadedObject {
==mode -- ==parentCount 32 add ==offsetInScope ==inExtensionArea
- inExtensionArea { offsetInScope 8 add =offsetInScope } rep
+ inExtensionArea 0 gt { offsetInScope inExtensionArea sub 8 add =offsetInScope 1 =inExtensionArea } rep
[
{ mode 16 div 1 band }' { # static case
@@ -1158,19 +1156,15 @@
2 entry 1 sub { 16 target target :movqMemDisp8Reg } rep
3 entry {
- target /eax :movlMemReg # load scope length
24 target target :movqMemDisp8Reg # load extension area pointer
- /rax :negqReg # prepare for substraction # TODO the length calculation could be done beforehand
- 1 entry 1 /rax target target :movqMemIndexScaleDisp32Reg
+ 1 entry target target :movqMemDisp32Reg
} {
1 entry target target :movqMemDisp32Reg
} ? *
} {
3 entry {
- /r14 /eax :movlMemReg # load scope length
24 /r14 target :movqMemDisp8Reg # load extension area pointer
- /rax :negqReg # prepare for substraction # TODO the length calculation could be done beforehand
- 1 entry 1 /rax target target :movqMemIndexScaleDisp32Reg
+ 1 entry target target :movqMemDisp32Reg
} {
1 entry /r14 target :movqMemDisp32Reg
} ? *
@@ -1507,7 +1501,7 @@
{ 0 source PUSH eq } {
/rax =reg
traceCode [
- 1 source /rax :movqImmReg
+ 1 source tmpreg :movqImmReg
] cat =traceCode
}
{ |source hasRegister } {
@@ -1559,11 +1553,8 @@
3 entry {
traceCode [
- tmpreg :pushqReg
- 24 /rax tmpreg :movqMemDisp8Reg # load extension area pointer
- /rax /eax :movlMemReg # load scope length
- /rax :negqReg # prepare for substraction
- 1 entry 1 /rax tmpreg :popqMemIndexScaleDisp32 # load entry from stack
+ 24 /rax /rax :movqMemDisp8Reg # load extension area pointer
+ tmpreg 1 entry /rax :movqRegMemDisp32 # write entry
] cat =traceCode
} {
traceCode [
@@ -1573,11 +1564,8 @@
} {
3 entry {
traceCode [
- tmpreg :pushqReg
- 24 /r14 tmpreg :movqMemDisp8Reg # load extension area pointer
- /r14 /eax :movlMemReg # load scope length
- /rax :negqReg # prepare for substraction
- 1 entry 1 /rax tmpreg :popqMemIndexScaleDisp32 # load entry from stack
+ 24 /r14 /rax :movqMemDisp8Reg # load extension area pointer
+ tmpreg 1 entry /rax :movqRegMemDisp32 # write entry
] cat =traceCode
} {
traceCode [
@@ -2217,11 +2205,11 @@
}
{ staticLoadFromExtensionPattern callTargetMatch }' {
- [ loadStart 14 add _ 4 add range peek each ] 256 math .unbase ==offsetInScope
+ [ loadStart 8 add _ 4 add range peek each ] 256 math .unbase ==offsetInExtensionArea
[ calledAddress 8 sub _ 8 add range peek each ] 256 math .unbase ==exampleObjectOffset
[ calledAddress exampleObjectOffset add _ 8 add range peek each ] 256 math .unbase ::rawObject ==exampleObject
- [ STATICTYPED offsetInScope parentCount 1 exampleObject ] emitLogic
+ [ STATICTYPED offsetInExtensionArea parentCount 1 exampleObject ] emitLogic
exampleObject protectReference
}
@@ -2461,18 +2449,14 @@
3 entry {
24 /rax /rcx :movqMemDisp8Reg # load extension area pointer
- /rax /edx :movlMemReg # load scope length
- /rdx :negqReg # prepare for substraction # TODO the length calculation could be done beforehand
- 1 entry 1 /rdx /rcx :pushqMemIndexScaleDisp32 # push loaded entry to stack
+ 1 entry /rcx :pushqMemDisp32 # push loaded entry to stack
} {
1 entry /rax :pushqMemDisp32
} ? *
} {
3 entry {
24 /r14 /rcx :movqMemDisp8Reg # load extension area pointer
- /r14 /edx :movlMemReg # load scope length
- /rdx :negqReg # prepare for substraction # TODO the length calculation could be done beforehand
- 1 entry 1 /rdx /rcx :pushqMemIndexScaleDisp32 # push loaded entry to stack
+ 1 entry /rcx :pushqMemDisp32 # push loaded entry to stack
} {
1 entry /r14 :pushqMemDisp32
} ? *
@@ -2488,18 +2472,14 @@
3 entry {
24 /rax /rcx :movqMemDisp8Reg # load extension area pointer
- /rax /edx :movlMemReg # load scope length
- /rdx :negqReg # prepare for substraction
- 1 entry 1 /rdx /rcx :popqMemIndexScaleDisp32 # load entry from stack
+ 1 entry /rcx :popqMemDisp32 # load entry from stack
} {
1 entry /rax :popqMemDisp32
} ? *
} {
3 entry {
24 /r14 /rcx :movqMemDisp8Reg # load extension area pointer
- /r14 /edx :movlMemReg # load scope length
- /rdx :negqReg # prepare for substraction
- 1 entry 1 /rdx /rcx :popqMemIndexScaleDisp32 # load entry from stack
+ 1 entry /rcx :popqMemDisp32 # load entry from stack
} {
1 entry /r14 :popqMemDisp32
} ? *
@@ -2514,9 +2494,7 @@
3 entry {
24 /rax /rcx :movqMemDisp8Reg # load extension area pointer
- /rax /edx :movlMemReg # load scope length
- /rdx :negqReg # prepare for substraction
- 1 entry 1 /rdx /rcx :pushqMemIndexScaleDisp32 # push loaded entry to stack
+ 1 entry /rcx :pushqMemDisp32 # push loaded entry to stack
} {
1 entry /rax :pushqMemDisp32
} ? *