shithub: scc

Download patch

ref: b18a5a9dbc408cc4d30865dfc6d4a6f1329e142d
parent: 6c20179c7f7cc370d02d2be76bc60ccc5f448835
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Tue Apr 19 23:44:11 EDT 2016

[cc2-qbe] Fix equality operators

These operators have different form depending of the size of the
operands, so we have to use different opcodes based in the size
of the operands.

--- a/cc2/arch/qbe/arch.h
+++ b/cc2/arch/qbe/arch.h
@@ -18,7 +18,9 @@
 	ASLE,
 	ASGE,
 	ASEQ,
+	ASEQL,
 	ASNE,
+	ASNEL,
 	ASBAND,
 	ASBOR,
 	ASBXOR,
--- a/cc2/arch/qbe/cgen.c
+++ b/cc2/arch/qbe/cgen.c
@@ -61,6 +61,7 @@
 {
 	Node *l, *r;
 	Symbol *sym;
+	Type *tp;
 	int op;
 
 	if (!np)
@@ -68,8 +69,9 @@
 
 	l = cgen(np->left);
 	r = cgen(np->right);
+	tp = &np->type;
 
-	switch (op = np->op) {
+	switch (np->op) {
 	case OREG:
 	case OSTRING:
 		abort();
@@ -79,6 +81,10 @@
 	case OMEM:
 	case OAUTO:
 		return np;
+	case OEQ:
+	case ONE:
+		op = opasm[np->op] + (tp->size == 8);
+		goto binary;
 	case OADD:
 	case OSUB:
 	case OMUL:
@@ -90,18 +96,18 @@
 	case OGT:
 	case OLE:
 	case OGE:
-	case OEQ:
-	case ONE:
 	case OBAND:
 	case OBOR:
 	case OBXOR:
 	case OCPL:
+		op = opasm[np->op];
+	binary:
 		if ((l->flags & (ISTMP|ISCONS)) == 0)
 			l = np->left = load(l);
 		if ((r->flags & (ISTMP|ISCONS)) == 0)
 			r = np->right = load(r);
 		tmpnode(np);
-		code(opasm[op], np, l, r);
+		code(op, np, l, r);
 		return np;
 	case ONOP:
 	case OBLOOP:
--- a/cc2/arch/qbe/code.c
+++ b/cc2/arch/qbe/code.c
@@ -11,25 +11,28 @@
 static struct opdata {
 	void (*fun)(void);
 	char *txt;
+	char letter;
 } optbl [] = {
-	[ASADD]  =  {.fun = binary, .txt = "add"},
-	[ASSUB]  =  {.fun = binary, .txt = "sub"},
-	[ASMUL]  =  {.fun = binary, .txt = "mul"},
-	[ASMOD]  =  {.fun = binary, .txt = "rem"},
-	[ASDIV]  =  {.fun = binary, .txt = "div"},
-	[ASSHL]  =  {.fun = binary, .txt = "shl"},
-	[ASSHR]  =  {.fun = binary, .txt = "shr"},
-	[ASLT]   =  {.fun = binary, .txt = "clt"},
-	[ASGT]   =  {.fun = binary, .txt = "cgt"},
-	[ASLE]   =  {.fun = binary, .txt = "cle"},
-	[ASGE]   =  {.fun = binary, .txt = "cge"},
-	[ASEQ]   =  {.fun = binary, .txt = "ceq"},
-	[ASNE]   =  {.fun = binary, .txt = "cne"},
-	[ASBAND] =  {.fun = binary, .txt = "and"},
-	[ASBOR]  =  {.fun = binary, .txt = "or"},
-	[ASBXOR] =  {.fun = binary, .txt = "xor"},
-	[ASLOAD] =  {.fun = load,   .txt = "load"},
-	[ASASSIG] = {.fun = store,  .txt = "store"}
+	[ASADD]  =  {.fun = binary, .txt = "add", .letter = 'w'},
+	[ASSUB]  =  {.fun = binary, .txt = "sub", .letter = 'w'},
+	[ASMUL]  =  {.fun = binary, .txt = "mul", .letter = 'w'},
+	[ASMOD]  =  {.fun = binary, .txt = "rem", .letter = 'w'},
+	[ASDIV]  =  {.fun = binary, .txt = "div", .letter = 'w'},
+	[ASSHL]  =  {.fun = binary, .txt = "shl", .letter = 'w'},
+	[ASSHR]  =  {.fun = binary, .txt = "shr", .letter = 'w'},
+	[ASLT]   =  {.fun = binary, .txt = "clt", .letter = 'w'},
+	[ASGT]   =  {.fun = binary, .txt = "cgt", .letter = 'w'},
+	[ASLE]   =  {.fun = binary, .txt = "cle", .letter = 'w'},
+	[ASGE]   =  {.fun = binary, .txt = "cge", .letter = 'w'},
+	[ASEQ]   =  {.fun = binary, .txt = "ceqw", .letter = 'w'},
+	[ASEQL]  =  {.fun = binary, .txt = "ceql", .letter = 'w'},
+	[ASNE]   =  {.fun = binary, .txt = "cnew", .letter = 'w'},
+	[ASNEL]  =  {.fun = binary, .txt = "cnel", .letter = 'w'},
+	[ASBAND] =  {.fun = binary, .txt = "and", .letter = 'w'},
+	[ASBOR]  =  {.fun = binary, .txt = "or", .letter = 'w'},
+	[ASBXOR] =  {.fun = binary, .txt = "xor", .letter = 'w'},
+	[ASLOAD] =  {.fun = load,   .txt = "load", .letter = 'w'},
+	[ASASSIG] = {.fun = store,  .txt = "store", .letter = 'w'}
 };
 
 /*
@@ -241,8 +244,10 @@
 static void
 binary(void)
 {
+	struct opdata *p = &optbl[pc->op];
+
 	printf("\t%s %c=\t%s\t",
-	       addr2txt(&pc->to), 'w', optbl[pc->op].txt);
+	       addr2txt(&pc->to), p->letter, p->txt);
 	fputs(addr2txt(&pc->from1), stdout);
 	putchar(',');
 	fputs(addr2txt(&pc->from2), stdout);