aboutsummaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
authorDrahflow <drahflow@gmx.de>2013-10-15 10:43:45 +0200
committerDrahflow <drahflow@gmx.de>2013-10-15 10:43:45 +0200
commit64419a3ffee442e831dc3d54a64fe382baf7c297 (patch)
treeeddfd7b0ba69be0c8ae86806c87c5c98f0468489 /compiler
parent00feca5e1e9bd4e1625a76fc548b06f05a0e88f8 (diff)
Dynamically shared object support
Diffstat (limited to 'compiler')
-rw-r--r--compiler/elymasAsm.ey67
-rw-r--r--compiler/elymasGlobal.ey27
-rw-r--r--compiler/elymasGlobalSysAsm.ey17
-rw-r--r--compiler/standardClient.ey3
4 files changed, 110 insertions, 4 deletions
diff --git a/compiler/elymasAsm.ey b/compiler/elymasAsm.ey
index 1d4d906..b3a61cd 100644
--- a/compiler/elymasAsm.ey
+++ b/compiler/elymasAsm.ey
@@ -770,12 +770,14 @@
/je _ %74 defJmpRel8 %84 defJmpRel32
/jg _ %7F defJmpRel8 %8F defJmpRel32
/jge _ %7D defJmpRel8 %8D defJmpRel32
+ /jl _ %7C defJmpRel8 %8C defJmpRel32
/jle _ %7E defJmpRel8 %8E defJmpRel32
/jnb _ %73 defJmpRel8 %83 defJmpRel32
/jnc _ %73 defJmpRel8 %83 defJmpRel32
/jne _ %75 defJmpRel8 %85 defJmpRel32
/jng _ %7E defJmpRel8 %8E defJmpRel32
/jnl _ %7D defJmpRel8 %8D defJmpRel32
+ /jnge _ %7C defJmpRel8 %8C defJmpRel32
/jnle _ %7F defJmpRel8 %8F defJmpRel32
/jns _ %79 defJmpRel8 %89 defJmpRel32
/jno _ %71 defJmpRel8 %81 defJmpRel32
@@ -928,6 +930,55 @@
%A5
} /movsq deff
+ { ==dst ==src
+ dst bit64assert
+ src bit8assert
+
+ 1 dst /none src rex
+ %0F
+ %BE
+ dst src modrm11
+ } /movsxbqRegReg deff
+
+ { ==dst ==src
+ dst bit64assert
+ src bit16assert
+
+ 1 dst /none src rex
+ %0F
+ %BF
+ dst src modrm11
+ } /movsxwqRegReg deff
+
+ { ==dst ==src
+ dst bit64assert
+ src bit32assert
+
+ 1 dst /none src rex
+ %63
+ dst src modrm11
+ } /movsxlqRegReg deff
+
+ { ==dst ==src
+ dst bit64assert
+ src bit8assert
+
+ 1 dst /none src rex
+ %0F
+ %B6
+ dst src modrm11
+ } /movzxbqRegReg deff
+
+ { ==dst ==src
+ dst bit64assert
+ src bit16assert
+
+ 1 dst /none src rex
+ %0F
+ %B7
+ dst src modrm11
+ } /movzxwqRegReg deff
+
{ ==reg ==mem
reg bit64assert
mem bit64assert
@@ -936,7 +987,7 @@
%0F
%B6
reg mem modrm00
- } /movzxMem8Reg64 deff
+ } /movzxMem8Reg64 deff # TODO: this is a weird name, should be movzxbqMemReg
{ ==reg ==mem ==disp
reg bit64assert
@@ -948,7 +999,7 @@
%B6
reg mem modrm01
disp imm8
- } /movzxMem8Disp8Reg64 deff
+ } /movzxMem8Disp8Reg64 deff # TODO: this is a weird name, should be movzxbqMemDisp8Reg
{ ==reg ==mem ==idx ==scale ==disp
reg bit64assert
@@ -962,7 +1013,7 @@
reg /sib modrm01
scale idx mem sib
disp imm8
- } /movzxMem8IndexScaleDisp8Reg64 deff
+ } /movzxMem8IndexScaleDisp8Reg64 deff # TODO: this is a weird name, should be movzxbqMemIndexScaleDisp8Reg
{ ==reg
reg bit64assert
@@ -1030,6 +1081,10 @@
} /reprcx deff
{
+ %F2
+ } /repnz deff
+
+ {
%F3
} /repz deff
@@ -1053,6 +1108,10 @@
/zero reg modrm11
} /rolqClReg deff
+ {
+ %AE
+ } /scasb deff
+
{ ==reg
reg regno %07 gt reg rexreqbyte or { 0 reg /none /none rex } rep
%0F
@@ -1140,7 +1199,7 @@
scale idx mem sib
} /testbRegMemIndexScale deff
- { ==reg =i
+ { ==reg ==i
reg bit8assert
i 256 lt not { "Imm8 too large" die } rep
diff --git a/compiler/elymasGlobal.ey b/compiler/elymasGlobal.ey
index 27527ee..8ac388e 100644
--- a/compiler/elymasGlobal.ey
+++ b/compiler/elymasGlobal.ey
@@ -1894,6 +1894,8 @@
@eachString
16 /rax /rcx :movqMemDisp8Reg
+ /rcx /rcx :testqRegReg
+ /end :jzLbl8
/rcx 8 /r15 :movqRegMemDisp8
24 /rax /rcx :leaqMemDisp8Reg
/rcx /r15 :movqRegMem
@@ -2002,6 +2004,31 @@
:ud2
]] /ey.| defv
+ # test whether a scope member exists
+ # 0 -> member name
+ # 1 -> scope
+ # 0 <- 1 if scope member exists, 0 otherwise
+ [[
+ 8 /r15 :subqImm8Reg
+ /r15 :popqMem
+
+ /rsi :popqReg # fetch identifier
+ /rdi :popqReg # fetch scope
+ ::internalResolve /rax :movqImmReg
+ /rax :callqReg
+
+ /rax /rax :testqRegReg
+ /unresolved :jzLbl8
+ 1 /rax :movqImmReg
+ @unresolved
+ 63 /rax :btsqImm8Reg
+ /rax :pushqReg
+
+ /r15 :pushqMem
+ 8 /r15 :addqImm8Reg
+ :retn
+ ]] /ey.? defv
+
# enumerate scope keys
# 0 -> scope
# 0 <- array of keys
diff --git a/compiler/elymasGlobalSysAsm.ey b/compiler/elymasGlobalSysAsm.ey
index f233a7b..3a7e2c1 100644
--- a/compiler/elymasGlobalSysAsm.ey
+++ b/compiler/elymasGlobalSysAsm.ey
@@ -407,6 +407,22 @@
:retn
]] /eyinternalAllocateInteger defv
+ # returns internalAllocateString into userspace
+ # 0 <- ::internalAllocateString as integer
+ [[
+ /rbx :popqReg
+
+ ::internalAllocateInteger /rax :movqImmReg
+ /rax :callqReg
+ /rax :pushqReg
+
+ ::internalAllocateString /rdx :movqImmReg
+ /rdx 8 /rax :movqRegMemDisp8
+
+ /rbx :pushqReg
+ :retn
+ ]] /eyinternalAllocateString defv
+
# returns internalAllocateScope into userspace
# 0 <- ::internalAllocateScope as integer
[[
@@ -422,6 +438,7 @@
/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/standardClient.ey b/compiler/standardClient.ey
index bdc637c..f75af2c 100644
--- a/compiler/standardClient.ey
+++ b/compiler/standardClient.ey
@@ -131,6 +131,9 @@
} { ^n } {
{ 0 "\n" * eq }" terminal =a
tail
+ } { ^[ } {
+ { 0 "[" * eq }" terminal =a
+ tail
} { 1 } {
"invalid character '" "' after \\ in regex" -120 cat cat die
} ] conds