@@ -486,10 +486,36 @@ IR_FOLD(MUL(C_FLOAT, C_FLOAT))
486486}
487487
488488IR_FOLD (DIV (C_U8 , C_U8 ))
489+ {
490+ IR_ASSERT (IR_OPT_TYPE (opt ) == op1_insn -> type );
491+ if (op2_insn -> val .u64 == 0 ) {
492+ /* division by zero */
493+ IR_FOLD_EMIT ;
494+ }
495+ IR_FOLD_CONST_U (op1_insn -> val .u8 / op2_insn -> val .u8 );
496+ }
497+
489498IR_FOLD (DIV (C_U16 , C_U16 ))
499+ {
500+ IR_ASSERT (IR_OPT_TYPE (opt ) == op1_insn -> type );
501+ if (op2_insn -> val .u64 == 0 ) {
502+ /* division by zero */
503+ IR_FOLD_EMIT ;
504+ }
505+ IR_FOLD_CONST_U (op1_insn -> val .u16 / op2_insn -> val .u16 );
506+ }
507+
490508IR_FOLD (DIV (C_U32 , C_U32 ))
509+ {
510+ IR_ASSERT (IR_OPT_TYPE (opt ) == op1_insn -> type );
511+ if (op2_insn -> val .u64 == 0 ) {
512+ /* division by zero */
513+ IR_FOLD_EMIT ;
514+ }
515+ IR_FOLD_CONST_U (op1_insn -> val .u32 / op2_insn -> val .u32 );
516+ }
517+
491518IR_FOLD (DIV (C_U64 , C_U64 ))
492- IR_FOLD (DIV (C_ADDR , C_ADDR ))
493519{
494520 IR_ASSERT (IR_OPT_TYPE (opt ) == op1_insn -> type );
495521 if (op2_insn -> val .u64 == 0 ) {
@@ -499,9 +525,46 @@ IR_FOLD(DIV(C_ADDR, C_ADDR))
499525 IR_FOLD_CONST_U (op1_insn -> val .u64 / op2_insn -> val .u64 );
500526}
501527
528+ IR_FOLD (DIV (C_ADDR , C_ADDR ))
529+ {
530+ IR_ASSERT (IR_OPT_TYPE (opt ) == op1_insn -> type );
531+ if (op2_insn -> val .u64 == 0 ) {
532+ /* division by zero */
533+ IR_FOLD_EMIT ;
534+ }
535+ IR_FOLD_CONST_U (op1_insn -> val .addr / op2_insn -> val .addr );
536+ }
537+
502538IR_FOLD (DIV (C_I8 , C_I8 ))
539+ {
540+ IR_ASSERT (IR_OPT_TYPE (opt ) == op1_insn -> type );
541+ if (op2_insn -> val .i64 == 0 ) {
542+ /* division by zero */
543+ IR_FOLD_EMIT ;
544+ }
545+ IR_FOLD_CONST_I (op1_insn -> val .i8 / op2_insn -> val .i8 );
546+ }
547+
503548IR_FOLD (DIV (C_I16 , C_I16 ))
549+ {
550+ IR_ASSERT (IR_OPT_TYPE (opt ) == op1_insn -> type );
551+ if (op2_insn -> val .i64 == 0 ) {
552+ /* division by zero */
553+ IR_FOLD_EMIT ;
554+ }
555+ IR_FOLD_CONST_I (op1_insn -> val .i16 / op2_insn -> val .i16 );
556+ }
557+
504558IR_FOLD (DIV (C_I32 , C_I32 ))
559+ {
560+ IR_ASSERT (IR_OPT_TYPE (opt ) == op1_insn -> type );
561+ if (op2_insn -> val .i64 == 0 ) {
562+ /* division by zero */
563+ IR_FOLD_EMIT ;
564+ }
565+ IR_FOLD_CONST_I (op1_insn -> val .i32 / op2_insn -> val .i32 );
566+ }
567+
505568IR_FOLD (DIV (C_I64 , C_I64 ))
506569{
507570 IR_ASSERT (IR_OPT_TYPE (opt ) == op1_insn -> type );
@@ -1135,6 +1198,7 @@ IR_FOLD(MAX(C_FLOAT, C_FLOAT))
11351198IR_FOLD (SEXT (C_I8 ))
11361199IR_FOLD (SEXT (C_U8 ))
11371200IR_FOLD (SEXT (C_BOOL ))
1201+ IR_FOLD (SEXT (C_CHAR ))
11381202{
11391203 IR_ASSERT (IR_IS_TYPE_INT (IR_OPT_TYPE (opt )));
11401204 IR_ASSERT (ir_type_size [IR_OPT_TYPE (opt )] > ir_type_size [op1_insn -> type ]);
@@ -1160,6 +1224,7 @@ IR_FOLD(SEXT(C_U32))
11601224IR_FOLD (ZEXT (C_I8 ))
11611225IR_FOLD (ZEXT (C_U8 ))
11621226IR_FOLD (ZEXT (C_BOOL ))
1227+ IR_FOLD (ZEXT (C_CHAR ))
11631228{
11641229 IR_ASSERT (IR_IS_TYPE_INT (IR_OPT_TYPE (opt )));
11651230 IR_ASSERT (ir_type_size [IR_OPT_TYPE (opt )] > ir_type_size [op1_insn -> type ]);
@@ -1195,12 +1260,14 @@ IR_FOLD(TRUNC(C_U64))
11951260 default :
11961261 IR_ASSERT (0 );
11971262 case IR_I8 :
1263+ case IR_CHAR :
11981264 IR_FOLD_CONST_I (op1_insn -> val .i8 );
11991265 case IR_I16 :
12001266 IR_FOLD_CONST_I (op1_insn -> val .i16 );
12011267 case IR_I32 :
12021268 IR_FOLD_CONST_I (op1_insn -> val .i32 );
12031269 case IR_U8 :
1270+ case IR_BOOL :
12041271 IR_FOLD_CONST_U (op1_insn -> val .u8 );
12051272 case IR_U16 :
12061273 IR_FOLD_CONST_U (op1_insn -> val .u16 );
@@ -1474,6 +1541,10 @@ IR_FOLD(EQ(SEXT, C_ADDR))
14741541 } else {
14751542 ir_type type = ctx -> ir_base [op1_insn -> op1 ].type ;
14761543
1544+ if (op1_insn -> op == IR_ZEXT
1545+ && (op2_insn -> val .u64 >> (ir_type_size [type ] * 8 )) != 0 ) {
1546+ IR_FOLD_NEXT ;
1547+ }
14771548 if (IR_IS_TYPE_SIGNED (type )) {
14781549 switch (ir_type_size [type ]) {
14791550 case 1 : val .i64 = op2_insn -> val .i8 ; break ;
@@ -1493,6 +1564,7 @@ IR_FOLD(EQ(SEXT, C_ADDR))
14931564 op2 = ir_const (ctx , val , type );
14941565 IR_FOLD_RESTART ;
14951566 }
1567+
14961568 IR_FOLD_NEXT ;
14971569}
14981570
@@ -1518,6 +1590,10 @@ IR_FOLD(NE(SEXT, C_ADDR))
15181590 } else {
15191591 ir_type type = ctx -> ir_base [op1_insn -> op1 ].type ;
15201592
1593+ if (op1_insn -> op == IR_ZEXT
1594+ && (op2_insn -> val .u64 >> (ir_type_size [type ] * 8 )) != 0 ) {
1595+ IR_FOLD_NEXT ;
1596+ }
15211597 if (IR_IS_TYPE_SIGNED (type )) {
15221598 switch (ir_type_size [type ]) {
15231599 case 1 : val .i64 = op2_insn -> val .i8 ; break ;
0 commit comments