aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDrahflow <drahflow@gmx.de>2013-01-22 18:52:17 +0100
committerDrahflow <drahflow@gmx.de>2013-01-22 18:52:17 +0100
commite5b6407246b3fd64014f92e80679274cb1a7bfde (patch)
treeb8cfb349372cf0a651b2669c087b4cfbc1161b9e
parent38c6689e33361193d3791a6fc6052824208c9cf7 (diff)
More standard functions
grep.ey now compiling
-rw-r--r--compiler/elymasAsm.ey99
-rw-r--r--compiler/elymasAsmLib.ey206
l---------examples/working-compiler/grep.test1
3 files changed, 304 insertions, 2 deletions
diff --git a/compiler/elymasAsm.ey b/compiler/elymasAsm.ey
index 78d716b..f09a47f 100644
--- a/compiler/elymasAsm.ey
+++ b/compiler/elymasAsm.ey
@@ -275,10 +275,90 @@
1 dst /none src rex
%0F
+ %46
+ dst src modrm11
+ } /cmovnaqRegReg deff
+
+ { ==dst ==src
+ src bit64assert
+ dst bit64assert
+
+ 1 dst /none src rex
+ %0F
%43
dst src modrm11
} /cmovaeqRegReg deff
+ { ==dst ==src
+ src bit64assert
+ dst bit64assert
+
+ 1 dst /none src rex
+ %0F
+ %42
+ dst src modrm11
+ } /cmovaeqRegReg deff
+
+ { ==dst ==src
+ src bit64assert
+ dst bit64assert
+
+ 1 dst /none src rex
+ %0F
+ %4F
+ dst src modrm11
+ } /cmovgqRegReg deff
+
+ { ==dst ==src
+ src bit64assert
+ dst bit64assert
+
+ 1 dst /none src rex
+ %0F
+ %4E
+ dst src modrm11
+ } /cmovngqRegReg deff
+
+ { ==dst ==src
+ src bit64assert
+ dst bit64assert
+
+ 1 dst /none src rex
+ %0F
+ %4D
+ dst src modrm11
+ } /cmovgeqRegReg deff
+
+ { ==dst ==src
+ src bit64assert
+ dst bit64assert
+
+ 1 dst /none src rex
+ %0F
+ %4C
+ dst src modrm11
+ } /cmovngeqRegReg deff
+
+ { ==dst ==src
+ src bit64assert
+ dst bit64assert
+
+ 1 dst /none src rex
+ %0F
+ %45
+ dst src modrm11
+ } /cmovnzqRegReg deff
+
+ { ==dst ==src
+ src bit64assert
+ dst bit64assert
+
+ 1 dst /none src rex
+ %0F
+ %44
+ dst src modrm11
+ } /cmovzqRegReg deff
+
{
%A6
} /cmpsb deff
@@ -635,6 +715,17 @@
1 idx mem sib
} /movqRegMemIndex deff
+ { ==mem ==idx ==scale ==reg
+ reg bit64assert
+ mem bit64assert
+ idx bit64assert
+
+ 1 reg idx mem rex
+ %89
+ reg /sib modrm00
+ scale idx mem sib
+ } /movqRegMemIndexScale deff
+
{ ==dst ==src
src bit64assert
dst bit64assert
@@ -671,6 +762,14 @@
/four reg modrm11
} /mulqReg deff
+ { ==reg
+ reg bit64assert
+
+ 1 /none /none reg rex
+ %F7
+ /three reg modrm11
+ } /negqReg deff
+
{ ==mem ==i
mem bit64assert
i 256 lt assert
diff --git a/compiler/elymasAsmLib.ey b/compiler/elymasAsmLib.ey
index 9e59044..171b3a1 100644
--- a/compiler/elymasAsmLib.ey
+++ b/compiler/elymasAsmLib.ey
@@ -55,6 +55,7 @@
"not an executable thing" toErrString ==errNotExecutable
"neither string nor array in cat" toErrString ==errNeitherStringNorArrayInCat
"type mismatch within cat" toErrString ==errMismatchInCat
+ "non-array passed to dom" toErrString ==errNotArrayInDom
> { defv }' allocateOffsetStruct
{ _ =*array len _ 4 div ==largeMoves
@@ -433,27 +434,120 @@
[ /rcx /rdx :andqRegReg ] makeArith /eyband defv
[ /rcx /rdx :orqRegReg ] makeArith /eybor defv
[ /rcx /rdx :xorqRegReg ] makeArith /eybxor defv
+
+ [
+ /rdi /rdi :xorqRegReg
+ 1 /rsi :movqImmReg
+ /rdx /rcx :cmpqRegReg
+ /rsi /rdx :movqRegReg
+ /rdi /rdx :cmovnzqRegReg
+ ] makeArith /eyeq defv
[
/rdi /rdi :xorqRegReg
1 /rsi :movqImmReg
/rdx /rcx :cmpqRegReg
/rsi /rdx :movqRegReg
- /rdi /rdx :cmovaeqRegReg
+ /rdi /rdx :cmovgeqRegReg
] makeArith /eygt defv
[
/rdi /rdi :xorqRegReg
1 /rsi :movqImmReg
/rdx /rcx :cmpqRegReg
/rsi /rdx :movqRegReg
- /rdi /rdx :cmovaqRegReg
+ /rdi /rdx :cmovgqRegReg
] makeArith /eyge defv
[
+ /rdi /rdi :xorqRegReg
+ 1 /rsi :movqImmReg
+ /rdx /rcx :cmpqRegReg
+ /rsi /rdx :movqRegReg
+ /rdi /rdx :cmovngqRegReg
+ ] makeArith /eylt defv
+ [
+ /rdi /rdi :xorqRegReg
+ 1 /rsi :movqImmReg
+ /rdx /rcx :cmpqRegReg
+ /rsi /rdx :movqRegReg
+ /rdi /rdx :cmovngeqRegReg
+ ] makeArith /eyle defv
+
+ [
/rax :pushqReg
/rcx /rax :movqRegReg
/rdx :mulqReg
/rax /rdx :movqRegReg
/rax :popqReg
] makeArith /eymul defv
+ [
+ /rax :pushqReg
+ /rdx /rax :movqRegReg
+ /rdx /rdx :xorqRegReg
+ /rcx :divqReg
+ /rax :popqReg
+ ] makeArith /eymod defv
+ [
+ /rax :pushqReg
+ /rdx /rax :movqRegReg
+ /rdx /rdx :xorqRegReg
+ /rcx :divqReg
+ /rax /rdx :movqRegReg
+ /rax :popqReg
+ ] makeArith /eydiv defv
+
+ [
+ /rcx /rcx :testqRegReg
+ /no :jzLbl8
+ /rdx /rdx :testqRegReg
+ /no :jzLbl8
+ 1 /rdx :movqImmReg
+ /done :jmpLbl8
+
+ @no
+ /rdx /rdx :xorqRegReg
+ @done
+ ] :labelResolve makeArith /eyand defv
+
+ # 0 -> integer
+ # 0 <- the negated integer
+ [
+ /rbx :popqReg
+
+ # allocate result int
+ 16 /rdi :movqImmReg
+ internalAllocate /rax :movqImmReg
+ /rax :callqReg
+
+ # type zero does not need to be changed
+
+ # actual negation
+ /rcx :popqReg
+ 8 /rcx /rcx :movqMemDisp8Reg
+ /rcx :negqReg
+ /rcx 8 /rax :movqRegMemDisp8
+
+ # push int address on program stack
+ /rax :pushqReg
+ /rbx :pushqReg
+ :retn
+ ] /eyneg defv
+
+ # decide between two alternatives
+ # 0 -> alternative 0
+ # 1 -> alternative not 0
+ # 2 -> decision value
+ # 0 <- the selected alternative
+ [
+ /rbx :popqReg
+ /rcx :popqReg
+ /rdx :popqReg
+ /rax :popqReg
+ 8 /rax /rax :movqMemDisp8Reg
+ /rax /rax :testqRegReg
+ /rcx /rdx :cmovzqRegReg
+ /rdx :pushqReg
+ /rbx :pushqReg
+ :retn
+ ] /ey? defv
{ ==activation
# create a new entry in the current scope for the given name
@@ -897,6 +991,60 @@
:retn
] :labelResolve /eycat defv
+ # domain of an array
+ # 0 -> array
+ # 0 <- an array containing the integers from 0 to len 1 sub
+ [
+ 8 /r15 :subqImm8Reg
+ /r15 :popqMem
+
+ /rax :popqReg
+ 7 /rax /cl :movbMemDisp8Reg
+ %F0 /cl :andbImmReg
+ %70 /cl :cmpbImmReg
+ /arrayDom :jeLbl8
+
+ errNotArrayInDom /rdi :movqImmReg
+ internalDumpErrorString /rax :movqImmReg
+ /rax :callqReg
+ :ud2
+
+ @arrayDom
+ /rax /edi :movlMemReg
+ 8 /rdi :subqImm8Reg # substract header length
+
+ internalAllocateArray /rax :movqImmReg
+ /rax :callqReg
+ /rax :pushqReg # result on stack
+
+ 8 /rax /rdi :leaqMemDisp8Reg
+ /rbx /rbx :xorqRegReg
+ /rax /ecx :movlMemReg
+ 3 /rcx :shrqImm8Reg
+ /rcx :decqReg
+
+ @loop
+ /rcx /rbx :cmpqRegReg
+ /end :jnbLbl8
+
+ /rdi :pushqReg
+ /rcx :pushqReg
+ 16 /rdi :movqImmReg
+ internalAllocate /rax :movqImmReg
+ /rax :callqReg
+ /rcx :popqReg
+ /rdi :popqReg
+ /rax 8 /rbx /rdi :movqRegMemIndexScale # store in array
+ /rbx 8 /rax :movqRegMemDisp8 # store value in int
+ /rbx :incqReg
+ /loop :jmpLbl8
+
+ @end
+ /r15 :pushqMem
+ 8 /r15 :addqImm8Reg
+ :retn
+ ] :labelResolve /eydom defv
+
# create an array containing a continuous range of ints
# 0 -> last element included in range
# 1 -> first element included in range
@@ -1165,6 +1313,60 @@
> { defv }' allocateOffsetStruct
<
+ # concatenate two functions
+ # 0 -> function g
+ # 1 -> function f
+ # 0 <- (f g)
+ [
+ 8 /r15 :subqImm8Reg
+ /r15 :popqMem
+
+ # construct non-capturing function
+ :quoteEncodingBuffer /rdi :movqImmReg
+ unscopingFunctionHeader loadToRdi
+
+ /rcx :popqReg
+ /rdx :popqReg
+
+ # push function f
+ [ /rax :movqImmOOBReg ] _ len 2 eq assert
+ 2 dearray 256 mul add
+ /rdi :movwImmMem
+ /rdx 2 /rdi :movqRegMemDisp8
+ 10 /rdi :addqImm8Reg
+ [
+ /rax :pushqReg
+ |ey* /rax :movqImmReg
+ /rax :callqReg
+ /rax :movqImmOOBReg
+ ] loadToRdi
+ # push function g
+ /rcx /rdi :movqRegMem
+ 8 /rdi :addqImm8Reg
+ [
+ /rax :pushqReg
+ |ey* /rax :movqImmReg
+ /rax :callqReg
+ ] functionFooter cat loadToRdi
+
+ allocateCodeFromEncodingBuffer
+ # rax == code block on heap
+
+ # create non-capturing function object
+ /rax /rdi :movqRegReg
+ /rsi /rsi :xorqRegReg
+ /rdx /rdx :xorqRegReg
+ internalAllocateFunction /rax :movqImmReg
+ /rax :callqReg
+
+ # rax == function object on heap
+ /rax :pushqReg
+
+ /r15 :pushqMem
+ 8 /r15 :addqImm8Reg
+ :retn
+ ] :labelResolve /ey; defv
+
# drop top stack element
[
/rax :popqReg
diff --git a/examples/working-compiler/grep.test b/examples/working-compiler/grep.test
new file mode 120000
index 0000000..2fb7b42
--- /dev/null
+++ b/examples/working-compiler/grep.test
@@ -0,0 +1 @@
+../working/grep.ey \ No newline at end of file