tccgen: use lvalue as result from bitfield assignment
test case:
#include <stdio.h>
int main(int argc, char **argv)
{
struct _s { unsigned a:9, b:5, c:7; } _s, *s = &_s;
int n = 250;
s->a = s->b = s->c = n + 4;
printf("--> %d / %d / %d\n", s->a, s->b, s->c);
return 0;
}
before:
--> 254 / 30 / 126
now:
--> 30 / 30 / 126
This commit is contained in:
12
tccgen.c
12
tccgen.c
@ -2520,16 +2520,15 @@ ST_FUNC void vstore(void)
|
|||||||
/* leave source on stack */
|
/* leave source on stack */
|
||||||
} else if (ft & VT_BITFIELD) {
|
} else if (ft & VT_BITFIELD) {
|
||||||
/* bitfield store handling */
|
/* bitfield store handling */
|
||||||
|
|
||||||
|
/* save lvalue as expression result (example: s.b = s.a = n;) */
|
||||||
|
vdup(), vtop[-1] = vtop[-2];
|
||||||
|
|
||||||
bit_pos = (ft >> VT_STRUCT_SHIFT) & 0x3f;
|
bit_pos = (ft >> VT_STRUCT_SHIFT) & 0x3f;
|
||||||
bit_size = (ft >> (VT_STRUCT_SHIFT + 6)) & 0x3f;
|
bit_size = (ft >> (VT_STRUCT_SHIFT + 6)) & 0x3f;
|
||||||
/* remove bit field info to avoid loops */
|
/* remove bit field info to avoid loops */
|
||||||
vtop[-1].type.t = ft & ~(VT_BITFIELD | (-1 << VT_STRUCT_SHIFT));
|
vtop[-1].type.t = ft & ~(VT_BITFIELD | (-1 << VT_STRUCT_SHIFT));
|
||||||
|
|
||||||
/* duplicate source into other register */
|
|
||||||
gv_dup();
|
|
||||||
vswap();
|
|
||||||
vrott(3);
|
|
||||||
|
|
||||||
if((ft & VT_BTYPE) == VT_BOOL) {
|
if((ft & VT_BTYPE) == VT_BOOL) {
|
||||||
gen_cast(&vtop[-1].type);
|
gen_cast(&vtop[-1].type);
|
||||||
vtop[-1].type.t = (vtop[-1].type.t & ~VT_BTYPE) | (VT_BYTE | VT_UNSIGNED);
|
vtop[-1].type.t = (vtop[-1].type.t & ~VT_BTYPE) | (VT_BYTE | VT_UNSIGNED);
|
||||||
@ -2561,8 +2560,7 @@ ST_FUNC void vstore(void)
|
|||||||
gen_op('|');
|
gen_op('|');
|
||||||
/* store result */
|
/* store result */
|
||||||
vstore();
|
vstore();
|
||||||
|
/* ... and discard */
|
||||||
/* pop off shifted source from "duplicate source..." above */
|
|
||||||
vpop();
|
vpop();
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user