aboutsummaryrefslogtreecommitdiff
path: root/tccgen.c
diff options
context:
space:
mode:
authorMichael Matz <matz@suse.de>2012-04-15 01:06:46 +0200
committerMichael Matz <matz@suse.de>2012-04-18 20:57:13 +0200
commit5c0a2366a3bb5bdeb3b3617389d4584375d5bfbc (patch)
treea4c54ec32646daf3b3bb5a947a40299713d45563 /tccgen.c
parent6471ec0a2bd523edd4bbc79277a33d0b853940fa (diff)
downloadtinycc-5c0a2366a3bb5bdeb3b3617389d4584375d5bfbc.tar.gz
tinycc-5c0a2366a3bb5bdeb3b3617389d4584375d5bfbc.tar.bz2
Fix bitfield loads into char/short.
Removes a premature optimization of char/short loads rewriting the source type. It did so also for bitfield loads, thereby removing all the shifts/maskings.
Diffstat (limited to 'tccgen.c')
-rw-r--r--tccgen.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/tccgen.c b/tccgen.c
index b0cec4a..2c759e1 100644
--- a/tccgen.c
+++ b/tccgen.c
@@ -2320,8 +2320,9 @@ ST_FUNC void vstore(void)
ft = vtop[-1].type.t;
sbt = vtop->type.t & VT_BTYPE;
dbt = ft & VT_BTYPE;
- if (((sbt == VT_INT || sbt == VT_SHORT) && dbt == VT_BYTE) ||
- (sbt == VT_INT && dbt == VT_SHORT)) {
+ if ((((sbt == VT_INT || sbt == VT_SHORT) && dbt == VT_BYTE) ||
+ (sbt == VT_INT && dbt == VT_SHORT))
+ && !(vtop->type.t & VT_BITFIELD)) {
/* optimize char/short casts */
delayed_cast = VT_MUSTCAST;
vtop->type.t = ft & (VT_TYPE & ~(VT_BITFIELD | (-1 << VT_STRUCT_SHIFT)));