@@ -5128,7 +5128,7 @@ export class Compiler extends DiagnosticEmitter {
51285128 module . binary ( BinaryOp . EqI8x16 , leftExpr , rightExpr )
51295129 ) ;
51305130 }
5131- case TypeKind . FUNCREF :
5131+ case TypeKind . FUNCREF :
51325132 case TypeKind . EXTERNREF :
51335133 case TypeKind . EXNREF :
51345134 case TypeKind . ANYREF : {
@@ -5641,14 +5641,18 @@ export class Compiler extends DiagnosticEmitter {
56415641 // Cares about garbage bits on the RHS, but only for types smaller than 5 bits
56425642 var module = this . module ;
56435643 switch ( type . kind ) {
5644- case TypeKind . BOOL : {
5645- rightExpr = this . ensureSmallIntegerWrap ( rightExpr , type ) ;
5646- // falls through
5647- }
5644+ case TypeKind . BOOL : return leftExpr ;
56485645 case TypeKind . I8 :
56495646 case TypeKind . I16 :
56505647 case TypeKind . U8 :
5651- case TypeKind . U16 :
5648+ case TypeKind . U16 : {
5649+ // leftExpr << (rightExpr & (7|15))
5650+ return module . binary (
5651+ BinaryOp . ShlI32 ,
5652+ leftExpr ,
5653+ module . binary ( BinaryOp . AndI32 , rightExpr , module . i32 ( type . size - 1 ) )
5654+ ) ;
5655+ }
56525656 case TypeKind . I32 :
56535657 case TypeKind . U32 : {
56545658 return module . binary ( BinaryOp . ShlI32 , leftExpr , rightExpr ) ;
@@ -5677,10 +5681,24 @@ export class Compiler extends DiagnosticEmitter {
56775681 // and signedness
56785682 var module = this . module ;
56795683 switch ( type . kind ) {
5684+ case TypeKind . BOOL : return leftExpr ;
56805685 case TypeKind . I8 :
56815686 case TypeKind . I16 : {
5682- leftExpr = this . ensureSmallIntegerWrap ( leftExpr , type ) ;
5683- // falls through
5687+ // leftExpr >> (rightExpr & (7|15))
5688+ return module . binary (
5689+ BinaryOp . ShrI32 ,
5690+ this . ensureSmallIntegerWrap ( leftExpr , type ) ,
5691+ module . binary ( BinaryOp . AndI32 , rightExpr , module . i32 ( type . size - 1 ) )
5692+ ) ;
5693+ }
5694+ case TypeKind . U8 :
5695+ case TypeKind . U16 : {
5696+ // leftExpr >>> (rightExpr & (7|15))
5697+ return module . binary (
5698+ BinaryOp . ShrU32 ,
5699+ this . ensureSmallIntegerWrap ( leftExpr , type ) ,
5700+ module . binary ( BinaryOp . AndI32 , rightExpr , module . i32 ( type . size - 1 ) )
5701+ ) ;
56845702 }
56855703 case TypeKind . I32 : {
56865704 return module . binary ( BinaryOp . ShrI32 , leftExpr , rightExpr ) ;
@@ -5697,15 +5715,6 @@ export class Compiler extends DiagnosticEmitter {
56975715 rightExpr
56985716 ) ;
56995717 }
5700- case TypeKind . BOOL : {
5701- rightExpr = this . ensureSmallIntegerWrap ( rightExpr , type ) ;
5702- // falls through
5703- }
5704- case TypeKind . U8 :
5705- case TypeKind . U16 : {
5706- leftExpr = this . ensureSmallIntegerWrap ( leftExpr , type ) ;
5707- // falls through
5708- }
57095718 case TypeKind . U32 : {
57105719 return module . binary ( BinaryOp . ShrU32 , leftExpr , rightExpr ) ;
57115720 }
@@ -5730,16 +5739,17 @@ export class Compiler extends DiagnosticEmitter {
57305739 // Cares about garbage bits on the LHS, but on the RHS only for types smaller than 5 bits
57315740 var module = this . module ;
57325741 switch ( type . kind ) {
5733- case TypeKind . BOOL : {
5734- rightExpr = this . ensureSmallIntegerWrap ( rightExpr , type ) ;
5735- // falls through
5736- }
5742+ case TypeKind . BOOL : return leftExpr ;
57375743 case TypeKind . I8 :
57385744 case TypeKind . I16 :
57395745 case TypeKind . U8 :
57405746 case TypeKind . U16 : {
5741- leftExpr = this . ensureSmallIntegerWrap ( leftExpr , type ) ;
5742- // falls through
5747+ // leftExpr >>> (rightExpr & (7|15))
5748+ return module . binary (
5749+ BinaryOp . ShrU32 ,
5750+ this . ensureSmallIntegerWrap ( leftExpr , type ) ,
5751+ module . binary ( BinaryOp . AndI32 , rightExpr , module . i32 ( type . size - 1 ) )
5752+ ) ;
57435753 }
57445754 case TypeKind . I32 :
57455755 case TypeKind . U32 : {
0 commit comments