@@ -5128,7 +5128,7 @@ export class Compiler extends DiagnosticEmitter {
5128
5128
module . binary ( BinaryOp . EqI8x16 , leftExpr , rightExpr )
5129
5129
) ;
5130
5130
}
5131
- case TypeKind . FUNCREF :
5131
+ case TypeKind . FUNCREF :
5132
5132
case TypeKind . EXTERNREF :
5133
5133
case TypeKind . EXNREF :
5134
5134
case TypeKind . ANYREF : {
@@ -5641,14 +5641,18 @@ export class Compiler extends DiagnosticEmitter {
5641
5641
// Cares about garbage bits on the RHS, but only for types smaller than 5 bits
5642
5642
var module = this . module ;
5643
5643
switch ( type . kind ) {
5644
- case TypeKind . BOOL : {
5645
- rightExpr = this . ensureSmallIntegerWrap ( rightExpr , type ) ;
5646
- // falls through
5647
- }
5644
+ case TypeKind . BOOL : return leftExpr ;
5648
5645
case TypeKind . I8 :
5649
5646
case TypeKind . I16 :
5650
5647
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
+ }
5652
5656
case TypeKind . I32 :
5653
5657
case TypeKind . U32 : {
5654
5658
return module . binary ( BinaryOp . ShlI32 , leftExpr , rightExpr ) ;
@@ -5677,10 +5681,24 @@ export class Compiler extends DiagnosticEmitter {
5677
5681
// and signedness
5678
5682
var module = this . module ;
5679
5683
switch ( type . kind ) {
5684
+ case TypeKind . BOOL : return leftExpr ;
5680
5685
case TypeKind . I8 :
5681
5686
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
+ ) ;
5684
5702
}
5685
5703
case TypeKind . I32 : {
5686
5704
return module . binary ( BinaryOp . ShrI32 , leftExpr , rightExpr ) ;
@@ -5697,15 +5715,6 @@ export class Compiler extends DiagnosticEmitter {
5697
5715
rightExpr
5698
5716
) ;
5699
5717
}
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
- }
5709
5718
case TypeKind . U32 : {
5710
5719
return module . binary ( BinaryOp . ShrU32 , leftExpr , rightExpr ) ;
5711
5720
}
@@ -5730,16 +5739,17 @@ export class Compiler extends DiagnosticEmitter {
5730
5739
// Cares about garbage bits on the LHS, but on the RHS only for types smaller than 5 bits
5731
5740
var module = this . module ;
5732
5741
switch ( type . kind ) {
5733
- case TypeKind . BOOL : {
5734
- rightExpr = this . ensureSmallIntegerWrap ( rightExpr , type ) ;
5735
- // falls through
5736
- }
5742
+ case TypeKind . BOOL : return leftExpr ;
5737
5743
case TypeKind . I8 :
5738
5744
case TypeKind . I16 :
5739
5745
case TypeKind . U8 :
5740
5746
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
+ ) ;
5743
5753
}
5744
5754
case TypeKind . I32 :
5745
5755
case TypeKind . U32 : {
0 commit comments