--- /dev/null
+/* unvollendet
--- /dev/null
+method foo(x,y)
+end;
--- /dev/null
+method x()
+ this:=x;
+end;
--- /dev/null
+method x()
+ x:=x-x*x;
+end;
--- /dev/null
+method x()
+ if x<x or x=x then
+ end;
+end;
--- /dev/null
+method x()
+ x := x < x < x;
+end;
--- /dev/null
+method x()
+ x:=x(,x);
+end;
--- /dev/null
+method x()
+ var x.x:=x;
+end;
--- /dev/null
+method x()
+ ;
+end;
--- /dev/null
+method x()
+ x(x,,);
+end;
--- /dev/null
+method x()
+ x.this = x;
+end;
--- /dev/null
+method m()
+ return x;
+end;
--- /dev/null
+method m(x x)
+end;
--- /dev/null
+method m(x)
+ if x then
+ var x:=0;
+ end;
+end;
--- /dev/null
+method m()
+ while this do
+ var x:=this;
+ if this then
+ else
+ var x:=this;
+ end;
+ end;
+end;
+
--- /dev/null
+struct
+ a
+ a
+end;
--- /dev/null
+struct
+ a
+end;
+
+struct
+ a
+end;
--- /dev/null
+method m()
+ if this then
+ var x:=this;
+ else
+ return x;
+ end;
+end;
--- /dev/null
+method m()
+ x:=this;
+ var x:=0;
+end;
--- /dev/null
+method m()
+ a:=this;
+end;
+
+struct
+ a
+end;
--- /dev/null
+method m()
+ var x:=x;
+end;
--- /dev/null
+method m(x)
+ return this.x;
+end;
--- /dev/null
+struct a d end;
+method f(b c s)
+ var t := 0;
+ /* lesender feldzugriff */
+ b := c*(s.a - 1);
+ b := c*(s.d - 1);
+ b := c*(t.a - 1);
+ /* Zusatz zu lewurm_05.0: ungültig, da c keine Feldvariable ist */
+ b := c*(t.c - 1);
+end;
--- /dev/null
+method test(arg1)
+ arg1.a := 10; /* undefined field */
+end;
+
+struct a end;
--- /dev/null
+method test(arg1)
+ var b := arg1.a; /* undefined field */
+end;
+
+struct a end;
--- /dev/null
+/* multiple field definition on "doubletrouble" here */
+struct doubletrouble foo end;
+method test(a b c)
+end;
+struct bar doubletrouble end;
--- /dev/null
+/* multiple variable definition in param list */
+method test(a b c a)
+end;
--- /dev/null
+/* fieldnames are NOT visible everywhere, but only after their definition */
+method foobar(a)
+ a.youdontseemeyet := 31337;
+end;
+
+struct youdontseemeyet end;
--- /dev/null
+method f(a b c)
+ /* x nicht deklariert */
+ if a < x then
+ c := 0x1;
+ end;
+end;
--- /dev/null
+method f(a b c)
+ if a < b then
+ var x := 0;
+ c := 1;
+ end;
+ /* x ist nicht im scope */
+ x := x - 1;
+end;
--- /dev/null
+method f(a b c)
+ /* x ist (noch) nicht im scope */
+ var x := x - 1;
+end;
--- /dev/null
+method f(b)
+ var t := 0;
+ /* identifier doppelt vorhanden */
+ var b := 0;
+end;
--- /dev/null
+struct mystruct
+end
--- /dev/null
+method testit()
+ var b := 10 - d * 20; /* should raise an error, since '(' ')' are missing */
+end;
--- /dev/null
+method abc(arg1 arg2)
+ if arg1 = arg2 then
+ var a := 42;
+ end;
+
+ var b := a - -1;
+end;
--- /dev/null
+struct a b c end;
+method test(arg1 arg2)
+ arg1.a := 10;
+end;
+
+struct c d e end;
--- /dev/null
+method abc(arg1 arg2)
+ var arg2 := 10; /* detect duplicates and fail */
+end;
--- /dev/null
+struct
+ a b c
+end;
+
+method bar(d e f)
+ var foo := a;
+ foo := b - c;
+ var bar := d - (e * f);
+
+ if(4 = 2) then
+ var x := 1;
+ var hiho := 0;
+ else
+ var hiho := 0x1f;
+ end;
+
+ var hiho := 2;
+
+ while 0 < hiho do
+ if (42) then
+ var hiho := 0xff; /* hiho existiert bereits */
+ hiho := hiho - 1;
+ end;
+ end;
+
+ return 0;
+end;
+
+struct
+ g
+ h
+end;
--- /dev/null
+struct
+ a b c
+end;
+
+method bar(d e f)
+ var foo := a;
+ foo := b - c;
+ var bar := d - (e * f);
+
+ if(4 = 2) then
+ var x := 1;
+ var hiho := 0;
+ else
+ var hiho := 0x1f;
+ end;
+
+ var hiho := 2;
+
+ while 0 < hiho do
+ if (42) then
+ hiho := hiho - 1;
+ else
+ hiho := hiho - (0 - g); /* g existiert noch nicht */
+ end;
+ end;
+
+ return 0;
+end;
+
+struct
+ g
+ h
+end;
--- /dev/null
+struct
+ a b c
+end;
+
+method bar(d e f)
+ var foo := a;
+ foo := b - c;
+ var bar := d - (e * f);
+
+ if(4 = 2) then
+ var x := 1;
+ var hiho := 0;
+ else
+ var hiho := 0x1f;
+ end;
+
+ var hiho := 2;
+
+ while 0 < hiho do
+ if (42) then
+ hiho := hiho - 1;
+ else
+ hiho := hiho - (0 - a);
+ end;
+ end;
+
+ var e := 22; /* e existiert bereits */
+ return 0;
+end;
+
+struct
+ g
+ h
+end;
--- /dev/null
+struct
+ a b c
+end;
+
+method bar(d e f)
+ var foo := a;
+ foo := b - c;
+ var bar := d - (e * f);
+
+ if(4 = 2) then
+ var x := 1;
+ var hiho := 0;
+ else
+ var hiho := 0x1f;
+ end;
+
+ if(9 < 8) then
+ var hohi := 12;
+ else
+ var hiho := 2;
+ end;
+
+
+ return hiho; /* hiho existiert nicht */
+end;
+
+struct
+ g
+ h
+end;
--- /dev/null
+struct g1 g2 g3 g4 end;
+struct g5 g6 end;
+
+method foo(p1 p2 p3)
+ var l1 := 0;
+ var l2 := g6;
+
+ g1.g2.l1 := 0xDEAD; /* l1 kein feld */
+end;
--- /dev/null
+struct g1 g2 g3 g4 end;
+struct g5 g6 end;
+
+method foo(p1 p2 p3)
+ var l1 := 0;
+ var l2 := g6;
+
+ g1.g2.p1 := 0xDEAD; /* p1 kein feld */
+end;
--- /dev/null
+struct g1 g2 g3 g4 end;
+struct g5 g6 end;
+
+method foo(p1 p2 p3)
+ var l1 := 0;
+ var l2 := g6;
+
+ g1.l2.g2 := 0xDEAD; /* l2 kein feld */
+end;
--- /dev/null
+struct g1 g2 g3 g4 end;
+struct g5 g6 end;
+
+method foo(p1 p2 p3)
+ var l1 := 0;
+ var l2 := g6;
+
+ g1.p3.g6:= 0xDEAD; /* p3 kein feld */
+end;
--- /dev/null
+struct
+ one struct_not defined
+end;
+
+method main(a b)
+ var something := 0x42;
+ var the := 0x42;
+ the.one.missing_struct := something;
+end;
--- /dev/null
+method foo ( )
+ if 1 then
+ var v1 := 1;
+ else
+ v1 := 2;
+ end;
+end;
--- /dev/null
+method foo ( p1 )
+ var p1 := 1;
+end;
--- /dev/null
+method foo ( )
+ if 1 then
+ var v1 := 1;
+ end;
+
+ return v1;
+end;
--- /dev/null
+method foo ( )
+ v1 := 1;
+ var v1 := 1;
+ return v1;
+end;
--- /dev/null
+struct f1 end;
+
+method foo ( )
+
+ var v1 := 1;
+
+ /* Bei einem Variablen/Feldzugriff muss eine Variable oder ein Feld mit dem Namen sichtbar sein */
+ f1 := f1;
+ v1 := v1;
+
+ /* Bei einem Feldzugriff muss ein Feld mit dem Namen sichtbar sein */
+ this.f1 := this.f1;
+ this.v1 := this.v1;
+
+ return v1;
+end;
--- /dev/null
+method f(a b c)
+ return (a*5) - (b*c) - this;
+end;
+
+/*verschachtelte mult*/
+method g(a b)
+ return (a * (b * (-4))) - this;
+end;
--- /dev/null
+long f(long, long, long, long);
+long g(long, long, long);
+
+RET(f(1, 100, 10, 5)==449 && g(5, -2, 7) == 51);
--- /dev/null
+method f(a)
+ return (a*a) * (2-3) * this * (3 * (2-3));
+end;
--- /dev/null
+long f(long, long);
+
+
+
+
+
+RET(f(9, 15) == 6075);
+
+
--- /dev/null
+method f(a b)
+ return ((this or 2) or (a or b)) - 10;
+end;
\ No newline at end of file
--- /dev/null
+long f(long, long, long);
+
+RET(f(1, 8, 16) == 17);
+
--- /dev/null
+method f(a b c)
+ return (a < (b < c)) * this;
+end;
+
--- /dev/null
+long f(long, long, long, long);
+
+
+RET(f(3, -2, 0, 15) == 3);
+
+
+
--- /dev/null
+method g(a b)
+ return a = b;
+end;
--- /dev/null
+long g(long, long, long);
+
+RET(g(0, -2, -2) == 1 && g(0, 1, 3) == 0);
--- /dev/null
+struct x y z b end;
+
+method f(a b)
+ return b;
+end;
+
+struct u v end;
+
+method g(a)
+ return u * a.v;
+end;
--- /dev/null
+extern long long f(long long*, long long*, long long);
+extern long long g(long long*, long long*);
+
+
+long long ar[10];
+long long ar2[10];
+int i = 1;
+for(; i <= 10; i++)
+ ar[i-1] = i;
+for (i = 1; i <= 10; i++)
+ ar2[i-1] = i * 10;
+
+RET(f(ar, ar, 4711) == 4711 && g(ar, ar2) == 20);
--- /dev/null
+struct x y z end;
+
+method f()
+ return (x - y) * z;
+end;
--- /dev/null
+extern long long f(long long*);
+
+
+long long ar[10];
+int i = 1;
+for(; i <= 10; i++)
+ ar[i-1] = i;
+
+RET(f(ar) == -3);
--- /dev/null
+struct x y z end;
+
+method f(a)
+ return (a - (-3*8)).y;
+end;
--- /dev/null
+extern long long f(long long*, long long*);
+
+long long ar[10];
+int i = 1;
+for(; i <= 10; i++)
+ ar[i-1] = i;
+
+RET(f(ar, ar) == 5);
--- /dev/null
+struct x y z end;
+
+method f(a)
+ return a.y - a.x - a.z;
+end;
--- /dev/null
+extern long long f(long long*, long long*);
+
+long long ar[10];
+int i = 1;
+for(; i <= 10; i++)
+ ar[i-1] = i;
+
+RET(f(ar, ar) == -2);
--- /dev/null
+method f(a b c)
+ return (a-5) - (b-c) - this;
+end;
--- /dev/null
+long f(long, long, long, long);
+
+RET(f(1, 100, 10, 5) == 89);
--- /dev/null
+method f(x)
+ return x;
+end;
--- /dev/null
+extern long f(long, long);
+RET((f(0xDEAD, 5)==5) && (f(0xDEAD, -3)==-3));
--- /dev/null
+method f(a b c d)
+ return this-(a-b-c-d);
+end;
--- /dev/null
+extern long f(long,long,long,long,long);
+RET(f(100,50,15,10,5)==80);
--- /dev/null
+method f()
+ return this;
+end;
--- /dev/null
+extern long f(long);
+RET(f(-1337)==-1337);
--- /dev/null
+method f()
+ return 666-this;
+end;
--- /dev/null
+extern long f(long);
+RET(f(111)==555);
--- /dev/null
+method Long(a b c d e)
+ return e - d - c - b - a - this;
+end;
--- /dev/null
+long Long(long, long, long, long, long, long);
+
+RET( Long(2, 6, 12, 25, 50, 100) == 5);
--- /dev/null
+method f(a b)
+ return a - ( b * -1 * a * -1 * b * -1 * -4 );
+end;
--- /dev/null
+long f(long, long, long);
+RET(f(0xCAFEBABE, 20, 10)==-7980);
--- /dev/null
+method w(a)
+ return this < a;
+end;
+
+method x()
+ return this < 3;
+end;
+
+method y()
+ return 3 < this;
+end;
+
+method z()
+ return 3 < 3;
+end;
+
+method override()
+ return 0x55555;
+end;
--- /dev/null
+long w(long,long);
+long x(long);
+long y(long);
+long z(long);
+long override(long);
+
+RET(w(20,30)==1 && override(0x1)==0x55555 && w(30,20)==0 && override(1)==0x55555 && x(400)==0 && override(0x1)==0x55555 && y(400)==1 && override(0x1)==0x55555 && z(400)==0 && override(0x1)==0x55555);
--- /dev/null
+method w(a)
+ return this = a;
+end;
+
+method x()
+ return this = 3;
+end;
+
+method y()
+ return 3 = this;
+end;
+
+method z()
+ return -13 = -13;
+end;
+
+method override()
+ return 0x55555;
+end;
--- /dev/null
+long w(long,long);
+long x(long);
+long y(long);
+long z(long);
+long override(long);
+
+RET(w(30,30)==1 && override(0x1)==0x55555 && w(30,20)==0 && override(1)==0x55555 && x(400)==0 && override(0x1)==0x55555 && y(3)==1 && override(0x1)==0x55555 && z(400)==1 && override(0x1)==0x55555);
--- /dev/null
+struct j k l end;
+method w()
+ return this.k;
+end;
+
+method x()
+ return l;
+end;
+
+method y()
+ return (this-8).k;
+end;
--- /dev/null
+long w(long);
+long x(long);
+long y(long);
+
+long t[3] = {5,6,7};
+RET(w((long)t)==6 && x((long)t)==7 && y((long)t)==5);
--- /dev/null
+method w()
+ return not this;
+end;
+
+method x()
+ return not (not this);
+end;
+
+method y()
+ return not (not (not this));
+end;
--- /dev/null
+long w(long);
+long x(long);
+long y(long);
+
+RET(w(0)==1 && x(0)==0 && y(1)==0);
--- /dev/null
+struct a b c end;
+
+method try0()
+ return 0x00100000.c;
+end;
+
+method try1()
+ return 0x01000000.c;
+end;
+
+method try2()
+ return 0xA0000000.c;
+end;
--- /dev/null
+#define TRIES 3
+
+/* ugly. copied from 'bits/mman.h' */
+#define PROT_READ 0x1
+#define PROT_WRITE 0x2
+#define MAP_PRIVATE 0x02
+#define MAP_FIXED 0x10
+#define MAP_ANONYMOUS 0x20
+
+void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
+
+long try0(long);
+long try1(long);
+long try2(long);
+
+/* try these adresses until one is free */
+long *tries[TRIES] = {
+ (long *)0x00100000,
+ (long *)0x01000000,
+ (long *)0xA0000000
+};
+
+int t = 0;
+long *addr = NULL;
+
+for (t = 0; t < TRIES; t++) {
+ addr = mmap(tries[t], 4096, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
+
+ if (tries[t] == addr)
+ break;
+}
+
+if ((void *)-1 == addr) {
+ puts("unable to map memory");
+ RET(1); /* keep the statistic clean */
+}
+
+addr[2] = 1337;
+
+switch (t) {
+case 0: RET(try0(0xcafebabe) == 1337);
+case 1: RET(try1(0xcafebabe) == 1337);
+case 2: RET(try2(0xcafebabe) == 1337);
+}
+
--- /dev/null
+method f1()
+ return (this*2*3)*1;
+end;
+method f2()
+ return (this)*1;
+end;
+method f3()
+ return this*1;
+end;
+method f4()
+ return (this*1)*(this*1)*1;
+end;
--- /dev/null
+long f1(long);
+long f2(long);
+long f3(long);
+long f4(long);
+RET((f1(4) == 24) &&
+ (f2(4) == 4) &&
+ (f3(4) == 4));
--- /dev/null
+method f1()
+ return (this-0-0)-0-0-6;
+end;
+method f2()
+ return (this)-0;
+end;
+method f3()
+ return this-0;
+end;
--- /dev/null
+long f1(long);
+long f2(long);
+long f3(long);
+RET((f1(4) == -2) &&
+ (f2(4) == 4) &&
+ (f3(4) == 4));
--- /dev/null
+struct foo bar end;
+
+method f1(a b)
+ return a.foo * 5;
+end;
+
+method f2(a b)
+ return b.foo - (100 - a.foo);
+end;
+
+method f3(a b)
+ return b.foo - (100 - 50 - a.foo);
+end;
+
+method f4(a b)
+ return a.foo * a.bar;
+end;
+
+method f5(a b)
+ return b.foo - (100 - a.foo - b.foo);
+end;
--- /dev/null
+long f1(long, long*, long*);
+long f2(long, long*, long*);
+long f3(long, long*, long*);
+long f4(long, long*, long*);
+long f5(long, long*, long*);
+
+long muh[] = {0x05f05f, 0x223344};
+long kuh[] = {0x00AACC, 0x563425};
+
+RET(f1(0, muh, kuh) == muh[0] * 5 &&
+ f2(0, muh, kuh) == kuh[0] - (100 - muh[0]) &&
+ f3(0, muh, kuh) == kuh[0] - (100 - 50 - muh[0]) &&
+ f5(0, muh, kuh) == kuh[0] - (100 - muh[0] - kuh[0]) &&
+ f4(0, muh, kuh) == muh[0] * muh[1]
+ );
--- /dev/null
+struct
+ u v w x y z
+end;
+
+method f(a)
+ return u;
+end;
+
--- /dev/null
+long f(long *, long *);
+
+long v[] = { 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF };
+
+RET(f(v, NULL) == v[0]);
+
--- /dev/null
+struct
+ u v w x y z
+end;
+
+method f(a)
+ return this.u;
+end;
+
--- /dev/null
+long f(long *, long *);
+
+long v[] = { 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF };
+
+RET(f(v, NULL) == v[0]);
+
--- /dev/null
+struct
+ u v w x y z
+end;
+
+method f(a)
+ return v;
+end;
+
--- /dev/null
+long f(long *, long *);
+
+long v[] = { 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF };
+
+RET(f(v, NULL) == v[1]);
+
--- /dev/null
+struct
+ u v w x y z
+end;
+
+method f(a)
+ return w;
+end;
+
--- /dev/null
+long f(long *, long *);
+
+long v[] = { 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF };
+
+RET(f(v, NULL) == v[2]);
+
--- /dev/null
+struct
+ u v w x y z
+end;
+
+method f(a)
+ return x;
+end;
+
--- /dev/null
+long f(long *, long *);
+
+long v[] = { 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF };
+
+RET(f(v, NULL) == v[3]);
+
--- /dev/null
+struct
+ u v w x y z
+end;
+
+method f(a)
+ return this.x;
+end;
+
--- /dev/null
+long f(long *, long *);
+
+long v[] = { 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF };
+
+RET(f(v, NULL) == v[3]);
+
--- /dev/null
+struct
+ u v w x y z
+end;
+
+method f(a)
+ return a.v;
+end;
+
--- /dev/null
+long f(long *, long *);
+
+long v[] = { 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF };
+
+RET(f(NULL, v) == v[1]);
+
--- /dev/null
+struct
+ u v w x y z
+end;
+
+method f(a)
+ return a.w;
+end;
+
--- /dev/null
+long f(long *, long *);
+
+long v[] = { 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF };
+
+RET(f(NULL, v) == v[2]);
+
--- /dev/null
+struct
+ u v w x y z
+end;
+
+method f(a)
+ return (a - (-8 * 4) ).v;
+end;
+
--- /dev/null
+long f(long *, long *);
+
+long v[] = { 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF };
+
+RET(f(NULL, v) == v[5]);
+
--- /dev/null
+method f(a b)
+ return a - b;
+end;
--- /dev/null
+long f(long, long, long);
+
+RET(f(0, 20, 10) == 10 &&
+ f(0, 10, 20) == -10);
--- /dev/null
+method f(a b)
+ return 20 - b;
+end;
--- /dev/null
+long f(long, long, long);
+
+RET(f(0, 0, 10) == 10 &&
+ f(0, 0, 20) == 0 &&
+ f(0, 0, 30) == -10);
--- /dev/null
+method f(a b)
+ return b - 20;
+end;
--- /dev/null
+long f(long, long, long);
+
+RET(f(0, 0, 10) == -10 &&
+ f(0, 0, 20) == 0 &&
+ f(0, 0, 30) == 10);
--- /dev/null
+method f(a b)
+ return a - (10 - b) - 20;
+end;
--- /dev/null
+long f(long, long, long);
+
+RET(f(0, 10, 20) == (10 - (10 - 20) - 20) &&
+ f(0, 40, 20) == (40 - (10 - 20) - 20) &&
+ f(0, 0, 30) == ( 0 - (10 - 30) - 20));
--- /dev/null
+method f1(a b)
+ return a - (-1 * b);
+end;
+
+method f2(a b)
+ return a - (-2 * b);
+end;
+
+method f4(a b)
+ return a - (-4 * b);
+end;
+
+method f8(a b)
+ return a - (-8 * b);
+end;
+
+method f(a b c d)
+ return a - (-8 * (b - (-4 * (c - (-2 * d)))));
+end;
--- /dev/null
+#define F1(a,b) ((long)(a) - (-1UL * (long)(b)))
+#define F2(a,b) ((long)(a) - (-2UL * (long)(b)))
+#define F4(a,b) ((long)(a) - (-4UL * (long)(b)))
+#define F8(a,b) ((long)(a) - (-8UL * (long)(b)))
+#define F(a,b,c,d) ((long)(a) - (-8UL * ((long)(b) - (-4UL * ((long)(c) - (-2UL * (long)(d)))))))
+
+long f1(long, long, long);
+long f2(long, long, long);
+long f4(long, long, long);
+long f8(long, long, long);
+long f(long, long, long, long, long);
+
+RET(f1(0, 3, 20) == F1( 3, 20) &&
+ f1(0, -100, 80) == F1(-100, 80) &&
+ f1(0, 50, -9) == F1( 50, -9) &&
+ f1(0, -77, -50) == F1( -77, -50) &&
+
+ f2(0, 3, 20) == F2( 3, 20) &&
+ f2(0, -100, 80) == F2(-100, 80) &&
+ f2(0, 50, -9) == F2( 50, -9) &&
+ f2(0, -77, -50) == F2( -77, -50) &&
+
+ f4(0, 3, 20) == F4( 3, 20) &&
+ f4(0, -100, 80) == F4(-100, 80) &&
+ f4(0, 50, -9) == F4( 50, -9) &&
+ f4(0, -77, -50) == F4( -77, -50) &&
+
+ f8(0, 3, 20) == F8( 3, 20) &&
+ f8(0, -100, 80) == F8(-100, 80) &&
+ f8(0, 50, -9) == F8( 50, -9) &&
+ f8(0, -77, -50) == F8( -77, -50) &&
+
+ f(0, 10, 20, 30, 40) == F( 10, 20, 30, 40) &&
+ f(0, -10, 20, -30, 40) == F(-10, 20, -30, 40) &&
+ f(0, 10, -20, 30, -40) == F( 10, -20, 30, -40) &&
+ f(0, -10, -20, -30, -40) == F(-10, -20, -30, -40) &&
+
+ f1(0, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) ==
+ F1(0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) &&
+ f2(0, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) ==
+ F2(0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) &&
+ f4(0, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) ==
+ F4(0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) &&
+ f8(0, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) ==
+ F8(0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) &&
+
+ f1(0, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) ==
+ F1(0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) &&
+ f2(0, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) ==
+ F2(0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) &&
+ f4(0, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) ==
+ F4(0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) &&
+ f8(0, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) ==
+ F8(0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL));
+
--- /dev/null
+method f1(a b)
+ return a - (b * -1);
+end;
+
+method f2(a b)
+ return a - (b * -2);
+end;
+
+method f4(a b)
+ return a - (b * -4);
+end;
+
+method f8(a b)
+ return a - (b * -8);
+end;
+
+method f(a b c d)
+ return a - ((b - ((c - (d * -2)) * -4)) * -8);
+end;
--- /dev/null
+#define F1(a,b) ((long)(a) - (-1UL * (long)(b)))
+#define F2(a,b) ((long)(a) - (-2UL * (long)(b)))
+#define F4(a,b) ((long)(a) - (-4UL * (long)(b)))
+#define F8(a,b) ((long)(a) - (-8UL * (long)(b)))
+#define F(a,b,c,d) ((long)(a) - (-8UL * ((long)(b) - (-4UL * ((long)(c) - (-2UL * (long)(d)))))))
+
+long f1(long, long, long);
+long f2(long, long, long);
+long f4(long, long, long);
+long f8(long, long, long);
+long f(long, long, long, long, long);
+
+RET(f1(0, 3, 20) == F1( 3, 20) &&
+ f1(0, -100, 80) == F1(-100, 80) &&
+ f1(0, 50, -9) == F1( 50, -9) &&
+ f1(0, -77, -50) == F1( -77, -50) &&
+
+ f2(0, 3, 20) == F2( 3, 20) &&
+ f2(0, -100, 80) == F2(-100, 80) &&
+ f2(0, 50, -9) == F2( 50, -9) &&
+ f2(0, -77, -50) == F2( -77, -50) &&
+
+ f4(0, 3, 20) == F4( 3, 20) &&
+ f4(0, -100, 80) == F4(-100, 80) &&
+ f4(0, 50, -9) == F4( 50, -9) &&
+ f4(0, -77, -50) == F4( -77, -50) &&
+
+ f8(0, 3, 20) == F8( 3, 20) &&
+ f8(0, -100, 80) == F8(-100, 80) &&
+ f8(0, 50, -9) == F8( 50, -9) &&
+ f8(0, -77, -50) == F8( -77, -50) &&
+
+ f(0, 10, 20, 30, 40) == F( 10, 20, 30, 40) &&
+ f(0, -10, 20, -30, 40) == F(-10, 20, -30, 40) &&
+ f(0, 10, -20, 30, -40) == F( 10, -20, 30, -40) &&
+ f(0, -10, -20, -30, -40) == F(-10, -20, -30, -40) &&
+
+ f1(0, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) ==
+ F1(0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) &&
+ f2(0, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) ==
+ F2(0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) &&
+ f4(0, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) ==
+ F4(0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) &&
+ f8(0, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) ==
+ F8(0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) &&
+
+ f1(0, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) ==
+ F1(0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) &&
+ f2(0, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) ==
+ F2(0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) &&
+ f4(0, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) ==
+ F4(0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) &&
+ f8(0, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) ==
+ F8(0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL));
+
--- /dev/null
+method f(a b)
+ return (a or 0x0A) or (0x50 or b);
+end;
--- /dev/null
+long f(long, long, long);
+
+RET(f(0, 0x00, 0x00) == 0x5A);
+
--- /dev/null
+method f(a b)
+ return (a = 0x0A) = (0x50 = b);
+end;
--- /dev/null
+long f(long, long, long);
+
+RET(f(0, 0x00, 0x00) == 1 &&
+ f(0, 0x0A, 0xFF) == 0 &&
+ f(0, 0xFF, 0x50) == 0 &&
+ f(0, 0x0A, 0x50) == 1);
+
--- /dev/null
+method f(a)
+ return (a < 0x0A);
+end;
+
+method g(a)
+ return (0x0A < a);
+end;
+
+method h()
+ return (0x0A < 0x09);
+end;
+
+method i()
+ return (0x0A < 0x0B);
+end;
+
--- /dev/null
+long f(long, long);
+long g(long, long);
+long h(long);
+long i(long);
+
+RET(f(0, 0x05) == 1 &&
+ f(0, -0x05) == 1 &&
+ f(0, 0x0A) == 0 &&
+ f(0, 0x0B) == 0 &&
+
+ g(0, 0x05) == 0 &&
+ g(0, -0x05) == 0 &&
+ g(0, 0x0A) == 0 &&
+ g(0, 0x0B) == 1 &&
+
+ h(0) == 0 &&
+ i(0) == 1);
+
--- /dev/null
+method w()
+ return not this;
+end;
+
+method x()
+ return not (not this);
+end;
+
+method y()
+ return not (not (not this));
+end;
--- /dev/null
+long w(long);
+long x(long);
+long y(long);
+
+RET(w(6)==0 && x(4)==1 && y(8)==0 && w(5) == 0 && x(3) == 1 && y(7) == 0 && w(0) == 1 && x(0) == 0 && y(0) == 1);
--- /dev/null
+method w()
+ return not 0;
+end;
+
+method x()
+ return not (not 0);
+end;
+
+method y()
+ return not 3;
+end;
+
+method z()
+ return not (not 3);
+end;
+
+method aa()
+ return not (not (not 0));
+end;
+
+method ab()
+ return not (not (not 3));
+end;
--- /dev/null
+long w(long);
+long x(long);
+long y(long);
+long z(long);
+long aa(long);
+long ab(long);
+
+RET(w(0xDEAD)==1 && x(1337)==0 && y(42)==0 && z(3141) == 1 && aa(0xabc) == 1 && ab(0xdef) == 0);
--- /dev/null
+method w(a)
+ return not a;
+end;
+
+method x(a)
+ return not (not a);
+end;
+
+method y(a)
+ return not (not (not a));
+end;
--- /dev/null
+long w(long,long);
+long x(long,long);
+long y(long,long);
+
+RET(w(6,6)==0 && x(4,4)==1 && y(8,8)==0 && w(5,5) == 0 && x(3,3) == 1 && y(7,7) == 0 && w(0,0) == 1 && x(0,0) == 0 && y(0,0) == 1);
--- /dev/null
+struct a b c end;
+
+method try0()
+ return (0x000FFFFB - -5).c;
+end;
+
+method try1()
+ return (0x00FFFFFD - -3).c;
+end;
+
+method try2()
+ return (0x9FFFFFFB - -5).c;
+end;
--- /dev/null
+#define TRIES 3
+
+/* ugly. copied from 'bits/mman.h' */
+#define PROT_READ 0x1
+#define PROT_WRITE 0x2
+#define MAP_PRIVATE 0x02
+#define MAP_FIXED 0x10
+#define MAP_ANONYMOUS 0x20
+
+void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
+
+long try0(long);
+long try1(long);
+long try2(long);
+
+/* try these adresses until one is free */
+long *tries[TRIES] = {
+ (long *)0x00100000,
+ (long *)0x01000000,
+ (long *)0xA0000000
+};
+
+int t = 0;
+long *addr = NULL;
+
+for (t = 0; t < TRIES; t++) {
+ addr = mmap(tries[t], 4096, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
+
+ if (tries[t] == addr)
+ break;
+}
+
+if ((void *)-1 == addr) {
+ puts("unable to map memory");
+ RET(1); /* keep the statistic clean */
+}
+
+addr[2] = 1337;
+
+printf("try %d\n", t);
+
+switch (t) {
+case 0: RET(try0(0xcafebabe) == 1337);
+case 1: RET(try1(0xcafebabe) == 1337);
+case 2: RET(try2(0xcafebabe) == 1337);
+}
+
--- /dev/null
+method f1(a b)
+ return a - (-3 * b);
+end;
+
+method f2(a b)
+ return a - (2 * b);
+end;
+
+method f3(a b)
+ return a - (5 * b);
+end;
+
+method f(a b c d)
+ return a - (8 * (b - (-4 * (c - (-3 * d)))));
+end;
--- /dev/null
+#define F1(a,b) ((long)(a) - (-3UL * (long)(b)))
+#define F2(a,b) ((long)(a) - (2UL * (long)(b)))
+#define F3(a,b) ((long)(a) - (5UL * (long)(b)))
+#define F(a,b,c,d) ((long)(a) - (8UL * ((long)(b) - (-4UL * ((long)(c) - (-3UL * (long)(d)))))))
+
+/* based on mrstrcmp_13
+ in our language the lea opts are only possible for -1, -2, -4 and -8
+ this testcase tests other constants
+*/
+
+long f1(long, long, long);
+long f2(long, long, long);
+long f3(long, long, long);
+long f(long, long, long, long, long);
+
+RET(f1(0, 3, 20) == F1( 3, 20) &&
+ f1(0, -100, 80) == F1(-100, 80) &&
+ f1(0, 50, -9) == F1( 50, -9) &&
+ f1(0, -77, -50) == F1( -77, -50) &&
+
+ f2(0, 3, 20) == F2( 3, 20) &&
+ f2(0, -100, 80) == F2(-100, 80) &&
+ f2(0, 50, -9) == F2( 50, -9) &&
+ f2(0, -77, -50) == F2( -77, -50) &&
+
+ f3(0, 3, 20) == F3( 3, 20) &&
+ f3(0, -100, 80) == F3(-100, 80) &&
+ f3(0, 50, -9) == F3( 50, -9) &&
+ f3(0, -77, -50) == F3( -77, -50) &&
+
+ f(0, 10, 20, 30, 40) == F( 10, 20, 30, 40) &&
+ f(0, -10, 20, -30, 40) == F(-10, 20, -30, 40) &&
+ f(0, 10, -20, 30, -40) == F( 10, -20, 30, -40) &&
+ f(0, -10, -20, -30, -40) == F(-10, -20, -30, -40) &&
+
+ f1(0, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) ==
+ F1(0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) &&
+ f2(0, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) ==
+ F2(0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) &&
+ f3(0, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) ==
+ F3(0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) &&
+
+ f1(0, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) ==
+ F1(0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) &&
+ f2(0, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) ==
+ F2(0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) &&
+ f3(0, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) ==
+ F3(0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL)
+ );
+
--- /dev/null
+method f1(a b)
+ return (-3 * b) - a;
+end;
+
+method f2(a b)
+ return (2 * b) - a;
+end;
+
+method f3(a b)
+ return (5 * b) - a;
+end;
--- /dev/null
+#define F1(a,b) ((-3UL * (long)(b)) - (long)(a))
+#define F2(a,b) ((2UL * (long)(b)) - (long)(a))
+#define F3(a,b) ((5UL * (long)(b)) - (long)(a))
+
+
+/* based on mrstrcmp_13
+ this testcase tests an other order of ops where no lea is possible
+*/
+
+long f1(long, long, long);
+long f2(long, long, long);
+long f3(long, long, long);
+
+RET(f1(0, 3, 20) == F1( 3, 20) &&
+ f1(0, -100, 80) == F1(-100, 80) &&
+ f1(0, 50, -9) == F1( 50, -9) &&
+ f1(0, -77, -50) == F1( -77, -50) &&
+
+ f2(0, 3, 20) == F2( 3, 20) &&
+ f2(0, -100, 80) == F2(-100, 80) &&
+ f2(0, 50, -9) == F2( 50, -9) &&
+ f2(0, -77, -50) == F2( -77, -50) &&
+
+ f3(0, 3, 20) == F3( 3, 20) &&
+ f3(0, -100, 80) == F3(-100, 80) &&
+ f3(0, 50, -9) == F3( 50, -9) &&
+ f3(0, -77, -50) == F3( -77, -50) &&
+
+ f1(0, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) ==
+ F1(0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) &&
+ f2(0, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) ==
+ F2(0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) &&
+ f3(0, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) ==
+ F3(0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) &&
+
+ f1(0, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) ==
+ F1(0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) &&
+ f2(0, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) ==
+ F2(0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) &&
+ f3(0, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) ==
+ F3(0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL)
+ );
+
--- /dev/null
+method f1(a b)
+ return a - (b * -3);
+end;
+
+method f2(a b)
+ return a - (b * 2);
+end;
+
+method f3(a b)
+ return a - (b * 5);
+end;
+
+method f(a b c d)
+ return a - ((b - ((c - (d * -3)) * -4)) * 8);
+end;
--- /dev/null
+#define F1(a,b) ((long)(a) - ((long)(b) * -3UL))
+#define F2(a,b) ((long)(a) - ((long)(b) * 2UL))
+#define F3(a,b) ((long)(a) - ((long)(b) * 5UL))
+#define F(a,b,c,d) ((long)(a) - (8UL * ((long)(b) - (-4UL * ((long)(c) - (-3UL * (long)(d)))))))
+
+
+/* based on mrstrcmp_14
+ in our language the lea opts are only possible for -1, -2, -4 and -8
+ this testcase tests other constants and other op order in mul
+*/
+
+long f1(long, long, long);
+long f2(long, long, long);
+long f3(long, long, long);
+long f(long, long, long, long, long);
+
+RET(f1(0, 3, 20) == F1( 3, 20) &&
+ f1(0, -100, 80) == F1(-100, 80) &&
+ f1(0, 50, -9) == F1( 50, -9) &&
+ f1(0, -77, -50) == F1( -77, -50) &&
+
+ f2(0, 3, 20) == F2( 3, 20) &&
+ f2(0, -100, 80) == F2(-100, 80) &&
+ f2(0, 50, -9) == F2( 50, -9) &&
+ f2(0, -77, -50) == F2( -77, -50) &&
+
+ f3(0, 3, 20) == F3( 3, 20) &&
+ f3(0, -100, 80) == F3(-100, 80) &&
+ f3(0, 50, -9) == F3( 50, -9) &&
+ f3(0, -77, -50) == F3( -77, -50) &&
+
+ f(0, 10, 20, 30, 40) == F( 10, 20, 30, 40) &&
+ f(0, -10, 20, -30, 40) == F(-10, 20, -30, 40) &&
+ f(0, 10, -20, 30, -40) == F( 10, -20, 30, -40) &&
+ f(0, -10, -20, -30, -40) == F(-10, -20, -30, -40) &&
+
+ f1(0, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) ==
+ F1(0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) &&
+ f2(0, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) ==
+ F2(0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) &&
+ f3(0, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) ==
+ F3(0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) &&
+
+ f1(0, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) ==
+ F1(0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) &&
+ f2(0, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) ==
+ F2(0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) &&
+ f3(0, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) ==
+ F3(0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL)
+ );
--- /dev/null
+method f1(a b c)
+ return a - ((b - c) * -2);
+end;
+
+method f2(a b c)
+ return a - ((b - c) * -3);
+end;
--- /dev/null
+#define F1(a,b,c) ((long)(a) -(((long)(b) - (long)(c)) * -2UL))
+#define F2(a,b,c) ((long)(a) -(((long)(b) - (long)(c)) * -3UL))
+
+
+long f1(long, long, long, long);
+long f2(long, long, long, long);
+
+RET(f1(0, 3, 20, 15) == F1( 3, 20, 15) &&
+ f1(0, -100, 80, 23) == F1(-100, 80, 23) &&
+ f1(0, 50, -9, -5) == F1( 50, -9, -5) &&
+ f1(0, -77, -50, 87) == F1( -77, -50, 87) &&
+
+ f2(0, 3, 20, 15) == F2( 3, 20, 15) &&
+ f2(0, -100, 80, 23) == F2(-100, 80, 23) &&
+ f2(0, 50, -9, -5) == F2( 50, -9, -5) &&
+ f2(0, -77, -50, 87) == F2( -77, -50, 87) &&
+
+ f1(0, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) ==
+ F1(0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) &&
+ f2(0, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) ==
+ F2(0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) &&
+
+ f1(0, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) ==
+ F1(0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) &&
+ f2(0, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) ==
+ F2(0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL)
+ );
+
--- /dev/null
+method f1(a b c)
+ return a - (-2 * (b - c));
+end;
+
+method f2(a b c)
+ return a - (-3 * (b - c));
+end;
--- /dev/null
+#define F1(a,b,c) ((long)(a) -(-2UL * ((long)(b) - (long)(c))))
+#define F2(a,b,c) ((long)(a) -(-3UL * ((long)(b) - (long)(c))))
+
+
+long f1(long, long, long, long);
+long f2(long, long, long, long);
+
+RET(f1(0, 3, 20, 15) == F1( 3, 20, 15) &&
+ f1(0, -100, 80, 23) == F1(-100, 80, 23) &&
+ f1(0, 50, -9, -5) == F1( 50, -9, -5) &&
+ f1(0, -77, -50, 87) == F1( -77, -50, 87) &&
+
+ f2(0, 3, 20, 15) == F2( 3, 20, 15) &&
+ f2(0, -100, 80, 23) == F2(-100, 80, 23) &&
+ f2(0, 50, -9, -5) == F2( 50, -9, -5) &&
+ f2(0, -77, -50, 87) == F2( -77, -50, 87) &&
+
+ f1(0, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) ==
+ F1(0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) &&
+ f2(0, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) ==
+ F2(0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) &&
+
+ f1(0, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) ==
+ F1(0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) &&
+ f2(0, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) ==
+ F2(0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL)
+ );
+
--- /dev/null
+method f1(a b c)
+ return ((b - c) * -2) - a;
+end;
+
+method f2(a b c)
+ return ((b - c) * -3) - a;
+end;
--- /dev/null
+#define F1(a,b,c) ((((long)(b) - (long)(c)) * -2UL) - (long)(a))
+#define F2(a,b,c) ((((long)(b) - (long)(c)) * -3UL) - (long)(a))
+
+
+long f1(long, long, long, long);
+long f2(long, long, long, long);
+
+RET(f1(0, 3, 20, 15) == F1( 3, 20, 15) &&
+ f1(0, -100, 80, 23) == F1(-100, 80, 23) &&
+ f1(0, 50, -9, -5) == F1( 50, -9, -5) &&
+ f1(0, -77, -50, 87) == F1( -77, -50, 87) &&
+
+ f2(0, 3, 20, 15) == F2( 3, 20, 15) &&
+ f2(0, -100, 80, 23) == F2(-100, 80, 23) &&
+ f2(0, 50, -9, -5) == F2( 50, -9, -5) &&
+ f2(0, -77, -50, 87) == F2( -77, -50, 87) &&
+
+ f1(0, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) ==
+ F1(0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) &&
+ f2(0, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) ==
+ F2(0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) &&
+
+ f1(0, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) ==
+ F1(0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) &&
+ f2(0, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) ==
+ F2(0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL)
+ );
+
--- /dev/null
+method f1(a b c)
+ return (-2 * (b - c)) - a;
+end;
+
+method f2(a b c)
+ return (-3 * (b - c)) - a;
+end;
--- /dev/null
+#define F1(a,b,c) ((-2UL * ((long)(b) - (long)(c))) - (long)(a))
+#define F2(a,b,c) ((-3UL * ((long)(b) - (long)(c))) - (long)(a))
+
+
+long f1(long, long, long, long);
+long f2(long, long, long, long);
+
+RET(f1(0, 3, 20, 15) == F1( 3, 20, 15) &&
+ f1(0, -100, 80, 23) == F1(-100, 80, 23) &&
+ f1(0, 50, -9, -5) == F1( 50, -9, -5) &&
+ f1(0, -77, -50, 87) == F1( -77, -50, 87) &&
+
+ f2(0, 3, 20, 15) == F2( 3, 20, 15) &&
+ f2(0, -100, 80, 23) == F2(-100, 80, 23) &&
+ f2(0, 50, -9, -5) == F2( 50, -9, -5) &&
+ f2(0, -77, -50, 87) == F2( -77, -50, 87) &&
+
+ f1(0, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) ==
+ F1(0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) &&
+ f2(0, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) ==
+ F2(0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) &&
+
+ f1(0, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) ==
+ F1(0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) &&
+ f2(0, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) ==
+ F2(0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL)
+ );
+
--- /dev/null
+method f1(a b)
+ return (a - b) - (-3 * b);
+end;
+
+method f2(a b)
+ return (a -b) - (-2 * b);
+end;
--- /dev/null
+#define F1(a,b) (((long)(a) - (long)(b)) - (-3UL * (long)(b)))
+#define F2(a,b) (((long)(a) - (long)(b)) - (-2UL * (long)(b)))
+
+long f1(long, long, long);
+long f2(long, long, long);
+
+RET(f1(0, 3, 20) == F1( 3, 20) &&
+ f1(0, -100, 80) == F1(-100, 80) &&
+ f1(0, 50, -9) == F1( 50, -9) &&
+ f1(0, -77, -50) == F1( -77, -50) &&
+
+ f2(0, 3, 20) == F2( 3, 20) &&
+ f2(0, -100, 80) == F2(-100, 80) &&
+ f2(0, 50, -9) == F2( 50, -9) &&
+ f2(0, -77, -50) == F2( -77, -50) &&
+
+ f1(0, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) ==
+ F1(0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) &&
+ f2(0, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) ==
+ F2(0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) &&
+
+ f1(0, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) ==
+ F1(0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) &&
+ f2(0, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) ==
+ F2(0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL)
+ );
+
--- /dev/null
+method f1(a b)
+ return (a - b) - (b * -3);
+end;
+
+method f2(a b)
+ return (a -b) - (b * -2);
+end;
--- /dev/null
+#define F1(a,b) (((long)(a) - (long)(b)) - ((long)(b) * -3UL))
+#define F2(a,b) (((long)(a) - (long)(b)) - ((long)(b)* -2UL))
+
+long f1(long, long, long);
+long f2(long, long, long);
+
+RET(f1(0, 3, 20) == F1( 3, 20) &&
+ f1(0, -100, 80) == F1(-100, 80) &&
+ f1(0, 50, -9) == F1( 50, -9) &&
+ f1(0, -77, -50) == F1( -77, -50) &&
+
+ f2(0, 3, 20) == F2( 3, 20) &&
+ f2(0, -100, 80) == F2(-100, 80) &&
+ f2(0, 50, -9) == F2( 50, -9) &&
+ f2(0, -77, -50) == F2( -77, -50) &&
+
+ f1(0, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) ==
+ F1(0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) &&
+ f2(0, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) ==
+ F2(0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) &&
+
+ f1(0, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) ==
+ F1(0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) &&
+ f2(0, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) ==
+ F2(0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL)
+ );
+
--- /dev/null
+method f1(a b)
+ return (a - b) - (-3 * (b - a));
+end;
+
+method f2(a b)
+ return (a - b) - (-2 * (b - a));
+end;
--- /dev/null
+#define F1(a,b) (((long)(a) - (long)(b)) - (-3UL * ((long)(b) - (long)(a))))
+#define F2(a,b) (((long)(a) - (long)(b)) - (-2UL * ((long)(b) - (long)(a))))
+
+long f1(long, long, long);
+long f2(long, long, long);
+
+RET(f1(0, 3, 20) == F1( 3, 20) &&
+ f1(0, -100, 80) == F1(-100, 80) &&
+ f1(0, 50, -9) == F1( 50, -9) &&
+ f1(0, -77, -50) == F1( -77, -50) &&
+
+ f2(0, 3, 20) == F2( 3, 20) &&
+ f2(0, -100, 80) == F2(-100, 80) &&
+ f2(0, 50, -9) == F2( 50, -9) &&
+ f2(0, -77, -50) == F2( -77, -50) &&
+
+ f1(0, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) ==
+ F1(0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) &&
+ f2(0, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) ==
+ F2(0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) &&
+
+ f1(0, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) ==
+ F1(0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) &&
+ f2(0, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) ==
+ F2(0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL)
+ );
+
--- /dev/null
+method f1(a b)
+ return (a - b) - ((b - a) * -3);
+end;
+
+method f2(a b)
+ return (a - b) - ((b - a) * -2);
+end;
--- /dev/null
+#define F1(a,b) (((long)(a) - (long)(b)) - (((long)(b) -(long)(a))* -3UL))
+#define F2(a,b) (((long)(a) - (long)(b)) - (((long)(b) -(long)(a))* -2UL))
+
+long f1(long, long, long);
+long f2(long, long, long);
+
+RET(f1(0, 3, 20) == F1( 3, 20) &&
+ f1(0, -100, 80) == F1(-100, 80) &&
+ f1(0, 50, -9) == F1( 50, -9) &&
+ f1(0, -77, -50) == F1( -77, -50) &&
+
+ f2(0, 3, 20) == F2( 3, 20) &&
+ f2(0, -100, 80) == F2(-100, 80) &&
+ f2(0, 50, -9) == F2( 50, -9) &&
+ f2(0, -77, -50) == F2( -77, -50) &&
+
+ f1(0, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) ==
+ F1(0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) &&
+ f2(0, 0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) ==
+ F2(0x7FFFFFFFFFFFFFFFUL, 0x7FFFFFFFFFFFFFFFUL) &&
+
+ f1(0, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) ==
+ F1(0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) &&
+ f2(0, 0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL) ==
+ F2(0x8FFFFFFFFFFFFFFFUL, 0x8FFFFFFFFFFFFFFFUL)
+ );
+
--- /dev/null
+struct foo bar end;
+
+method f1(a b)
+ return 4 or 5;
+end;
+
+method f2(a b)
+ return a.foo or 0x55555555;
+end;
+
+method f3(a b)
+ return 0x55555555 or b.bar;
+end;
+
+method f4(a b)
+ return (a.bar - b.foo) or (a.foo - b.bar);
+end;
+
+method f5(a b)
+ return (a.bar < b.foo) or this;
+end;
+
+method f6(a b)
+ return this or (b.bar = a.foo);
+end;
+
+method f7(a b)
+ return a or b;
+end;
+
+method f8(a b)
+ return this or 0x112233;
+end;
+
+method f9(a b)
+ return 0x11EEEEFF or this;
+end;
+
+method f10(a b)
+ return (a.foo - 5) or 6;
+end;
+
+method f11(a b)
+ return 7 or (b.bar - 3);
+end;
+
+method f12(a b)
+ return (a.bar - 3) or b.foo;
+end;
+
+method f13(a b)
+ return a.foo or (b.bar - -3);
+end;
+
+method f14(a b)
+ return this or a.foo;
+end;
+
+method f15(a b)
+ return b.bar or this;
+end;
+
+method f16(a b)
+ return b.bar or 0;
+end;
+
+method f17(a b)
+ return 0 or a.foo;
+end;
+
+method f18(a b)
+ return 0 or this;
+end;
+
+method f19(a b)
+ return this or 0;
+end;
+
+method f20(a b)
+ return 0 or (b.foo * 1);
+end;
+
+method f21(a b)
+ return (a.foo * 1) or 0;
+end;
--- /dev/null
+#define OR(a,b) ((long)(a) | (long)(b))
+
+long f1(long, long*, long*);
+long f2(long, long*, long*);
+long f3(long, long*, long*);
+long f4(long, long*, long*);
+long f5(long, long*, long*);
+long f6(long, long*, long*);
+long f7(long, long*, long*);
+long f8(long, long*, long*);
+long f9(long, long*, long*);
+long f10(long, long*, long*);
+long f11(long, long*, long*);
+long f12(long, long*, long*);
+long f13(long, long*, long*);
+long f14(long, long*, long*);
+long f15(long, long*, long*);
+long f16(long, long*, long*);
+long f17(long, long*, long*);
+long f18(long, long*, long*);
+long f19(long, long*, long*);
+long f20(long, long*, long*);
+long f21(long, long*, long*);
+
+long muh[] = {0x05f05f, 0x223344};
+long kuh[] = {0x00AACC, 0x563425};
+
+RET( f1(5, muh, kuh) == OR( 4, 5) &&
+ f2(5, muh, kuh) == OR( muh[0], 0x55555555) &&
+ f3(5, muh, kuh) == OR( 0x55555555, kuh[1]) &&
+ f4(5, muh, kuh) == OR(muh[1]-kuh[0], muh[0]-kuh[1]) &&
+ f5(5, muh, kuh) == OR( 0, 5) &&
+ f6(5, muh, kuh) == OR( 5, 0) &&
+ f7(5, muh, kuh) == OR( muh, kuh) &&
+ f8(5, muh, kuh) == OR( 5, 0x112233) &&
+ f9(5, muh, kuh) == OR( 0x11EEEEFF, 5) &&
+ f10(5, muh, kuh) == OR( muh[0]-5, 6) &&
+ f11(5, muh, kuh) == OR( 7, kuh[1]-3) &&
+ f12(5, muh, kuh) == OR( muh[1]-3, kuh[0]) &&
+ f13(5, muh, kuh) == OR( muh[0], kuh[1]+3) &&
+ f14(5, muh, kuh) == OR( 5, muh[0]) &&
+ f15(5, muh, kuh) == OR( kuh[1], 5) &&
+ f16(5, muh, kuh) == OR( kuh[1], 0) &&
+ f17(5, muh, kuh) == OR( 0, muh[0]) &&
+ f18(5, muh, kuh) == OR( 0, 5) &&
+ f19(5, muh, kuh) == OR( 5, 0) &&
+ f20(5, muh, kuh) == OR( 0, kuh[0]) &&
+ f21(5, muh, kuh) == OR( muh[0], 0)
+ );
+
--- /dev/null
+struct foo bar end;
+
+method f1(a)
+ return not(this-a.bar);
+end;
+
+method f2(a)
+ return not(a.foo);
+end;
+
+method f3(a)
+ return not(not(a.foo));
+end;
+
+method f4(a)
+ return not(a.bar);
+end;
+
+method f5(a)
+ return not(not(a.bar));
+end;
+
+method f6(a)
+ return not(not(a.foo - a.bar));
+end;
+
+method f7(a)
+ return not(not(a.foo * a.bar));
+end;
+
+method f8(a)
+ return not(this*a.bar);
+end;
--- /dev/null
+long f1(long, long*);
+long f2(long, long*);
+long f3(long, long*);
+long f4(long, long*);
+long f5(long, long*);
+long f6(long, long*);
+long f7(long, long*);
+long f8(long, long*);
+
+long muh[] = {6,4};
+long kuh[] = {1,0};
+long zod[] = {0,1};
+long pui[] = {1,1};
+
+printf("%d = %d , %d = %d, %d = %d, %d = %d \n", f8(5,muh) , 1 , f8(4,muh) , 1 , f8(0,muh) , 0 , f8(0,zod) , 0 );
+
+RET(f1(5,muh) == 0 && f1(4,muh) == 1 &&
+ f2(5,kuh) == 0 && f2(5,zod) == 1 &&
+ f3(5,kuh) == 1 && f3(5,zod) == 0 && f3(5,muh) == 1 &&
+ f4(5,kuh) == 1 && f4(5,zod) == 0 && f4(5,muh) == 0 &&
+ f5(5,kuh) == 0 && f5(5,zod) == 1 &&
+ f6(5,muh) == 1 && f6(5,kuh) == 1 && f6(5,pui) == 0 &&
+ f7(5,muh) == 1 && f7(5,kuh) == 0 && f7(5,pui) == 1 &&
+ f8(5,muh) == 0 && f8(4,muh) == 0 && f8(0,muh) == 1 && f8(0,zod) == 1
+ );
--- /dev/null
+struct foo bar end;
+
+method f1(a)
+ return 5 * a.foo;
+end;
+
+method f2(a)
+ return a.bar * this;
+end;
+
+method f3(a)
+ return (a.foo-3) < (a.bar-3);
+end;
+
+method f4(a)
+ return (a.foo*1) < 6;
+end;
+
+method f5(a)
+ return 5 < (a.bar * 1);
+end;
+
+method f6(a)
+ return (1 * a.foo) < this;
+end;
+
+method f7(a)
+ return a.foo < (a.bar * 1);
+end;
+
+method f8(a)
+ return a.foo < this;
+end;
+
+method f9(a)
+ return this < a.bar;
+end;
+
+method f10(a)
+ return a.foo < 6;
+end;
+
+method f11(a)
+ return 5 < a.bar;
+end;
--- /dev/null
+
+long f1(long, long*);
+long f2(long, long*);
+long f3(long, long*);
+long f4(long, long*);
+long f5(long, long*);
+long f6(long, long*);
+long f7(long, long*);
+long f8(long, long*);
+long f9(long, long*);
+long f10(long, long*);
+long f11(long, long*);
+
+long muh[] = {5, 6};
+long kuh[] = {6, 5};
+
+RET(f1(4,muh) == 25 &&
+ f2(5,muh) == 30 &&
+ f3(5,muh) == 1 && f3(5,kuh) == 0 &&
+ f4(5,muh) == 1 && f4(5,kuh) == 0 &&
+ f5(5,muh) == 1 && f5(5,kuh) == 0 &&
+ f6(6,muh) == 1 && f6(6,kuh) == 0 &&
+ f7(5,muh) == 1 && f7(5,kuh) == 0 &&
+ f8(5,muh) == 0 && f8(7,kuh) == 1 &&
+ f9(5,muh) == 1 && f9(5,kuh) == 0 &&
+ f10(5,muh) == 1 && f10(5,kuh) == 0 &&
+ f11(5,muh) == 1 && f11(5,kuh) == 0
+);
--- /dev/null
+struct foo bar end;
+
+method f1(a)
+ return (a.foo * 1) = 5;
+end;
+
+method f2(a)
+ return 5 = (a.bar * 1);
+end;
+
+method f3(a)
+ return (a.foo * 1) = this;
+end;
+
+method f4(a)
+ return this = (a.bar * 1);
+end;
+
+method f5(a)
+ return a.foo = (this * 1);
+end;
+
+method f6(a)
+ return a.foo = 5;
+end;
+
+method f7(a)
+ return 5 = a.bar;
+end;
+
+method f8(a)
+ return a.foo = this;
+end;
+
+method f9(a)
+ return this = a.bar;
+end;
+
--- /dev/null
+
+long f1(long, long*);
+long f2(long, long*);
+long f3(long, long*);
+long f4(long, long*);
+long f5(long, long*);
+long f6(long, long*);
+long f7(long, long*);
+long f8(long, long*);
+long f9(long, long*);
+
+long muh[] = {5, 6};
+long kuh[] = {6, 5};
+
+RET(f1(4,muh) == 1 && f1(5,kuh) == 0 &&
+ f2(5,muh) == 0 && f2(5,kuh) == 1 &&
+ f3(5,muh) == 1 && f3(5,kuh) == 0 &&
+ f4(5,muh) == 0 && f4(5,kuh) == 1 &&
+ f5(5,muh) == 1 && f5(5,kuh) == 0 &&
+ f6(6,muh) == 1 && f6(6,kuh) == 0 &&
+ f7(5,muh) == 0 && f7(5,kuh) == 1 &&
+ f8(5,muh) == 1 && f8(5,kuh) == 0 &&
+ f9(5,muh) == 0 && f9(5,kuh) == 1
+);
--- /dev/null
+method f1(a b)
+ return not(a or b);
+end;
+
+method f2(a b)
+ return not(not(a or b));
+end;
+
+method f3(a b)
+ return not(a - b);
+end;
+
+method f4(a b)
+ return not(not(a - b));
+end;
+
+method f5(a b)
+ return not(a < b);
+end;
+
+method f6(a b)
+ return not(not(a < b));
+end;
+
+method f7(a b)
+ return not(a = b);
+end;
+
+method f8(a b)
+ return not(not(a = b));
+end;
--- /dev/null
+long f1(long,long,long);
+long f2(long,long,long);
+long f3(long,long,long);
+long f4(long,long,long);
+long f5(long,long,long);
+long f6(long,long,long);
+long f7(long,long,long);
+long f8(long,long,long);
+
+RET(
+f1(0,0,0) == 1 && f1(0,1,1) == 0 &&
+f2(0,0,0) == 0 && f2(0,1,1) == 1 &&
+
+f3(0,4,4) == 1 && f3(0,4,3) == 0 &&
+f4(0,4,4) == 0 && f4(0,4,3) == 1 &&
+
+f5(0,5,4) == 1 && f5(0,4,5) == 0 &&
+f6(0,5,4) == 0 && f6(0,4,5) == 1 &&
+
+f7(0,5,4) == 1 && f7(0,5,5) == 0 &&
+f8(0,5,4) == 0 && f8(0,5,5) == 1
+);
--- /dev/null
+method foo(a b c)
+ return a;
+end;
+
+method bar(a b c)
+ return b;
+end;
+
+method foobar(a b c)
+ return c;
+end;
--- /dev/null
+extern long foo(long this, long, long, long);
+extern long bar(long this, long, long, long);
+extern long foobar(long this, long, long, long);
+
+RET( (foo(0xDEAD, 3, 4, 5) == 3) && (bar(0xDEAD, 3, 4, 5) == 4) && (foobar(0xDEAD, 3, 4, 5) == 5));
--- /dev/null
+method a()
+ return 5 - 3;
+end;
+
+method b(x)
+ return 5 - x;
+end;
+
+method c(x)
+ return x - 3;
+end;
--- /dev/null
+extern long a(long this);
+extern long b(long this, long x);
+extern long c(long this, long x);
+
+RET( (a(0xDEAD) == 2) && (b(0xDEAD, 23) == -18) && (c(0xDEAD, 23) == 20));
--- /dev/null
+method q(x y)
+ return 5 - ((x - 3) - y);
+end;
+
+method r(x y)
+ return (x - y) - 10;
+end;
+
+method s(x y)
+ return 6 - (x - 1);
+end;
--- /dev/null
+extern long q(long this, long, long);
+extern long r(long this, long, long);
+extern long s(long this, long, long);
+
+RET((q(0xDEAD, 33, 15) == -10) && (r(0xDEAD, 33, 15) == 8) && (s(0xDEAD, 33, 15) == -26));
--- /dev/null
+method Long(a b c d e)
+ return (a - (e - 20)) - (b - (c - (99 - d)));
+end;
+
+method Loong(a b c d e)
+ return a - (b - (c - (d - (e - (a - (b - (c - (d - (e - 10)))))))));
+end;
+
+method Looong(a b c d e)
+ return (11 - a) - (22 - b) - (33 - c - (44 - d)) - (55 - (77 - e - -66));
+end;
--- /dev/null
+long Long(long this, long, long, long, long, long);
+long Loong(long this, long, long, long, long, long);
+long Looong(long this, long, long, long, long, long);
+
+long erw1 = 9935366;
+long erw2 = 10;
+long erw3 = 11309;
+long ret1 = Long(0xDEAD, 23, 66, 1024, 9999999, 65535);
+long ret2 = Loong(0xDEAD, 11, 22, 33, 44, 55);
+long ret3 = Looong(0xDEAD, 34, 92934, 2991, 12389, 72281);
+
+printf("Long(erwartet: %i) : %i\n", erw1, ret1);
+printf("Loong(erwartet: %i) : %i\n", erw2, ret2);
+printf("Looong(erwartet: %i) : %i\n", erw3, ret3);
+
+RET(ret1 == erw1 && ret2 == erw2 && ret3 == erw3);
--- /dev/null
+method pvs1(a b)
+ return (this - a) * b;
+end;
+
+method pvs2(a b)
+ return this - (a * b);
+end;
+
+method pvs3(a b)
+ return (this * a) - b;
+end;
+
+method pvs4(a b)
+ return this * (a - b);
+end;
--- /dev/null
+long pvs1(long, long, long);
+long pvs2(long, long, long);
+long pvs3(long, long, long);
+long pvs4(long, long, long);
+
+
+RET((pvs1(2,3,5) == -5) && (pvs2(2,3,5) == -13) && (pvs3(2,3,5) == 1) && (pvs4(2,3,5) == -4));
--- /dev/null
+method meh(a b c d)
+ return (this * (a - b)) - (c - (a * d));
+end;
--- /dev/null
+long meh(long, long, long, long, long);
+
+RET(meh(2,11,5,15,32) == 349);
--- /dev/null
+struct a b end;
+
+method test64()
+ return this - -2139062144;
+end;
+
+method num()
+ return 15 - 4 - 2 - 6 - 7;
+end;
+
+method num2()
+ return 15 - (4 - 2 - 6 - 7);
+end;
+
+method globcmp()
+ return this.a < this.b;
+end;
+
+method globcmp2()
+ return this.a = this.b;
+end;
--- /dev/null
+long test64(long);
+long num(long);
+long num2(long);
+long globcmp(long*);
+long globcmp2(long*);
+
+
+long foo[] = {1337, 42};
+long bar[] = {23, 23};
+long foobar[] = {23, 42};
+
+RET((test64(0x1000000000) == (long) 0x1000000000 - (int) 0x80808080)
+ && (num(0) == -4)
+ && (num2(0) == 26)
+ && (globcmp(foo) == 0)
+ && (globcmp(bar) == 0)
+ && (globcmp(foobar) == 1)
+ && (globcmp2(foo) == 0)
+ && (globcmp2(bar) == 1)
+ && (globcmp2(foobar) == 0)
+ );