diff options
| author | Drahflow <drahflow@gmx.de> | 2015-06-22 13:26:49 +0200 |
|---|---|---|
| committer | Drahflow <drahflow@gmx.de> | 2015-06-22 13:26:49 +0200 |
| commit | c928ded416dd1cd5ef01df1e5768c07868000e86 (patch) | |
| tree | 721204394f46f6b2f11f2830a85ab2359c18079e | |
| parent | 483c65f6132fb81113227c67da79bf5fe66166ec (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.ey | 4 | ||||
| -rw-r--r-- | compiler/elymasGlobal.ey | 7 | ||||
| -rw-r--r-- | compiler/elymasGlobalSys.ey | 2 | ||||
| -rw-r--r-- | elymas/lib/sys/opt.ey | 62 |
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 } ? * |
