aboutsummaryrefslogtreecommitdiff
path: root/tccgen.c
diff options
context:
space:
mode:
Diffstat (limited to 'tccgen.c')
-rw-r--r--tccgen.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/tccgen.c b/tccgen.c
index b2a7717..387b986 100644
--- a/tccgen.c
+++ b/tccgen.c
@@ -2552,6 +2552,11 @@ ST_FUNC void vstore(void)
/* remove bit field info to avoid loops */
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) {
gen_cast(&vtop[-1].type);
vtop[-1].type.t = (vtop[-1].type.t & ~VT_BTYPE) | (VT_BYTE | VT_UNSIGNED);
@@ -2583,6 +2588,9 @@ ST_FUNC void vstore(void)
gen_op('|');
/* store result */
vstore();
+
+ /* pop off shifted source from "duplicate source..." above */
+ vpop();
} else {
#ifdef CONFIG_TCC_BCHECK
/* bound check case */