ref: d3bf24974993f688e9666de0914519fdba97512a
parent: 7384036a2738f3f975eeebec10156eaea478e386
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Thu Sep 22 05:37:34 EDT 2016
[cc2-qbe] Use specific load versions There are versions of load for the different sizes and with or without sign extension, because load was only loading a full word (equivalent to loaduw).
--- a/cc2/arch/qbe/arch.h
+++ b/cc2/arch/qbe/arch.h
@@ -13,9 +13,12 @@
ASSTS,
ASSTD,
- ASLDB,
- ASLDH,
- ASLDW,
+ ASLDSB,
+ ASLDUB,
+ ASLDSH,
+ ASLDUH,
+ ASLDSW,
+ ASLDUW,
ASLDL,
ASLDS,
ASLDD,
--- a/cc2/arch/qbe/cgen.c
+++ b/cc2/arch/qbe/cgen.c
@@ -112,27 +112,35 @@
load(Type *tp, Node *np, Node *new)
{
int op;
+ int flags = tp->flags;
- if (tp->flags & AGGRF) {
+ if (flags & AGGRF) {
*new = *np;
return new;
}
switch (tp->size) {
case 1:
- op = ASLDB;
+ op = ASLDSB;
break;
case 2:
- op = ASLDH;
+ op = ASLDSH;
break;
case 4:
- op = (tp->flags & FLOATF) ? ASLDS : ASLDW;
+ op = (flags & FLOATF) ? ASLDS : ASLDSW;
break;
case 8:
- op = (tp->flags & FLOATF) ? ASLDD : ASLDL;
+ op = (flags & FLOATF) ? ASLDD : ASLDL;
break;
default:
abort();
}
+ /*
+ * unsigned version of operations are always +1 the
+ * signed version
+ */
+ if ((flags & (INTF|SIGNF)) == INTF && tp->size < 8)
+ ++op;
+
code(op, tmpnode(new, tp), np, NULL);
return new;
--- a/cc2/arch/qbe/code.c
+++ b/cc2/arch/qbe/code.c
@@ -18,12 +18,15 @@
char *txt;
char letter;
} optbl [] = {
- [ASLDB] = {.fun = unary, .txt = "load", .letter = 'b'},
- [ASLDH] = {.fun = unary, .txt = "load", .letter = 'h'},
- [ASLDW] = {.fun = unary, .txt = "load", .letter = 'w'},
- [ASLDL] = {.fun = unary, .txt = "load", .letter = 'l'},
- [ASLDS] = {.fun = unary, .txt = "load", .letter = 's'},
- [ASLDD] = {.fun = unary, .txt = "load", .letter = 'd'},
+ [ASLDSB] = {.fun = unary, .txt = "loadsb", .letter = 'w'},
+ [ASLDUB] = {.fun = unary, .txt = "loadub", .letter = 'w'},
+ [ASLDSH] = {.fun = unary, .txt = "loadsh", .letter = 'w'},
+ [ASLDUH] = {.fun = unary, .txt = "loaduh", .letter = 'w'},
+ [ASLDSW] = {.fun = unary, .txt = "loadsw", .letter = 'w'},
+ [ASLDUW] = {.fun = unary, .txt = "loaduw", .letter = 'w'},
+ [ASLDL] = {.fun = unary, .txt = "loadl", .letter = 'l'},
+ [ASLDS] = {.fun = unary, .txt = "loads", .letter = 's'},
+ [ASLDD] = {.fun = unary, .txt = "loadd", .letter = 'd'},
[ASCOPYW] = {.fun = unary, .txt = "copy", .letter = 'w'},