diff options
author | Michael Forney <mforney@mforney.org> | 2019-02-16 02:25:30 -0800 |
---|---|---|
committer | Michael Forney <mforney@mforney.org> | 2019-02-16 02:25:30 -0800 |
commit | 6dee4df79d5f251d12e387d8425e2b05cdd60523 (patch) | |
tree | 35926b891321b5186b72b1ae4cd59673dd6e8938 | |
parent | f4a3a6504b1cf2bc28a2ad87ac5befcda6b78050 (diff) | |
download | cproc-6dee4df79d5f251d12e387d8425e2b05cdd60523.tar.xz |
Fix casts from integer types less than 32 bits wide
-rw-r--r-- | qbe.c | 12 |
1 files changed, 9 insertions, 3 deletions
@@ -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); |