aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDrahflow <drahflow@gmx.de>2013-09-28 13:32:21 +0200
committerDrahflow <drahflow@gmx.de>2013-09-28 13:32:21 +0200
commitfb00faedb262e98cbb992339b14226665e18f590 (patch)
treece2a97910fab8c049cd7c95b7c6ac558108afc0f
parent18b0b19af65e92bf47611882d7d6448532404fea (diff)
11% faster with unboxed integers
-rw-r--r--compiler/elymasAsm.ey101
-rw-r--r--compiler/elymasAsmLib.ey8
-rw-r--r--compiler/elymasGlobal.ey259
-rw-r--r--compiler/elymasGlobalStr.ey22
-rw-r--r--compiler/elymasGlobalSys.ey1
-rw-r--r--compiler/elymasGlobalSysAsm.ey38
-rw-r--r--compiler/elymasGlobalSysOpt.ey2
-rw-r--r--compiler/elymasGlobalSysTyped.ey15
-rw-r--r--compiler/standardClient.ey2
-rw-r--r--notes19
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
diff --git a/notes b/notes
index 9ace742..43014f6 100644
--- a/notes
+++ b/notes
@@ -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 =