[hackers] [scc] [cc2-qbe] Add support for sign in comparisions || Roberto E. Vargas Caballero

From: <git_AT_suckless.org>
Date: Thu, 21 Apr 2016 17:45:18 +0200 (CEST)

commit 8b6cc7d0182df1ccb3dd60ad44abfad031234f25
Author: Roberto E. Vargas Caballero <k0ga_AT_shike2.com>
AuthorDate: Thu Apr 21 17:42:23 2016 +0200
Commit: Roberto E. Vargas Caballero <k0ga_AT_shike2.com>
CommitDate: Thu Apr 21 17:45:11 2016 +0200

    [cc2-qbe] Add support for sign in comparisions
    
    Signed types and unsigned types have a different opcode in qbe, so
    we have to look the signess of the types to see what is the opcode
    we have to use.

diff --git a/cc2/arch/qbe/arch.h b/cc2/arch/qbe/arch.h
index b94a32d..79c43ef 100644
--- a/cc2/arch/qbe/arch.h
+++ b/cc2/arch/qbe/arch.h
_AT_@ -16,9 +16,13 @@ enum asmop {
         ASSHLW,
         ASSHRW,
         ASLTW,
+ ASULTW,
         ASGTW,
+ ASUGTW,
         ASLEW,
+ ASULEW,
         ASGEW,
+ ASUGEW,
         ASEQW,
         ASNEW,
         ASBANDW,
_AT_@ -34,9 +38,13 @@ enum asmop {
         ASSHLL,
         ASSHRL,
         ASLTL,
+ ASULTL,
         ASGTL,
+ ASUGTL,
         ASLEL,
+ ASULEL,
         ASGEL,
+ ASUGEL,
         ASEQL,
         ASNEL,
         ASBANDL,
diff --git a/cc2/arch/qbe/cgen.c b/cc2/arch/qbe/cgen.c
index dbdcf80..c0bc1e9 100644
--- a/cc2/arch/qbe/cgen.c
+++ b/cc2/arch/qbe/cgen.c
_AT_@ -122,7 +122,7 @@ cgen(Node *np)
         Node *l, *r;
         Symbol *sym;
         Type *tp;
- int op;
+ int op, off;
         char *tbl;
 
         if (!np)
_AT_@ -142,6 +142,16 @@ cgen(Node *np)
         case OMEM:
         case OAUTO:
                 return np;
+ case OLT:
+ case OGT:
+ case OLE:
+ case OGE:
+ /*
+ * unsigned version of operations are always +1 the
+ * signed version
+ */
+ off = (tp->flags & SIGNF) == 0;
+ goto binary;
         case OADD:
         case OSUB:
         case OMUL:
_AT_@ -149,16 +159,14 @@ cgen(Node *np)
         case ODIV:
         case OSHL:
         case OSHR:
- case OLT:
- case OGT:
- case OLE:
- case OGE:
         case OBAND:
         case OBOR:
         case OBXOR:
         case OCPL:
         case OEQ:
         case ONE:
+ off = 0;
+ binary:
                 switch (tp->size) {
                 case 4:
                         tbl = (tp->flags & INTF) ? opasmw : opasms;
_AT_@ -169,8 +177,7 @@ cgen(Node *np)
                 default:
                         abort();
                 }
- op = tbl[np->op];
- binary:
+ op = tbl[np->op] + off;
                 if ((l->flags & (ISTMP|ISCONS)) == 0)
                         l = np->left = load(l);
                 if ((r->flags & (ISTMP|ISCONS)) == 0)
diff --git a/cc2/arch/qbe/code.c b/cc2/arch/qbe/code.c
index 26be160..165a102 100644
--- a/cc2/arch/qbe/code.c
+++ b/cc2/arch/qbe/code.c
_AT_@ -26,10 +26,14 @@ static struct opdata {
         [ASDIVW] = {.fun = binary, .txt = "div", .letter = 'w'},
         [ASSHLW] = {.fun = binary, .txt = "shl", .letter = 'w'},
         [ASSHRW] = {.fun = binary, .txt = "shr", .letter = 'w'},
- [ASLTW] = {.fun = binary, .txt = "cltw", .letter = 'w'},
- [ASGTW] = {.fun = binary, .txt = "cgtw", .letter = 'w'},
- [ASLEW] = {.fun = binary, .txt = "clew", .letter = 'w'},
- [ASGEW] = {.fun = binary, .txt = "cgew", .letter = 'w'},
+ [ASLTW] = {.fun = binary, .txt = "csltw", .letter = 'w'},
+ [ASULTW] = {.fun = binary, .txt = "cultw", .letter = 'w'},
+ [ASGTW] = {.fun = binary, .txt = "csgtw", .letter = 'w'},
+ [ASUGTW] = {.fun = binary, .txt = "cugtw", .letter = 'w'},
+ [ASLEW] = {.fun = binary, .txt = "cslew", .letter = 'w'},
+ [ASULEW] = {.fun = binary, .txt = "culew", .letter = 'w'},
+ [ASGEW] = {.fun = binary, .txt = "csgew", .letter = 'w'},
+ [ASUGEW] = {.fun = binary, .txt = "cugew", .letter = 'w'},
         [ASEQW] = {.fun = binary, .txt = "ceqw", .letter = 'w'},
         [ASNEW] = {.fun = binary, .txt = "cnew", .letter = 'w'},
         [ASBANDW] = {.fun = binary, .txt = "and", .letter = 'w'},
_AT_@ -43,10 +47,14 @@ static struct opdata {
         [ASDIVL] = {.fun = binary, .txt = "div", .letter = 'l'},
         [ASSHLL] = {.fun = binary, .txt = "shl", .letter = 'l'},
         [ASSHRL] = {.fun = binary, .txt = "shr", .letter = 'l'},
- [ASLTL] = {.fun = binary, .txt = "cltl", .letter = 'w'},
- [ASGTL] = {.fun = binary, .txt = "cgtl", .letter = 'w'},
- [ASLEL] = {.fun = binary, .txt = "clel", .letter = 'w'},
- [ASGEL] = {.fun = binary, .txt = "cgel", .letter = 'w'},
+ [ASLTL] = {.fun = binary, .txt = "csltl", .letter = 'w'},
+ [ASULTL] = {.fun = binary, .txt = "cultl", .letter = 'w'},
+ [ASGTL] = {.fun = binary, .txt = "csgtl", .letter = 'w'},
+ [ASUGTL] = {.fun = binary, .txt = "cugtl", .letter = 'w'},
+ [ASLEL] = {.fun = binary, .txt = "cslel", .letter = 'w'},
+ [ASULEL] = {.fun = binary, .txt = "culel", .letter = 'w'},
+ [ASGEL] = {.fun = binary, .txt = "csgel", .letter = 'w'},
+ [ASUGEL] = {.fun = binary, .txt = "cugel", .letter = 'w'},
         [ASEQL] = {.fun = binary, .txt = "ceql", .letter = 'w'},
         [ASNEL] = {.fun = binary, .txt = "cnel", .letter = 'w'},
         [ASBANDL] = {.fun = binary, .txt = "and", .letter = 'l'},
Received on Thu Apr 21 2016 - 17:45:18 CEST

This archive was generated by hypermail 2.3.0 : Thu Apr 21 2016 - 17:48:15 CEST