diff options
| author | Drahflow <drahflow@gmx.de> | 2013-01-22 18:52:17 +0100 |
|---|---|---|
| committer | Drahflow <drahflow@gmx.de> | 2013-01-22 18:52:17 +0100 |
| commit | e5b6407246b3fd64014f92e80679274cb1a7bfde (patch) | |
| tree | b8cfb349372cf0a651b2669c087b4cfbc1161b9e | |
| parent | 38c6689e33361193d3791a6fc6052824208c9cf7 (diff) | |
More standard functions
grep.ey now compiling
| -rw-r--r-- | compiler/elymasAsm.ey | 99 | ||||
| -rw-r--r-- | compiler/elymasAsmLib.ey | 206 | ||||
| l--------- | examples/working-compiler/grep.test | 1 |
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 |
