scc

simple c99 compiler
git clone git://git.simple-cc.org/scc
Log | Files | Refs | Submodules | README | LICENSE

commit 57ff62dc0c5dae01e8065a47bcd6d92e7d30f5ae
parent 54b95ee94aa5b1503b8ea6bf1b480bf7fa720fe5
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date:   Fri,  4 Nov 2022 03:07:33 +0100

cc2/qbe: Handle properly small ints in cast()

Qbe does not need any operation for casts done to
size smaller than 4 bytes because it only manages
operations at that size. Bytes and 2 bytes are only
hanled at the load and store level.

Diffstat:
Msrc/cmd/cc/cc2/target/qbe/cgen.c | 34+++++++++++++++++-----------------
1 file changed, 17 insertions(+), 17 deletions(-)

diff --git a/src/cmd/cc/cc2/target/qbe/cgen.c b/src/cmd/cc/cc2/target/qbe/cgen.c @@ -271,7 +271,7 @@ cast(Type *td, Node *np) { Type *ts; Node *tmp; - int op, d_isint, s_isint, sidx, didx; + int op, d_isint, s_isint, sidx, didx, sign; ts = &np->type; d_isint = (td->flags & INTF) != 0; @@ -280,38 +280,38 @@ cast(Type *td, Node *np) sidx = bytes2idx(ts->size); didx = bytes2idx(td->size); + sign = (ts->flags & SIGNF) == 0; + if (d_isint && s_isint) { /* conversion from int to int */ - if (td->size < 4) - td->size = 4; - if (td->size <= ts->size) { + if (didx < I4BYTES) + didx = bytes2idx(4); + + if (didx <= sidx) { np->type = *td; return np; } - assert(ts->size == 1 || ts->size == 2 || ts->size == 4); - assert(td->size == 4 || td->size == 8); - op = i2i_conv[sidx][didx] [ (ts->flags & SIGNF) == 0]; + + op = i2i_conv[sidx][didx][sign]; } else if (d_isint) { /* conversion from float to int */ - assert(ts->size == 4 || ts->size == 8); - assert(td->size == 4 || td->size == 8); - op = f2i_conv[sidx][didx] [ (ts->flags & SIGNF) == 0]; + if (didx < I4BYTES) + didx = bytes2idx(4); + + op = f2i_conv[sidx][didx][sign]; } else if (s_isint) { /* conversion from int to float */ - if (ts->size == 1 || ts->size == 2) { + if (sidx == I1BYTES || sidx == I2BYTES) { ts = (ts->flags&SIGNF) ? &int32type : &uint32type; np = cast(ts, np); } - assert(ts->size == 4 || ts->size == 8); - assert(td->size == 4 || td->size == 8); - op = i2f_conv[sidx][didx] [ (ts->flags & SIGNF) == 0]; + op = i2f_conv[sidx][didx][sign]; } else { /* conversion from float to float */ - assert(ts->size == 4 || ts->size == 8); - assert(td->size == 4 || td->size == 8); - op = (td->size == 4) ? ASEXTS : ASTRUNCD; + op = (didx == I4BYTES) ? ASEXTS : ASTRUNCD; } + assert(op != 0); tmp = tmpnode(td); code(op, tmp, np, NULL);