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); | 
