@@ -490,6 +490,17 @@ ReplaceExprWithVariable(const char *prefix, AST *expr, AST **inits)
490
490
return exprvar ;
491
491
}
492
492
493
+ /* mask off a bit number */
494
+ static AST *
495
+ BitNumber (AST * x )
496
+ {
497
+ if (curfunc && IsSpinLang (curfunc -> language )) return x ;
498
+ if (!IsConstExpr (x )) return x ;
499
+
500
+ // make sure we don't turn 1<<n into a big 64 bit number
501
+ return AstOperator ('&' , x , AstInteger (31 ));
502
+ }
503
+
493
504
/*
494
505
* special case an assignment like outa[2..1] ^= -1
495
506
*/
@@ -506,7 +517,7 @@ RangeXor(AST *dst, AST *src)
506
517
507
518
AstReportAs (dst , & saveinfo );
508
519
if (dst -> right -> right == NULL ) {
509
- loexpr = FoldIfConst (dst -> right -> left );
520
+ loexpr = FoldIfConst (BitNumber ( dst -> right -> left ) );
510
521
nbits = AstInteger (1 );
511
522
/* special case: if src is -1 or 0
512
523
* then we don't have to construct a mask,
@@ -529,8 +540,8 @@ RangeXor(AST *dst, AST *src)
529
540
}
530
541
}
531
542
} else {
532
- hiexpr = FoldIfConst (dst -> right -> left );
533
- loexpr = FoldIfConst (dst -> right -> right );
543
+ hiexpr = FoldIfConst (BitNumber ( dst -> right -> left ) );
544
+ loexpr = FoldIfConst (BitNumber ( dst -> right -> right ) );
534
545
//nbits = (hi - lo + 1);
535
546
nbits = AstOperator ('+' ,
536
547
AstOperator (K_ABS , NULL ,
@@ -578,11 +589,11 @@ RangeBitSet(AST *dst, uint32_t mask, int bitset)
578
589
579
590
AstReportAs (dst , & saveinfo );
580
591
if (dst -> right -> right == NULL ) {
581
- loexpr = dst -> right -> left ;
592
+ loexpr = BitNumber ( dst -> right -> left ) ;
582
593
} else {
583
594
AST * hiexpr ;
584
- loexpr = dst -> right -> right ;
585
- hiexpr = dst -> right -> left ;
595
+ loexpr = BitNumber ( dst -> right -> right ) ;
596
+ hiexpr = BitNumber ( dst -> right -> left ) ;
586
597
loexpr = AstOperator (K_LIMITMAX , loexpr , hiexpr );
587
598
loexpr = FoldIfConst (loexpr );
588
599
}
0 commit comments