aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Forney <mforney@mforney.org>2019-02-16 02:25:30 -0800
committerMichael Forney <mforney@mforney.org>2019-02-16 02:25:30 -0800
commit6dee4df79d5f251d12e387d8425e2b05cdd60523 (patch)
tree35926b891321b5186b72b1ae4cd59673dd6e8938
parentf4a3a6504b1cf2bc28a2ad87ac5befcda6b78050 (diff)
downloadcproc-6dee4df79d5f251d12e387d8425e2b05cdd60523.tar.xz
Fix casts from integer types less than 32 bits wide
-rw-r--r--qbe.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/qbe.c b/qbe.c
index f43aee8..3d68495 100644
--- a/qbe.c
+++ b/qbe.c
@@ -619,10 +619,16 @@ funcexpr(struct function *f, struct expression *e)
op = src->size == 8 ? ICNED : ICNES;
} else if (dstprop & PROPINT) {
if (srcprop & PROPINT) {
- if (dst->size == 8 && src->size <= 4)
- op = src->basic.issigned ? IEXTSW : IEXTUW;
- else
+ if (dst->size <= src->size) {
op = ICOPY;
+ } else {
+ switch (src->size) {
+ case 4: op = src->basic.issigned ? IEXTSW : IEXTUW; break;
+ case 2: op = src->basic.issigned ? IEXTSH : IEXTUH; break;
+ case 1: op = src->basic.issigned ? IEXTSB : IEXTUB; break;
+ default: fatal("internal error; unknown int conversion");
+ }
+ }
} else {
if (!dst->basic.issigned)
return ftou(f, dst->repr, l);