[JS IR] Add an implicit cast to int32 for the shru operator
^KT-20791 Fixed
This commit is contained in:
committed by
Space
parent
9281ab334a
commit
bf57e33713
+2
-1
@@ -41,7 +41,8 @@ class NumberOperatorCallsTransformer(context: JsIrBackendContext) : CallsTransfo
|
|||||||
irBuiltIns.intType.let {
|
irBuiltIns.intType.let {
|
||||||
add(it, OperatorNames.SHL, intrinsics.jsBitShiftL)
|
add(it, OperatorNames.SHL, intrinsics.jsBitShiftL)
|
||||||
add(it, OperatorNames.SHR, intrinsics.jsBitShiftR)
|
add(it, OperatorNames.SHR, intrinsics.jsBitShiftR)
|
||||||
add(it, OperatorNames.SHRU, intrinsics.jsBitShiftRU)
|
// shifting of a negative int to 0 bytes returns the unsigned int, therefore we have to cast it back to the signed int
|
||||||
|
add(it, OperatorNames.SHRU) { call -> irBinaryOp(call, intrinsics.jsBitShiftRU, toInt32 = true) }
|
||||||
add(it, OperatorNames.AND, intrinsics.jsBitAnd)
|
add(it, OperatorNames.AND, intrinsics.jsBitAnd)
|
||||||
add(it, OperatorNames.OR, intrinsics.jsBitOr)
|
add(it, OperatorNames.OR, intrinsics.jsBitOr)
|
||||||
add(it, OperatorNames.XOR, intrinsics.jsBitXor)
|
add(it, OperatorNames.XOR, intrinsics.jsBitXor)
|
||||||
|
|||||||
+6
@@ -8070,6 +8070,12 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest {
|
|||||||
runTest("js/js.translator/testData/box/number/incDecOptimization.kt");
|
runTest("js/js.translator/testData/box/number/incDecOptimization.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("intBitOperations.kt")
|
||||||
|
public void testIntBitOperations() throws Exception {
|
||||||
|
runTest("js/js.translator/testData/box/number/intBitOperations.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("intConversions.kt")
|
@TestMetadata("intConversions.kt")
|
||||||
public void testIntConversions() throws Exception {
|
public void testIntConversions() throws Exception {
|
||||||
|
|||||||
@@ -0,0 +1,69 @@
|
|||||||
|
// DONT_TARGET_EXACT_BACKEND: JS
|
||||||
|
|
||||||
|
fun testShl() {
|
||||||
|
// wrapper prevents the constants folding
|
||||||
|
infix fun Int.myShl(y: Int): Int = this shl y
|
||||||
|
|
||||||
|
assertEquals(0 myShl 0, 0)
|
||||||
|
assertEquals(0 myShl 1, 0)
|
||||||
|
assertEquals(1 myShl 1, 2)
|
||||||
|
assertEquals(3 myShl 1, 6)
|
||||||
|
|
||||||
|
assertEquals(-1 myShl 0, -1)
|
||||||
|
assertEquals(-1 myShl 1, -2)
|
||||||
|
assertEquals(-1 myShl 2, -4)
|
||||||
|
|
||||||
|
assertEquals(Int.MIN_VALUE myShl 0, Int.MIN_VALUE)
|
||||||
|
assertEquals(Int.MIN_VALUE myShl 1, 0)
|
||||||
|
|
||||||
|
assertEquals(Int.MAX_VALUE myShl 0, Int.MAX_VALUE)
|
||||||
|
assertEquals(Int.MAX_VALUE myShl 1, -2)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun testShr() {
|
||||||
|
// wrapper prevents the constants folding
|
||||||
|
infix fun Int.myShr(y: Int): Int = this shr y
|
||||||
|
|
||||||
|
assertEquals(0 myShr 0, 0)
|
||||||
|
assertEquals(0 myShr 1, 0)
|
||||||
|
assertEquals(1 myShr 1, 0)
|
||||||
|
assertEquals(3 myShr 1, 1)
|
||||||
|
|
||||||
|
assertEquals(-1 myShr 0, -1)
|
||||||
|
assertEquals(-1 myShr 1, -1)
|
||||||
|
assertEquals(-1 myShr 2, -1)
|
||||||
|
|
||||||
|
assertEquals(Int.MIN_VALUE myShr 0, Int.MIN_VALUE)
|
||||||
|
assertEquals(Int.MIN_VALUE myShr 1, Int.MIN_VALUE / 2)
|
||||||
|
|
||||||
|
assertEquals(Int.MAX_VALUE myShr 0, Int.MAX_VALUE)
|
||||||
|
assertEquals(Int.MAX_VALUE myShr 1, 0x3FFFFFFF)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun testUshr() {
|
||||||
|
// wrapper prevents the constants folding
|
||||||
|
infix fun Int.myUshr(y: Int): Int = this ushr y
|
||||||
|
|
||||||
|
assertEquals(0 myUshr 0, 0)
|
||||||
|
assertEquals(0 myUshr 1, 0)
|
||||||
|
assertEquals(1 myUshr 1, 0)
|
||||||
|
assertEquals(3 myUshr 1, 1)
|
||||||
|
|
||||||
|
assertEquals(-1 myUshr 0, -1)
|
||||||
|
assertEquals(-1 myUshr 1, 0x7FFFFFFF)
|
||||||
|
assertEquals(-1 myUshr 2, 0x3FFFFFFF)
|
||||||
|
|
||||||
|
assertEquals(Int.MIN_VALUE myUshr 0, Int.MIN_VALUE)
|
||||||
|
assertEquals(Int.MIN_VALUE myUshr 1, 0x40000000)
|
||||||
|
|
||||||
|
assertEquals(Int.MAX_VALUE myUshr 0, Int.MAX_VALUE)
|
||||||
|
assertEquals(Int.MAX_VALUE myUshr 1, 0x3FFFFFFF)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
testShl()
|
||||||
|
testShr()
|
||||||
|
testUshr()
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user