aboutsummaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
authorDrahflow <drahflow@gmx.de>2013-01-19 13:35:47 +0100
committerDrahflow <drahflow@gmx.de>2013-01-19 13:35:47 +0100
commitf630deeb77bbfab3d262a172696621ff840dc621 (patch)
tree311ded1ae7dc912e24a4d26bdf46e0105f293fc9 /compiler
parentb7a44c57268d42b1abb40b0faea1bd2cc071894f (diff)
loop now working
Diffstat (limited to 'compiler')
-rw-r--r--compiler/Makefile33
-rw-r--r--compiler/elymasAsm.ey24
-rw-r--r--compiler/elymasAsmLib.ey64
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 "Success."; \
+ else \
+ echo "Failed."; \
+ 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
<