diff --git a/std/assembly/polyfills.ts b/std/assembly/polyfills.ts index a17582ea4b..3a4295caa2 100644 --- a/std/assembly/polyfills.ts +++ b/std/assembly/polyfills.ts @@ -1,12 +1,15 @@ export function bswap(value: T): T { if (isInteger()) { + if (sizeof() == 1) { + return value; + } if (sizeof() == 2) { - return ((value << 8) | ((value >>> 8) & 0x00FF)); + return (value << 8 | (value >> 8)); } if (sizeof() == 4) { return ( - rotl(value & 0xFF00FF00, 8) | - rotr(value & 0x00FF00FF, 8) + rotl(value & 0xFF00FF00, 8) | + rotr(value & 0x00FF00FF, 8) ); } if (sizeof() == 8) { @@ -14,26 +17,30 @@ export function bswap(value: T): T { let b = (value & 0x00FF00FF00FF00FF) << 8; let v = a | b; - a = (v >> 16) & 0x0000FFFF0000FFFF; + a = (v >>> 16) & 0x0000FFFF0000FFFF; b = (v & 0x0000FFFF0000FFFF) << 16; - return rotr(a | b, 32); + return rotr(a | b, 32); } - return value; } - assert(false); - return value; + ERROR("Unsupported generic type"); } export function bswap16(value: T): T { - if (isInteger() && sizeof() <= 4) { + if (isInteger()) { + if (sizeof() == 1) { + return value; + } if (sizeof() == 2) { - return ((value << 8) | ((value >>> 8) & 0x00FF)); - } else if (sizeof() == 4) { - return (((value << 8) & 0xFF00) | ((value >>> 8) & 0x00FF) | (value & 0xFFFF0000)); + return (value << 8 | (value >> 8)); + } + if (sizeof() == 4) { + return ( + (((value & 0xFF) << 8)) | + ((value >> 8) & 0xFF) | + (value & 0xFFFF0000) + ); } - return value; } - assert(false); - return value; + ERROR("Unsupported generic type"); } diff --git a/tests/compiler/std/array.untouched.wat b/tests/compiler/std/array.untouched.wat index 1d376833f6..c2c0f7c8d6 100644 --- a/tests/compiler/std/array.untouched.wat +++ b/tests/compiler/std/array.untouched.wat @@ -5179,6 +5179,10 @@ i32.const 1 drop i32.const 8 + i32.const 1 + i32.eq + drop + i32.const 8 i32.const 2 i32.eq drop diff --git a/tests/compiler/std/dataview.untouched.wat b/tests/compiler/std/dataview.untouched.wat index 23b9b1b8e5..c7a83d2dd4 100644 --- a/tests/compiler/std/dataview.untouched.wat +++ b/tests/compiler/std/dataview.untouched.wat @@ -2498,6 +2498,10 @@ i32.const 1 drop i32.const 4 + i32.const 1 + i32.eq + drop + i32.const 4 i32.const 2 i32.eq drop @@ -2561,6 +2565,10 @@ i32.const 1 drop i32.const 8 + i32.const 1 + i32.eq + drop + i32.const 8 i32.const 2 i32.eq drop @@ -2666,6 +2674,10 @@ i32.const 1 drop i32.const 2 + i32.const 1 + i32.eq + drop + i32.const 2 i32.const 2 i32.eq drop @@ -2681,8 +2693,6 @@ i32.const 15 i32.and i32.shr_u - i32.const 255 - i32.and i32.or return ) diff --git a/tests/compiler/std/polyfills.untouched.wat b/tests/compiler/std/polyfills.untouched.wat index 044d17a884..0833eb66e6 100644 --- a/tests/compiler/std/polyfills.untouched.wat +++ b/tests/compiler/std/polyfills.untouched.wat @@ -17,15 +17,7 @@ i32.const 1 drop i32.const 1 - i32.const 2 - i32.eq - drop i32.const 1 - i32.const 4 - i32.eq - drop - i32.const 1 - i32.const 8 i32.eq drop local.get $0 @@ -35,15 +27,7 @@ i32.const 1 drop i32.const 1 - i32.const 2 - i32.eq - drop i32.const 1 - i32.const 4 - i32.eq - drop - i32.const 1 - i32.const 8 i32.eq drop local.get $0 @@ -53,6 +37,10 @@ i32.const 1 drop i32.const 2 + i32.const 1 + i32.eq + drop + i32.const 2 i32.const 2 i32.eq drop @@ -68,8 +56,6 @@ i32.const 15 i32.and i32.shr_u - i32.const 255 - i32.and i32.or return ) @@ -77,6 +63,10 @@ i32.const 1 drop i32.const 2 + i32.const 1 + i32.eq + drop + i32.const 2 i32.const 2 i32.eq drop @@ -86,13 +76,12 @@ i32.and i32.shl local.get $0 - i32.extend16_s + i32.const 65535 + i32.and i32.const 8 i32.const 15 i32.and i32.shr_u - i32.const 255 - i32.and i32.or return ) @@ -100,6 +89,10 @@ i32.const 1 drop i32.const 4 + i32.const 1 + i32.eq + drop + i32.const 4 i32.const 2 i32.eq drop @@ -124,6 +117,10 @@ i32.const 1 drop i32.const 4 + i32.const 1 + i32.eq + drop + i32.const 4 i32.const 2 i32.eq drop @@ -151,6 +148,10 @@ i32.const 1 drop i32.const 8 + i32.const 1 + i32.eq + drop + i32.const 8 i32.const 2 i32.eq drop @@ -204,6 +205,10 @@ i32.const 1 drop i32.const 8 + i32.const 1 + i32.eq + drop + i32.const 8 i32.const 2 i32.eq drop @@ -254,6 +259,10 @@ i32.const 1 drop i32.const 4 + i32.const 1 + i32.eq + drop + i32.const 4 i32.const 2 i32.eq drop @@ -278,6 +287,10 @@ i32.const 1 drop i32.const 4 + i32.const 1 + i32.eq + drop + i32.const 4 i32.const 2 i32.eq drop @@ -300,15 +313,9 @@ ) (func $~lib/polyfills/bswap16 (param $0 i32) (result i32) i32.const 1 - i32.const 4 - i32.le_u drop i32.const 1 - i32.const 2 - i32.eq - drop i32.const 1 - i32.const 4 i32.eq drop local.get $0 @@ -316,24 +323,20 @@ ) (func $~lib/polyfills/bswap16 (param $0 i32) (result i32) i32.const 1 - i32.const 4 - i32.le_u drop i32.const 1 - i32.const 2 - i32.eq - drop i32.const 1 - i32.const 4 i32.eq drop local.get $0 return ) (func $~lib/polyfills/bswap16 (param $0 i32) (result i32) + i32.const 1 + drop i32.const 2 - i32.const 4 - i32.le_u + i32.const 1 + i32.eq drop i32.const 2 i32.const 2 @@ -351,15 +354,15 @@ i32.const 15 i32.and i32.shr_u - i32.const 255 - i32.and i32.or return ) (func $~lib/polyfills/bswap16 (param $0 i32) (result i32) + i32.const 1 + drop i32.const 2 - i32.const 4 - i32.le_u + i32.const 1 + i32.eq drop i32.const 2 i32.const 2 @@ -371,20 +374,21 @@ i32.and i32.shl local.get $0 - i32.extend16_s + i32.const 65535 + i32.and i32.const 8 i32.const 15 i32.and i32.shr_u - i32.const 255 - i32.and i32.or return ) (func $~lib/polyfills/bswap16 (param $0 i32) (result i32) + i32.const 1 + drop i32.const 4 - i32.const 4 - i32.le_u + i32.const 1 + i32.eq drop i32.const 4 i32.const 2 @@ -395,10 +399,10 @@ i32.eq drop local.get $0 + i32.const 255 + i32.and i32.const 8 i32.shl - i32.const 65280 - i32.and local.get $0 i32.const 8 i32.shr_u @@ -412,9 +416,11 @@ return ) (func $~lib/polyfills/bswap16 (param $0 i32) (result i32) + i32.const 1 + drop i32.const 4 - i32.const 4 - i32.le_u + i32.const 1 + i32.eq drop i32.const 4 i32.const 2 @@ -425,10 +431,10 @@ i32.eq drop local.get $0 + i32.const 255 + i32.and i32.const 8 i32.shl - i32.const 65280 - i32.and local.get $0 i32.const 8 i32.shr_u diff --git a/tests/compiler/std/typedarray.untouched.wat b/tests/compiler/std/typedarray.untouched.wat index 4af3dd3e29..bf2c7a5a80 100644 --- a/tests/compiler/std/typedarray.untouched.wat +++ b/tests/compiler/std/typedarray.untouched.wat @@ -13253,6 +13253,10 @@ i32.const 1 drop i32.const 8 + i32.const 1 + i32.eq + drop + i32.const 8 i32.const 2 i32.eq drop