diff options
| author | Drahflow <drahflow@gmx.de> | 2013-01-19 13:35:47 +0100 |
|---|---|---|
| committer | Drahflow <drahflow@gmx.de> | 2013-01-19 13:35:47 +0100 |
| commit | f630deeb77bbfab3d262a172696621ff840dc621 (patch) | |
| tree | 311ded1ae7dc912e24a4d26bdf46e0105f293fc9 | |
| parent | b7a44c57268d42b1abb40b0faea1bd2cc071894f (diff) | |
loop now working
| -rw-r--r-- | compiler/Makefile | 33 | ||||
| -rw-r--r-- | compiler/elymasAsm.ey | 24 | ||||
| -rw-r--r-- | compiler/elymasAsmLib.ey | 64 |
3 files changed, 120 insertions, 1 deletions
diff --git a/compiler/Makefile b/compiler/Makefile new file mode 100644 index 0000000..674cc52 --- /dev/null +++ b/compiler/Makefile @@ -0,0 +1,33 @@ +.PHONY: test + +CASES=../examples/working-compiler +EXE=../../compiler/elymas.ey + +test: + for f in $$(ls $(CASES)/*.test | sed -e 's/.*\///g'); do \ + printf "%20s: " $$f; \ + echo Input | ( cd $(CASES); $(EXE) "$$f"; echo ) \ + 2> "test/$$f.err.test" | sed -e 's/.*://g' > "test/$$f.test"; \ + if diff "test/$$f.test" "test/$$f.correct" && diff "test/$$f.err.test" "test/$$f.err.correct"; then \ + echo "[32mSuccess.[0m"; \ + else \ + echo "[31mFailed.[0m"; \ + fi \ + done + +generate-test: + mkdir -p test + for f in $$(ls $(CASES)/*.test | sed -e 's/.*\///g'); do \ + echo $$f; \ + echo Input | ( cd $(CASES); $(EXE) "$$f"; echo ) \ + 2> "test/$$f.err.correct" | sed -e 's/.*://g' | tee "test/$$f.correct"; \ + sleep 1; \ + done + +generate-test-fast: + mkdir -p test + for f in $$(ls $(CASES)/*.test | sed -e 's/.*\///g'); do \ + echo $$f; \ + echo Input | ( cd $(CASES); $(EXE) "$$f"; echo ) \ + 2> "test/$$f.err.correct" | sed -e 's/.*://g' | tee "test/$$f.correct"; \ + done diff --git a/compiler/elymasAsm.ey b/compiler/elymasAsm.ey index 390329a..f3a655e 100644 --- a/compiler/elymasAsm.ey +++ b/compiler/elymasAsm.ey @@ -234,6 +234,16 @@ dst src modrm11 } /cmovaqRegReg deff + { ==dst ==src + src bit64assert + dst bit64assert + + 1 dst /none src rex + %0F + %43 + dst src modrm11 + } /cmovaeqRegReg deff + { %A6 } /cmpsb deff @@ -272,6 +282,18 @@ i imm8 } /cmpqImm8Reg deff + { ==mem ==disp ==i + mem bit64assert + disp 128 lt assert + i 256 lt assert + + 1 /none /none mem rex + %83 + /seven mem modrm01 + disp imm8 + i imm8 + } /cmpqImm8MemDisp8 deff + { ==reg ==mem ==idx reg bit64assert mem bit64assert @@ -378,7 +400,7 @@ { ==mem ==disp ==i mem bit64assert - disp 256 lt assert + disp 128 lt assert i 256 lt assert mem regno %07 gt { 0 /none /none mem rex } rep diff --git a/compiler/elymasAsmLib.ey b/compiler/elymasAsmLib.ey index 62f48c6..f823c45 100644 --- a/compiler/elymasAsmLib.ey +++ b/compiler/elymasAsmLib.ey @@ -337,6 +337,20 @@ [ /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 :cmovaeqRegReg + ] makeArith /eygt defv + [ + /rdi /rdi :xorqRegReg + 1 /rsi :movqImmReg + /rdx /rcx :cmpqRegReg + /rsi /rdx :movqRegReg + /rdi /rdx :cmovaqRegReg + ] makeArith /eyge defv { ==activation # create a new entry in the current scope for the given name @@ -542,6 +556,16 @@ :retn ] /ey-- defv + # duplicate top stack element + [ + /rax :popqReg + /rcx :popqReg + /rcx :pushqReg + /rcx :pushqReg + /rax :pushqReg + :retn + ] /ey_ defv + # top stack element is a string defining a stack shuffle # 0-9: push the thusly numbered element # *: execute top element @@ -645,6 +669,46 @@ 8 /r15 :addqImm8Reg :retn ] :labelResolve /eyrep defv + + # a normal loop + # 0 -> second part of loop + # 1 -> first part of loop + # execute first part, if top of stack is nonzero, execute second part, repeat + [ + 8 /r15 :subqImm8Reg + /r15 :popqMem + + 8 /r15 :subqImm8Reg + /r15 :popqMem + + 8 /r15 :subqImm8Reg + /r15 :popqMem + + # /r15 -> first part + # 8 /r15 -> second part + + @loop + /r15 :pushqMem + |ey* /rax :movqImmReg + /rax :callqReg + + /rax :popqReg + 0 8 /rax :cmpqImm8MemDisp8 + /end :jzLbl8 + + 8 /r15 :pushqMemDisp8 + |ey* /rax :movqImmReg + /rax :callqReg + /loop :jmpLbl8 + + @end + + 16 /r15 :addqImm8Reg + + /r15 :pushqMem + 8 /r15 :addqImm8Reg + :retn + ] :labelResolve /eyloop defv > _ ==globalFunctions2 { defv }' allocateOffsetStruct < |
