diff options
| author | Drahflow <drahflow@gmx.de> | 2013-09-28 13:32:21 +0200 |
|---|---|---|
| committer | Drahflow <drahflow@gmx.de> | 2013-09-28 13:32:21 +0200 |
| commit | fb00faedb262e98cbb992339b14226665e18f590 (patch) | |
| tree | ce2a97910fab8c049cd7c95b7c6ac558108afc0f | |
| parent | 18b0b19af65e92bf47611882d7d6448532404fea (diff) | |
11% faster with unboxed integers
| -rw-r--r-- | compiler/elymasAsm.ey | 101 | ||||
| -rw-r--r-- | compiler/elymasAsmLib.ey | 8 | ||||
| -rw-r--r-- | compiler/elymasGlobal.ey | 259 | ||||
| -rw-r--r-- | compiler/elymasGlobalStr.ey | 22 | ||||
| -rw-r--r-- | compiler/elymasGlobalSys.ey | 1 | ||||
| -rw-r--r-- | compiler/elymasGlobalSysAsm.ey | 38 | ||||
| -rw-r--r-- | compiler/elymasGlobalSysOpt.ey | 2 | ||||
| -rw-r--r-- | compiler/elymasGlobalSysTyped.ey | 15 | ||||
| -rw-r--r-- | compiler/standardClient.ey | 2 | ||||
| -rw-r--r-- | notes | 19 |
10 files changed, 268 insertions, 199 deletions
diff --git a/compiler/elymasAsm.ey b/compiler/elymasAsm.ey index 77719ea..dcd5797 100644 --- a/compiler/elymasAsm.ey +++ b/compiler/elymasAsm.ey @@ -115,21 +115,22 @@ } /modrm11 deff { ==base ==idx ==scale - idx [ /spl /sp /esp /rsp ] streq any not assert - base [ /bpl /bp /ebp /rbp ] streq any not assert - scale _ 0 gt assert 8 le assert + idx [ /spl /sp /esp /rsp ] streq any { "sib cannot encode rsp as index" die } rep + base [ /bpl /bp /ebp /rbp ] streq any { "sib cannot encode rbp as base" die } rep + scale _ 0 gt not { "invalid scale chosen for sib" die } rep + 8 le not { "invalid scale chosen for sib" die } rep scale [ 1 %00 %40 1 %80 1 1 1 %C0 ] * - _ 1 neq assert + _ 1 eq { "invalid scale chosen for sib" die } rep %C0 band %38 idx regno 8 mul band add %07 base regno band add } /sib deff - { _ 0 ge assert 8 { _ 256 mod -01 256 div } rep -- } /imm64 deff + { 8 { _ 256 mod -01 256 div } rep -- } /imm64 deff # div / mod unsigned { _ 0 lt { 4294967296 add } rep 4294967295 band 4 { _ 256 mod -01 256 div } rep -- } /imm32 deff - { _ 0 lt { 65536 add } rep 65535 band 2 { _ 256 mod -01 256 div } rep -- } /imm16 deff - { _ 0 lt { 256 add } rep 255 band } /imm8 deff + { _ 0 lt { 65536 add } rep 65535 band 2 { _ 256 mod -01 256 div } rep -- } /imm16 deff + { _ 0 lt { 256 add } rep 255 band } /imm8 deff { %66 } /width16 deff @@ -182,8 +183,8 @@ { < ==opcode ==name { ==offset - offset 128 neg ge assert - offset 128 lt assert + offset 128 neg ge not { "Rel8 offset below -128" die } rep + offset 128 lt not { "Rel8 offset above 127" die } rep opcode offset imm8 @@ -201,8 +202,8 @@ { < ==opcode ==name { ==offset - offset 2147483648 neg ge assert - offset 2147483648 lt assert + offset 2147483648 neg ge not { "Rel32 offset below -2147483648" die } rep + offset 2147483648 lt not { "Rel32 offset above 2147483647" die } rep %0F opcode @@ -228,7 +229,7 @@ } /encode deff > } ==Mem # base register plus 8 bit displacement - { < _ bit64assert ==base /none ==idx _ 128 lt assert ==disp { ==r + { < _ bit64assert ==base /none ==idx _ 128 lt not { "Disp8 too large" die } rep ==disp { ==r r base modrm01 disp imm8 } /encode deff > @@ -252,7 +253,7 @@ } /encode deff > } ==MemIndexScale # base and scaled index register plus 8 bit displacement - { < _ bit64assert ==base _ bit64assert ==idx ==scale _ 128 lt assert ==disp { ==r + { < _ bit64assert ==base _ bit64assert ==idx ==scale _ 128 lt not { "Disp8 too large" die } rep ==disp { ==r r /sib modrm01 scale idx base sib disp imm8 @@ -362,7 +363,7 @@ { ==modrmOpcode ==mnemonic { ==reg =i reg bit8assert - i 256 lt assert + i 256 lt not { "Imm8 too large" die } rep reg regno %07 gt reg rexreqbyte or { 0 /none /none reg rex } rep %80 @@ -372,7 +373,7 @@ { ==reg ==i reg bit64assert - i 256 lt assert + i 256 lt not { "Imm8 too large" die } rep 1 /none /none reg rex %83 @@ -382,7 +383,7 @@ memoryAddressingVariants keys { ==variant memoryAddressingVariants variant . =*parse { parse ==mem ==i - i 256 lt assert + i 256 lt not { "Imm8 too large" die } rep mem .base regno %07 gt mem .idx regno %07 gt or { 0 /none mem .idx mem .base rex } rep @@ -392,7 +393,7 @@ } mnemonic /bImm variant cat defOp { parse ==mem ==i - i 65536 lt assert + i 65536 lt not { "Imm16 too large" die } rep width16 mem .base regno %07 gt mem .idx regno %07 gt or @@ -403,7 +404,7 @@ } mnemonic /wImm variant cat defOp { parse ==mem ==i - i 256 lt assert + i 256 lt not { "Imm8 too large" die } rep 1 /none mem .idx mem .base rex %83 @@ -572,7 +573,17 @@ %0F %42 dst src modrm11 - } /cmovaeqRegReg deff + } /cmovnaeqRegReg deff + + { ==dst ==src + src bit64assert + dst bit64assert + + 1 dst /none src rex + %0F + %42 + dst src modrm11 + } /cmovcqRegReg deff { ==dst ==src src bit64assert @@ -584,6 +595,28 @@ dst src modrm11 } /cmovgqRegReg deff + { ==reg ==mem + mem bit64assert + reg bit64assert + + 1 reg /none mem rex + %0F + %43 + reg mem modrm00 + } /cmovncqMemReg deff + + { ==reg ==mem ==disp + disp 128 lt not { "Disp8 out of range" die } rep + mem bit64assert + reg bit64assert + + 1 reg /none mem rex + %0F + %43 + reg mem modrm01 + disp imm8 + } /cmovncqMemDisp8Reg deff + { ==dst ==src src bit64assert dst bit64assert @@ -761,7 +794,7 @@ reg bit32assert mem bit64assert idx bit64assert - disp 128 lt assert + disp 128 lt not { "Disp8 out of range" die } rep reg regno %07 gt mem regno %07 gt idx regno %07 gt or or { 0 reg idx mem rex } rep %8D @@ -782,7 +815,7 @@ { ==mem ==i mem bit64assert - i 256 lt assert + i 256 lt not { "Imm8 too large" die } rep mem regno %07 gt { 0 /none /none mem rex } rep %C6 @@ -792,8 +825,8 @@ { ==mem ==disp ==i mem bit64assert - disp 128 lt assert - i 256 lt assert + disp 128 lt not { "Disp8 out of range" die } rep + i 256 lt not { "Imm8 too large" die } rep mem regno %07 gt { 0 /none /none mem rex } rep %C6 @@ -804,7 +837,7 @@ { ==mem ==i mem bit64assert - i 65536 lt assert + i 65536 lt not { "Imm16 too large" die } rep width16 mem regno %07 gt { 0 /none /none mem rex } rep @@ -815,7 +848,7 @@ { ==mem ==i mem bit64assert - i 65536 65536 mul lt assert + i 65536 65536 mul lt not { "Imm32 too large" die } rep mem regno %07 gt { 0 /none /none mem rex } rep %C7 @@ -825,8 +858,8 @@ { ==mem ==disp ==i mem bit64assert - disp 128 lt assert - i 65536 65536 mul lt assert + disp 128 lt not { "Disp8 out of range" die } rep + i 65536 65536 mul lt not { "Imm32 too large" die } rep mem regno %07 gt { 0 /none /none mem rex } rep %C7 @@ -845,8 +878,8 @@ { ==mem ==disp ==i mem bit64assert - i 2147483648 lt assert - i 2147483648 neg ge assert + i 2147483648 lt not { "Imm32 too small" die } rep + i 2147483648 neg ge not { "Imm32 too large" die } rep 1 /none /none mem rex %C7 @@ -897,7 +930,7 @@ { ==reg ==mem ==disp reg bit64assert mem bit64assert - disp 128 lt assert + disp 128 lt not { "Disp8 out of range" die } rep 1 reg /none mem rex %0F @@ -910,7 +943,7 @@ reg bit64assert mem bit64assert idx bit64assert - disp 128 lt assert + disp 128 lt not { "Disp8 out of range" die } rep 1 reg idx mem rex %0F @@ -1026,7 +1059,7 @@ { ==reg ==i reg bit64assert - i 64 lt assert + i 64 lt not { "Shift immediate too large" die } rep 1 /none /none reg rex %C1 @@ -1052,7 +1085,7 @@ { ==reg ==i reg bit64assert - i 64 lt assert + i 64 lt not { "Shift immediate too large" die } rep 1 /none /none reg rex %C1 @@ -1098,7 +1131,7 @@ { ==reg =i reg bit8assert - i 256 lt assert + i 256 lt not { "Imm8 too large" die } rep reg regno %07 gt reg rexreqbyte or { 0 /none /none reg rex } rep %F6 diff --git a/compiler/elymasAsmLib.ey b/compiler/elymasAsmLib.ey index ec2aa56..3ff6412 100644 --- a/compiler/elymasAsmLib.ey +++ b/compiler/elymasAsmLib.ey @@ -120,6 +120,12 @@ /rdi loadToXXX /loadToRdi deff /rbp loadToXXX /loadToRbp deff + { ==register + 63 register :btrqImm8Reg + [ 8 register register :movqMemDisp8Reg ] len :jcRel8 + 8 register register :movqMemDisp8Reg + } /unboxInteger deff + # internal functions, ABI follows SysV standards < @@ -1084,7 +1090,7 @@ { strToUTF8Bytes _ =*v len _ ==exactLength 1 sub 8 div 4 add 8 mul ==memoryLength - memoryLength 2147483648 lt assert + memoryLength 2147483648 lt not { "constant string too long" die } rep [ # allocate string diff --git a/compiler/elymasGlobal.ey b/compiler/elymasGlobal.ey index 4c863f2..b89613f 100644 --- a/compiler/elymasGlobal.ey +++ b/compiler/elymasGlobal.ey @@ -21,28 +21,43 @@ # 1 -> integer # 0 <- result of the arithmetic operation { ==opcodes - [ + [[ /rbx :popqReg - # allocate result - ::internalAllocateInteger /rax :movqImmReg - /rax :callqReg - - # actual calculation + # load arguments and test for boxed integers /rcx :popqReg - 8 /rcx /rcx :movqMemDisp8Reg + /rcx ::unboxInteger /rdx :popqReg - 8 /rdx /rdx :movqMemDisp8Reg + /rdx ::unboxInteger + # actual calculation, result expected in rdx opcodes _ len dearray - /rdx 8 /rax :movqRegMemDisp8 + + /rdx /rax :movqRegReg + 32 /rax :shrqImm8Reg + /boxResult :jnzLbl8 + + # push unboxed result + 63 /rdx :btsqImm8Reg + /rdx :pushqReg + /rbx :pushqReg + :retn + + @boxResult + /rdx :pushqReg + # allocate result + ::internalAllocateInteger /rax :movqImmReg + /rax :callqReg + + # save result into boxed int + 8 /rax :popqMemDisp8 # push int address on program stack /rax :pushqReg /rbx :pushqReg :retn - ] + ]] } /makeArith deff < @@ -91,7 +106,7 @@ /rcx :popqReg /rdx :popqReg /rax :popqReg - 8 /rax /rax :movqMemDisp8Reg + /rax ::unboxInteger /rax /rax :testqRegReg /rcx /rdx :cmovzqRegReg /rdx :pushqReg @@ -173,7 +188,7 @@ @insertIntoNameTable /rdi /rsi :movqRegMem /r15 /rax :movqMemReg - 8 /rax /rax :movqMemDisp8Reg # load int value + /rax ::unboxInteger /rax 8 /rsi :movqRegMemDisp8 # set default activation mode 8 /rbx /rdx :movqMemDisp8Reg # rdx == start of nametable in heap 16 8 /rdx :addqImm8MemDisp8 # increment fill @@ -332,6 +347,8 @@ /r15 :popqMem /rdx :popqReg + 63 /rdx :btrqImm8Reg + /unexecutable :jcLbl8 7 /rdx /cl :movbMemDisp8Reg %F0 /cl :andbImmReg @@ -402,17 +419,25 @@ @arrayFunction # rdx == array on heap /rbx :popqReg + 63 /rbx :btrqImm8Reg + /arrayIntArgumentUnboxed :jcLbl8 7 /rbx /cl :movbMemDisp8Reg %F0 /cl :andbImmReg %00 /cl :cmpbImmReg - /arrayIntArgument :jeLbl8 + /arrayIntArgumentBoxed :jeLbl8 "FIXME: typed array application" ::outputError :ud2 - @arrayIntArgument + @arrayIntArgumentBoxed 8 /rbx /rax :movqMemDisp8Reg # rax == requested index + /arrayIntArgumentLoaded :jmpLbl8 + + @arrayIntArgumentUnboxed + /rbx /rax :movqRegReg # rax == requested value + + @arrayIntArgumentLoaded /rdx /ecx :movlMemReg # load array length 3 /rcx :shrqImm8Reg # divide by object pointer size /rcx :decqReg # rcx == number of elements in array @@ -446,12 +471,25 @@ /rsp /rdi :movqRegReg @typedCommonCheck + /rbp /rbp :xorqRegReg + /rbx /rsi :movqMemReg # rsi == address of abstract argument - 7 /rsi /al :movbMemDisp8Reg # al == type of abstract argument - %F0 /al :andbImmReg + 63 /rsi :btrqImm8Reg + /unboxedAbstract :jcLbl8 + /rsi /rax :movqMemReg + @unboxedAbstract + /rbp /rax :cmovcqRegReg + 56 /rax :shrqImm8Reg + %F0 /al :andbImmReg # al == type of abstract argument + /rdi /rsi :movqMemReg # rsi == address of concrete argument - 7 /rsi /sil :movbMemDisp8Reg # sil = type of concrete argument - %F0 /sil :andbImmReg + 63 /rsi :btrqImm8Reg + /unboxedConcrete :jcLbl8 + /rsi /rsi :movqMemReg + @unboxedConcrete + /rbp /rsi :cmovcqRegReg + 56 /rsi :shrqImm8Reg + %F0 /sil :andbImmReg # sil = type of concrete argument /al /sil :cmpbRegReg /typedNonCommon :jnzLbl8 # non-equal types @@ -500,17 +538,26 @@ @stringFunction # rdx == string on heap /rbx :popqReg + + 63 /rbx :btrqImm8Reg + /stringIntArgumentUnboxed :jcLbl8 7 /rbx /cl :movbMemDisp8Reg %F0 /cl :andbImmReg %00 /cl :cmpbImmReg - /stringIntArgument :jeLbl8 + /stringIntArgumentBoxed :jeLbl8 "FIXME: typed string application" ::outputError :ud2 - @stringIntArgument + @stringIntArgumentBoxed 8 /rbx /rax :movqMemDisp8Reg # rax == requested index + /stringIntArgumentLoaded :jmpLbl8 + + @stringIntArgumentUnboxed + /rbx /rax :movqRegReg + + @stringIntArgumentLoaded 16 /rdx /rcx :movqMemDisp8Reg # load (exact) string length /rsi /rsi :xorqRegReg @@ -529,11 +576,8 @@ # rdx == correct string index 24 1 /rdx /rsi /rbx :movzxMem8IndexScaleDisp8Reg64 # use some of the CISC goodness - ::internalAllocateInteger /rax :movqImmReg - /rax :callqReg - /rax :pushqReg # push integer on the stack - - /rbx 8 /rax :movqRegMemDisp8 # store integer value + 63 /rbx :btsqImm8Reg + /rbx :pushqReg # push unboxed integer /r15 :pushqMem 8 /r15 :addqImm8Reg @@ -611,7 +655,7 @@ @arrayAssign /rax :popqReg - 8 /rax /rax :movqMemDisp8Reg + /rax ::unboxInteger /rbx /ecx :movlMemReg # load array length 3 /rcx :shrqImm8Reg # divide by object pointer size @@ -633,7 +677,7 @@ @stringAssign /rax :popqReg - 8 /rax /rax :movqMemDisp8Reg + /rax ::unboxInteger 16 /rbx /rcx :movqMemDisp8Reg # load string length /rdx /rdx :xorqRegReg @@ -643,7 +687,7 @@ # rdx == correct string offset /rax :popqReg - 8 /rax /rax :movqMemDisp8Reg # load int value + /rax ::unboxInteger /al 24 1 /rdx /rbx :movbRegMemIndexScaleDisp8 @@ -681,11 +725,8 @@ 16 /rax /rbx :movqMemDisp8Reg @done - ::internalAllocateInteger /rax :movqImmReg - /rax :callqReg - /rax :pushqReg # push integer on the stack - - /rbx 8 /rax :movqRegMemDisp8 # store integer value + 63 /rbx :btsqImm8Reg + /rbx :pushqReg # store unboxed integer # TODO can larger arrays/strings ever exist? /r15 :pushqMem 8 /r15 :addqImm8Reg @@ -804,7 +845,7 @@ /r15 :popqMem /rcx :popqReg - 8 /rcx /rcx :movqMemDisp8Reg + /rcx ::unboxInteger /rax :popqReg @@ -844,9 +885,9 @@ # /r15 == first element 8 /r15 /rdi :movqMemDisp8Reg - 8 /rdi /rdi :movqMemDisp8Reg + /rdi ::unboxInteger /r15 /rbx :movqMemReg - 8 /rbx /rbx :movqMemDisp8Reg + /rbx ::unboxInteger /rbx /rdi :subqRegReg /positiveRange :jnsLbl8 @@ -866,12 +907,25 @@ 8 /rax /rdi :leaqMemDisp8Reg # fill target 8 /r15 /rax :movqMemDisp8Reg - 8 /rax /rax :movqMemDisp8Reg # largest element + 1 + /rax ::unboxInteger # largest element + 1 @fill /rax /rbx :cmpqRegReg /done :jaeLbl8 + /rbx /rcx :movqRegReg + 32 /rcx :shrqImm8Reg + /largeElement :jnzLbl8 + + /rbx /rcx :movqRegReg + 63 /rcx :btsqImm8Reg + /rcx /rdi :movqRegMem # store into array + + /rbx :incqReg + 8 /rdi :addqImm8Reg + /fill :jmpLbl8 + + @largeElement /rax :pushqReg /rdi :pushqReg # create int @@ -943,50 +997,16 @@ [[ /rbx :popqReg - # allocate result int - ::internalAllocateInteger /rax :movqImmReg - /rax :callqReg - # and push to stack - /rax :pushqReg - ::currentQuoted /rcx :movqImmReg /rcx /rcx :movqMemReg - /rcx 8 /rax :movqRegMemDisp8 + 63 /rcx :btsqImm8Reg + /rcx :pushqReg /rbx :pushqReg :retn ]] /eyquoted defv > _ ==globalFunctions { defv }' ::allocateOffsetStruct -# FIXME delete this -# < -# # untyped scoped function jumppad -# # rdi -> code block object to call -# # rsi -> scope to install -# [[ -# 8 /r15 :subqImm8Reg -# /r15 :popqMem -# -# ::currentScope /rax :movqImmReg -# /rax /rcx :movqMemReg -# 8 /r15 :subqImm8Reg -# /rcx /r15 :movqRegMem -# /rsi /rax :movqRegMem -# -# 16 /rdi :addqImm8Reg -# /rdi :callqReg -# -# /r15 /rcx :movqMemReg -# ::currentScope /rax :movqImmReg -# /rcx /rax :movqRegMem -# 8 /r15 :addqImm8Reg -# -# /r15 :pushqMem -# 8 /r15 :addqImm8Reg -# :retn -# ]] /internalConstantNormalFunctionScopedUntypedJumpPad defv -# > { defv }' ::allocateOffsetStruct - < # resolve identifier without quoting considerations and act accordingly # 0 -> identifier to resolve @@ -1611,7 +1631,7 @@ /rdx :popqReg # push function f - [ /rax :movqImmOOBReg ] _ len 2 eq assert + [ /rax :movqImmOOBReg ] _ len 2 neq { "unexpected opcode length" die } rep 2 dearray 256 mul add /rdi :movwImmMem /rdx 2 /rdi :movqRegMemDisp8 @@ -1757,7 +1777,7 @@ 8 /r15 :subqImm8Reg /rcx :popqReg - 8 /rcx /rcx :movqMemDisp8Reg + /rcx ::unboxInteger /rcx /rcx :testqRegReg /end :jzLbl8 @@ -1803,7 +1823,8 @@ /rax :callqReg /rax :popqReg - 0 8 /rax :cmpqImm8MemDisp8 + /rax ::unboxInteger + /rax /rax :testqRegReg /end :jzLbl8 8 /r15 :pushqMemDisp8 @@ -2032,6 +2053,9 @@ /r15 :popqMem /rax :popqReg + 63 /rax :btqImm8Reg + /unboxedIntegerPassed :jcLbl8 + 7 /rax /cl :movbMemDisp8Reg %F0 /cl :andbImmReg %70 /cl :cmpbImmReg @@ -2039,6 +2063,7 @@ %20 /cl :cmpbImmReg /scopeDom :jeLbl8 + @unboxedIntegerPassed "non-array passed to dom" ::outputError :ud2 @@ -2060,14 +2085,10 @@ /rcx /rbx :cmpqRegReg /end :jnbLbl8 - /rdi :pushqReg - /rcx :pushqReg - ::internalAllocateInteger /rax :movqImmReg - /rax :callqReg - /rcx :popqReg - /rdi :popqReg + /rbx /rax :movqRegReg # TODO can larger arrays ever exist? + 63 /rax :btsqImm8Reg /rax 8 /rbx /rdi :movqRegMemIndexScale # store in array - /rbx 8 /rax :movqRegMemDisp8 # store value in int + /rbx :incqReg /loop :jmpLbl8 @@ -2126,6 +2147,9 @@ /markerFound :jeLbl32 /rdx /rsi :movqMemReg + 63 /rsi :btqImm8Reg + /immediateFound :jcLbl8 + 7 /rsi /al :movbMemDisp8Reg %F0 /al :andbImmReg /immediateFound :jzLbl8 @@ -2140,12 +2164,12 @@ :ud2 @immediateFound - [ /rax :movqImmOOBReg ] _ len 2 eq assert + [ /rax :movqImmOOBReg ] _ len 2 neq { "unexpected opcode length" die } rep 2 dearray 256 mul add /rdi :movwImmMem /rsi 2 /rdi :movqRegMemDisp8 /rsi 0 /rbp :movqRegMemDisp8 - [ /rax :pushqReg ] _ len 1 eq assert + [ /rax :pushqReg ] _ len 1 neq { "unexpected opcode length" die } rep 1 dearray 10 /rdi :movbImmMemDisp8 11 /rdi :addqImm8Reg @@ -2163,7 +2187,7 @@ # @nonScopingNonTypedFound 24 /rsi /rax :movqMemDisp8Reg - [ /rax :movqImmOOBReg ] _ len 2 eq assert + [ /rax :movqImmOOBReg ] _ len 2 neq { "unexpected opcode length" die } rep 2 dearray 256 mul add /rdi :movwImmMem /rax 0 /rbp :movqRegMemDisp8 # save code object pointer @@ -2177,12 +2201,12 @@ /search :jmpLbl32 @generalFunctionFound - [ /rax :movqImmOOBReg ] _ len 2 eq assert + [ /rax :movqImmOOBReg ] _ len 2 neq { "unexpected opcode length" die } rep 2 dearray 256 mul add /rdi :movwImmMem /rsi 2 /rdi :movqRegMemDisp8 /rsi 0 /rbp :movqRegMemDisp8 - [ /rax :pushqReg ] _ len 1 eq assert + [ /rax :pushqReg ] _ len 1 neq { "unexpected opcode length" die } rep 1 dearray 10 /rdi :movbImmMemDisp8 11 /rdi :addqImm8Reg @@ -2264,7 +2288,7 @@ ::unscopingFunctionHeader ::loadToRdi # load inner code block - [ /rdi :movqImmOOBReg ] _ len 2 eq assert + [ /rdi :movqImmOOBReg ] _ len 2 neq { "unexpected opcode length" die } rep 2 dearray 256 mul add /rdi :movwImmMem /rax 2 /rdi :movqRegMemDisp8 @@ -2293,7 +2317,7 @@ # rax == function object - [ /rax :movqImmOOBReg ] _ len 2 eq assert + [ /rax :movqImmOOBReg ] _ len 2 neq { "unexpected opcode length" die } rep 2 dearray 256 mul add /rdi :movwImmMem /rax 2 /rdi :movqRegMemDisp8 @@ -2331,25 +2355,20 @@ < [ - %10 %00 %00 %00 %00 %00 %00 %00 - %01 %00 %00 %00 %00 %00 %00 %00 - ] /t1 defv - - [ %28 %00 %00 %00 %00 %00 %00 %80 %01 %00 %00 %00 %00 %00 %00 %00 - /t1t1 /t1 ::linkAbs64 + %01 %00 %00 %00 %00 %00 %00 %80 # unboxed 1 %01 %00 %00 %00 %00 %00 %00 %00 - /t1t1 /t1 ::linkAbs64 + %01 %00 %00 %00 %00 %00 %00 %80 # unboxed 1 ] /t1t1 defv [ %30 %00 %00 %00 %00 %00 %00 %80 %02 %00 %00 %00 %00 %00 %00 %00 - /t11t1 /t1 ::linkAbs64 - /t11t1 /t1 ::linkAbs64 + %01 %00 %00 %00 %00 %00 %00 %80 # unboxed 1 + %01 %00 %00 %00 %00 %00 %00 %80 # unboxed 1 %01 %00 %00 %00 %00 %00 %00 %00 - /t11t1 /t1 ::linkAbs64 + %01 %00 %00 %00 %00 %00 %00 %80 # unboxed 1 ] /t11t1 defv [ @@ -2365,7 +2384,7 @@ /taat1 /ta ::linkAbs64 /taat1 /ta ::linkAbs64 %01 %00 %00 %00 %00 %00 %00 %00 - /taat1 /t1 ::linkAbs64 + %01 %00 %00 %00 %00 %00 %00 %80 # unboxed 1 ] /taat1 defv > _ =globalTypes { defv }' ::allocateOffsetStruct @@ -2473,13 +2492,8 @@ [[ /rbx :popqReg - # allocate result int - ::internalAllocateInteger /rax :movqImmReg - /rax :callqReg - /rdx :popqReg /rdi :popqReg - /rax :pushqReg 16 /rdx /rsi :movqMemDisp8Reg 16 /rdi /rcx :movqMemDisp8Reg @@ -2501,7 +2515,9 @@ /rdx /rdx :xorqRegReg @done - /rdx 8 /rax :movqRegMemDisp8 + 63 /rdx :btsqImm8Reg + /rdx :pushqReg + /rbx :pushqReg :retn ]] /eystreq defv @@ -2517,11 +2533,9 @@ ::internalAllocateInteger /rax :movqImmReg /rax :callqReg - # type zero does not need to be changed - # actual negation /rcx :popqReg - 8 /rcx /rcx :movqMemDisp8Reg + /rcx ::unboxInteger /rcx :notqReg /rcx 8 /rax :movqRegMemDisp8 @@ -2540,11 +2554,9 @@ ::internalAllocateInteger /rax :movqImmReg /rax :callqReg - # type zero does not need to be changed - # actual negation /rcx :popqReg - 8 /rcx /rcx :movqMemDisp8Reg + /rcx ::unboxInteger /rcx :negqReg /rcx 8 /rax :movqRegMemDisp8 @@ -2559,25 +2571,20 @@ [[ /rbx :popqReg - # allocate result int - ::internalAllocateInteger /rax :movqImmReg - /rax :callqReg - - # type zero does not need to be changed - # actual negation /rcx :popqReg - 8 /rcx /rcx :movqMemDisp8Reg + /rcx ::unboxInteger /rdx /rdx :xorqRegReg /rcx /rcx :testqRegReg /zero :jnzLbl8 /rdx :incqReg @zero - /rdx 8 /rax :movqRegMemDisp8 - # push int address on program stack - /rax :pushqReg + # push int on program stack + 63 /rdx :btsqImm8Reg + /rdx :pushqReg + /rbx :pushqReg :retn ]] /eynot defv @@ -2598,7 +2605,7 @@ /rax :pushqReg # create string - name "ey(.*)" regex assert ::constStringCode _ len dearray + name "ey(.*)" regex not { "could not extract client-side name" die } rep ::constStringCode _ len dearray # enter into current (i.e. global) scope createScopeEntry /rax :movqImmReg @@ -2618,7 +2625,7 @@ /rax :pushqReg # create string - name "ey(.*)" regex assert ::constStringCode _ len dearray + name "ey(.*)" regex not { "could not extract client-side name" die } rep ::constStringCode _ len dearray # enter into current (i.e. global) scope createScopeEntry /rax :movqImmReg @@ -2638,7 +2645,7 @@ /rax :pushqReg # create string - name "ey(.*)" regex assert ::constStringCode _ len dearray + name "ey(.*)" regex not { "could not extract client-side name" die } rep ::constStringCode _ len dearray # enter into current scope |eydeff /rax :movqImmReg diff --git a/compiler/elymasGlobalStr.ey b/compiler/elymasGlobalStr.ey index e8f945c..332d66e 100644 --- a/compiler/elymasGlobalStr.ey +++ b/compiler/elymasGlobalStr.ey @@ -10,8 +10,8 @@ /rdi :popqReg /rdi :pushqReg + /rdi ::unboxInteger - 8 /rdi /rdi :movqMemDisp8Reg 24 /rdi :addqImm8Reg ::internalAllocate /rax :movqImmReg /rax :callqReg @@ -25,7 +25,7 @@ # set exact length /rdi :popqReg - 8 /rdi /rdi :movqMemDisp8Reg + /rdi ::unboxInteger /rdi 16 /rax :movqRegMemDisp8 /rax :pushqReg @@ -44,7 +44,7 @@ /rax :popqReg /rcx :popqReg - 8 /rcx /rcx :movqMemDisp8Reg + /rcx ::unboxInteger 16 /rax /rcx :cmpqMemDisp8Reg /ok :jbeLbl8 @@ -75,14 +75,14 @@ 16 /rcx /rbp :movqMemDisp8Reg /rdi :popqReg - 8 /rdi /rdi :movqMemDisp8Reg + /rdi ::unboxInteger 0 /rdi :cmpqImm8Reg /positiveEndOffset :jgeLbl8 /rbp /rdi :addqRegReg @positiveEndOffset /rsi :popqReg - 8 /rsi /rsi :movqMemDisp8Reg + /rsi ::unboxInteger 0 /rsi :cmpqImm8Reg /positiveStartOffset :jgeLbl8 /rbp /rsi :addqRegReg @@ -133,7 +133,7 @@ 16 /rcx /rbp :movqMemDisp8Reg /rdi :popqReg - 8 /rdi /rdi :movqMemDisp8Reg + /rdi ::unboxInteger 0 /rdi :cmpqImm8Reg /positiveEndOffset :jgeLbl8 /rbp /rdi :addqRegReg @@ -189,7 +189,7 @@ /rbp /rdi :movqRegReg /rsi :popqReg - 8 /rsi /rsi :movqMemDisp8Reg + /rsi ::unboxInteger 0 /rsi :cmpqImm8Reg /positiveStartOffset :jgeLbl8 /rbp /rsi :addqRegReg @@ -254,7 +254,7 @@ @copyByte /rsi /rdx :movqMemReg # load object pointer - 8 /rdx /rdx :movqMemDisp8Reg # load integer value + /rdx ::unboxInteger /dl /rax :movbRegMem 8 /rsi :addqImm8Reg @@ -297,7 +297,7 @@ /rdi :popqReg /rax :popqReg - 8 /rax /rax :movqMemDisp8Reg + /rax ::unboxInteger /rdx :pushqReg @@ -319,7 +319,7 @@ /rdi :popqReg /rax :popqReg - 8 /rax /rax :movqMemDisp8Reg + /rax ::unboxInteger /rax 24 /rdi :btsqRegMemDisp8 @@ -335,7 +335,7 @@ /rdi :popqReg /rax :popqReg - 8 /rax /rax :movqMemDisp8Reg + /rax ::unboxInteger /rax 24 /rdi :btrqRegMemDisp8 diff --git a/compiler/elymasGlobalSys.ey b/compiler/elymasGlobalSys.ey index 05017d7..1f95e0b 100644 --- a/compiler/elymasGlobalSys.ey +++ b/compiler/elymasGlobalSys.ey @@ -35,6 +35,7 @@ # 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) + # TODO simplify by returning unboxed ints where appropriate maybe [[ 8 /r15 :subqImm8Reg /r15 :popqMem diff --git a/compiler/elymasGlobalSysAsm.ey b/compiler/elymasGlobalSysAsm.ey index a94c78f..eb4527e 100644 --- a/compiler/elymasGlobalSysAsm.ey +++ b/compiler/elymasGlobalSysAsm.ey @@ -6,15 +6,11 @@ [[ /rbx :popqReg - ::internalAllocateInteger /rax :movqImmReg - /rax :callqReg - /rcx :popqReg - /rax :pushqReg - - 8 /rcx /rcx :movqMemDisp8Reg + /rcx ::unboxInteger /rcx /rcx :movzxMem8Reg64 - /rcx 8 /rax :movqRegMemDisp8 + 63 /rcx :btsqImm8Reg + /rcx :pushqReg /rbx :pushqReg :retn @@ -27,9 +23,9 @@ /rbx :popqReg /rax :popqReg - 8 /rax /rax :movqMemDisp8Reg + /rax ::unboxInteger /rcx :popqReg - 8 /rcx /rcx :movqMemDisp8Reg + /rcx ::unboxInteger /cl /rax :movbRegMem /rbx :pushqReg @@ -42,7 +38,7 @@ /rbx :popqReg /rax :popqReg - 8 /rax /rax :movqMemDisp8Reg + /rax ::unboxInteger /rax :callqReg /rbx :pushqReg @@ -73,9 +69,12 @@ [ /rax /r9 /r8 /r10 /rdx /rsi /rdi ] { ==reg reg :popqReg + 63 reg :btrqImm8Reg + /intLoadUnboxed reg cat :jcLbl8 + 7 reg /bl :movbMemDisp8Reg %F0 /bl :andbImmReg - /intLoad reg cat :jzLbl8 + /intLoadBoxed reg cat :jzLbl8 %10 /bl :cmpbImmReg /stringLoad reg cat :jeLbl8 @@ -86,9 +85,10 @@ 24 reg reg :leaqMemDisp8Reg /doneLoad reg cat :jmpLbl8 - /intLoad reg cat :label + /intLoadBoxed reg cat :label 8 reg reg :movqMemDisp8Reg + /intLoadUnboxed reg cat :label /doneLoad reg cat :label } each @@ -113,17 +113,14 @@ # 0 <- number of allocations registered [[ /rbx :popqReg - # allocate return integer - ::internalAllocateInteger /rax :movqImmReg - /rax :callqReg - /rax :pushqReg ::globalAllocationList /rdx :movqImmReg /rdx /rdx :movqMemReg /rdx /rdx :movqMemReg 4 /rdx :shrqImm8Reg /rdx :decqReg - /rdx 8 /rax :movqRegMemDisp8 + 63 /rdx :btsqImm8Reg + /rdx :pushqReg /rbx :pushqReg :retn @@ -142,7 +139,7 @@ /rcx :popqReg /rax :pushqReg - 8 /rcx /rcx :movqMemDisp8Reg + /rcx ::unboxInteger ::globalAllocationList /rdx :movqImmReg /rdx /rdx :movqMemReg @@ -169,7 +166,7 @@ /rcx :popqReg /rax :pushqReg - 8 /rcx /rcx :movqMemDisp8Reg + /rcx ::unboxInteger ::globalAllocationList /rdx :movqImmReg /rdx /rdx :movqMemReg @@ -207,7 +204,8 @@ /rbx :popqReg /rax :popqReg - 8 /rax :pushqMemDisp8 # push integer value + /rax ::unboxInteger + /rax :pushqReg # push integer value /rbx :pushqReg :retn diff --git a/compiler/elymasGlobalSysOpt.ey b/compiler/elymasGlobalSysOpt.ey index 4f2b9a6..b3128bf 100644 --- a/compiler/elymasGlobalSysOpt.ey +++ b/compiler/elymasGlobalSysOpt.ey @@ -34,7 +34,7 @@ @opcodeCopyLoop /rsi /rax :movqMemReg - 8 /rax /rax :movqMemDisp8Reg + /rax ::unboxInteger :stosb 8 /rsi :addqImm8Reg /opcodeCopyLoop :loopLbl8 diff --git a/compiler/elymasGlobalSysTyped.ey b/compiler/elymasGlobalSysTyped.ey index 298dba8..5284c69 100644 --- a/compiler/elymasGlobalSysTyped.ey +++ b/compiler/elymasGlobalSysTyped.ey @@ -45,15 +45,20 @@ [[ /rbx :popqReg - ::internalAllocateInteger /rax :movqImmReg - /rax :callqReg - /rdx :popqReg + 63 /rdx :btrqImm8Reg + /integerType :jcLbl8 + 7 /rdx /rdx :movzxMem8Disp8Reg64 4 /rdx :shrqImm8Reg - /rdx 8 /rax :movqRegMemDisp8 + /done :jmpLbl8 - /rax :pushqReg + @integerType + /rdx /rdx :xorqRegReg + + @done + 63 /rdx :btsqImm8Reg + /rdx :pushqReg /rbx :pushqReg :retn diff --git a/compiler/standardClient.ey b/compiler/standardClient.ey index e00279f..acebf25 100644 --- a/compiler/standardClient.ey +++ b/compiler/standardClient.ey @@ -815,7 +815,7 @@ 1 0 { strNumber * 48 sub [ 0 1 2 3 4 5 6 7 8 9 0 0 0 0 0 0 0 10 11 12 13 14 15 ] * } -20*10* 16 mul add } "%" defq - { _ 0 ge assert 8 { _ 256 mod -01 256 div } rep -- } /uint64 deffd + { 8 { _ 256 mod -01 256 div } rep -- } /uint64 deffd { _ 0 lt { 4294967296 add } rep 4294967295 band 4 { _ 256 mod -01 256 div } rep -- } /uint32 deffd { _ 0 lt { 65536 add } rep 65535 band 2 { _ 256 mod -01 256 div } rep -- } /uint16 deffd { _ 0 lt { 256 add } rep 255 band } /uint8 deffd @@ -111,6 +111,25 @@ a-z: bareword characters }: quote end ~: <open> += Stuff on the Stack = + +0: zero +1: one +?: data +x: don't care + +1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx???????????????????????????????? +unboxed integer + +00000000000000000110???????????????????????????????????????????? +reference to heap object + +0000000000000000000000000000000000000000000000000000000000000001 +array begin marker + +0000000000000000000000000000000000000000000000000000000000000010 +quote begin marker + = Memory Management = |
