diff options
| author | Drahflow <drahflow@gmx.de> | 2013-10-15 10:43:45 +0200 |
|---|---|---|
| committer | Drahflow <drahflow@gmx.de> | 2013-10-15 10:43:45 +0200 |
| commit | 64419a3ffee442e831dc3d54a64fe382baf7c297 (patch) | |
| tree | eddfd7b0ba69be0c8ae86806c87c5c98f0468489 /compiler | |
| parent | 00feca5e1e9bd4e1625a76fc548b06f05a0e88f8 (diff) | |
Dynamically shared object support
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/elymasAsm.ey | 67 | ||||
| -rw-r--r-- | compiler/elymasGlobal.ey | 27 | ||||
| -rw-r--r-- | compiler/elymasGlobalSysAsm.ey | 17 | ||||
| -rw-r--r-- | compiler/standardClient.ey | 3 |
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 |
