diff --git a/std/assembly/typedarray.ts b/std/assembly/typedarray.ts index 04238018..d878a9f2 100644 --- a/std/assembly/typedarray.ts +++ b/std/assembly/typedarray.ts @@ -956,11 +956,10 @@ function SUBARRAY( begin: i32, end: i32 ): TArray { - var length = array.length; - if (begin < 0) begin = max(length + begin, 0); - else begin = min(begin, length); - if (end < 0) end = max(length + end, begin); - else end = max(min(end, length), begin); + var len = array.length; + begin = begin < 0 ? max(len + begin, 0) : min(begin, len); + end = end < 0 ? max(len + end, 0) : min(end, len); + end = max(end, begin); var out = changetype(__alloc(offsetof(), idof())); // retains out.data = array.data; // retains out.dataStart = array.dataStart + (begin << alignof()); diff --git a/tests/compiler/std/typedarray.optimized.wat b/tests/compiler/std/typedarray.optimized.wat index 7b7217eb..b57af602 100644 --- a/tests/compiler/std/typedarray.optimized.wat +++ b/tests/compiler/std/typedarray.optimized.wat @@ -2246,9 +2246,9 @@ local.get $3 i32.add local.tee $1 - local.get $0 + i32.const 0 local.get $1 - local.get $0 + i32.const 0 i32.gt_s select else @@ -2258,12 +2258,6 @@ local.get $3 i32.lt_s select - local.tee $1 - local.get $0 - local.get $1 - local.get $0 - i32.gt_s - select end local.set $2 i32.const 12 @@ -2288,6 +2282,11 @@ local.get $1 local.get $2 local.get $0 + local.get $2 + local.get $0 + i32.gt_s + select + local.get $0 i32.sub i32.const 2 i32.shl @@ -2375,9 +2374,9 @@ local.get $3 i32.add local.tee $1 - local.get $0 + i32.const 0 local.get $1 - local.get $0 + i32.const 0 i32.gt_s select else @@ -2387,12 +2386,6 @@ local.get $3 i32.lt_s select - local.tee $1 - local.get $0 - local.get $1 - local.get $0 - i32.gt_s - select end local.set $2 i32.const 12 @@ -2417,6 +2410,11 @@ local.get $1 local.get $2 local.get $0 + local.get $2 + local.get $0 + i32.gt_s + select + local.get $0 i32.sub i32.const 3 i32.shl @@ -3462,9 +3460,9 @@ local.get $3 i32.add local.tee $1 - local.get $0 + i32.const 0 local.get $1 - local.get $0 + i32.const 0 i32.gt_s select else @@ -3474,12 +3472,6 @@ local.get $3 i32.lt_s select - local.tee $1 - local.get $0 - local.get $1 - local.get $0 - i32.gt_s - select end local.set $2 i32.const 12 @@ -3502,6 +3494,11 @@ local.get $1 local.get $2 local.get $0 + local.get $2 + local.get $0 + i32.gt_s + select + local.get $0 i32.sub i32.store offset=8 local.get $4 @@ -11973,17 +11970,11 @@ (local $1 i32) (local $2 i32) (local $3 i32) - i32.const 8 local.get $0 call $~lib/rt/pure/__retain local.tee $2 i32.load offset=8 - local.tee $1 - i32.const 8 - local.get $1 - i32.lt_s - select - local.set $3 + local.set $1 i32.const 12 i32.const 4 call $~lib/rt/tlsf/__alloc @@ -12002,29 +11993,35 @@ local.get $1 i32.lt_s select - local.tee $1 + local.tee $3 local.get $2 i32.load offset=4 i32.add i32.store offset=4 local.get $0 + i32.const 8 + local.get $1 + i32.const 8 + local.get $1 + i32.lt_s + select + local.tee $1 local.get $3 local.get $1 local.get $3 - local.get $1 i32.gt_s select - local.get $1 + local.get $3 i32.sub i32.store offset=8 local.get $2 call $~lib/rt/pure/__release local.get $0 call $~lib/rt/pure/__retain - local.set $2 + local.set $1 local.get $0 call $~lib/rt/pure/__release - local.get $2 + local.get $1 ) (func $std/typedarray/testArrayReverse<~lib/typedarray/Uint8Array,u8> (; 263 ;) (type $FUNCSIG$v) (local $0 i32) @@ -12190,17 +12187,11 @@ (local $1 i32) (local $2 i32) (local $3 i32) - i32.const 8 local.get $0 call $~lib/rt/pure/__retain local.tee $2 i32.load offset=8 - local.tee $1 - i32.const 8 - local.get $1 - i32.lt_s - select - local.set $3 + local.set $1 i32.const 12 i32.const 5 call $~lib/rt/tlsf/__alloc @@ -12219,29 +12210,35 @@ local.get $1 i32.lt_s select - local.tee $1 + local.tee $3 local.get $2 i32.load offset=4 i32.add i32.store offset=4 local.get $0 + i32.const 8 + local.get $1 + i32.const 8 + local.get $1 + i32.lt_s + select + local.tee $1 local.get $3 local.get $1 local.get $3 - local.get $1 i32.gt_s select - local.get $1 + local.get $3 i32.sub i32.store offset=8 local.get $2 call $~lib/rt/pure/__release local.get $0 call $~lib/rt/pure/__retain - local.set $2 + local.set $1 local.get $0 call $~lib/rt/pure/__release - local.get $2 + local.get $1 ) (func $std/typedarray/testArrayReverse<~lib/typedarray/Uint8ClampedArray,u8> (; 265 ;) (type $FUNCSIG$v) (local $0 i32) @@ -12486,12 +12483,6 @@ local.get $1 i32.lt_s select - local.tee $1 - local.get $0 - local.get $1 - local.get $0 - i32.gt_s - select local.set $3 i32.const 12 i32.const 6 @@ -12515,6 +12506,11 @@ local.get $1 local.get $3 local.get $0 + local.get $3 + local.get $0 + i32.gt_s + select + local.get $0 i32.sub i32.const 1 i32.shl @@ -12777,12 +12773,6 @@ local.get $1 i32.lt_s select - local.tee $1 - local.get $0 - local.get $1 - local.get $0 - i32.gt_s - select local.set $3 i32.const 12 i32.const 7 @@ -12806,6 +12796,11 @@ local.get $1 local.get $3 local.get $0 + local.get $3 + local.get $0 + i32.gt_s + select + local.get $0 i32.sub i32.const 1 i32.shl @@ -13218,12 +13213,6 @@ local.get $1 i32.lt_s select - local.tee $1 - local.get $0 - local.get $1 - local.get $0 - i32.gt_s - select local.set $3 i32.const 12 i32.const 9 @@ -13247,6 +13236,11 @@ local.get $1 local.get $3 local.get $0 + local.get $3 + local.get $0 + i32.gt_s + select + local.get $0 i32.sub i32.const 2 i32.shl @@ -13497,12 +13491,6 @@ local.get $1 i32.lt_s select - local.tee $1 - local.get $0 - local.get $1 - local.get $0 - i32.gt_s - select local.set $3 i32.const 12 i32.const 10 @@ -13526,6 +13514,11 @@ local.get $1 local.get $3 local.get $0 + local.get $3 + local.get $0 + i32.gt_s + select + local.get $0 i32.sub i32.const 3 i32.shl @@ -13717,12 +13710,6 @@ local.get $1 i32.lt_s select - local.tee $1 - local.get $0 - local.get $1 - local.get $0 - i32.gt_s - select local.set $3 i32.const 12 i32.const 11 @@ -13746,6 +13733,11 @@ local.get $1 local.get $3 local.get $0 + local.get $3 + local.get $0 + i32.gt_s + select + local.get $0 i32.sub i32.const 3 i32.shl @@ -13999,12 +13991,6 @@ local.get $1 i32.lt_s select - local.tee $1 - local.get $0 - local.get $1 - local.get $0 - i32.gt_s - select local.set $3 i32.const 12 i32.const 12 @@ -14028,6 +14014,11 @@ local.get $1 local.get $3 local.get $0 + local.get $3 + local.get $0 + i32.gt_s + select + local.get $0 i32.sub i32.const 2 i32.shl diff --git a/tests/compiler/std/typedarray.untouched.wat b/tests/compiler/std/typedarray.untouched.wat index d0a67dcb..9970ce74 100644 --- a/tests/compiler/std/typedarray.untouched.wat +++ b/tests/compiler/std/typedarray.untouched.wat @@ -4120,7 +4120,7 @@ local.get $4 i32.const 0 i32.lt_s - if + if (result i32) local.get $6 local.get $4 i32.add @@ -4131,7 +4131,6 @@ local.get $8 i32.gt_s select - local.set $4 else local.get $4 local.tee $7 @@ -4141,23 +4140,22 @@ local.get $8 i32.lt_s select - local.set $4 end + local.set $4 local.get $3 i32.const 0 i32.lt_s - if + if (result i32) local.get $6 local.get $3 i32.add local.tee $7 - local.get $4 + i32.const 0 local.tee $8 local.get $7 local.get $8 i32.gt_s select - local.set $3 else local.get $3 local.tee $7 @@ -4167,15 +4165,17 @@ local.get $8 i32.lt_s select - local.tee $7 - local.get $4 - local.tee $8 - local.get $7 - local.get $8 - i32.gt_s - select - local.set $3 end + local.set $3 + local.get $3 + local.tee $7 + local.get $4 + local.tee $8 + local.get $7 + local.get $8 + i32.gt_s + select + local.set $3 i32.const 12 i32.const 8 call $~lib/rt/tlsf/__alloc @@ -4274,7 +4274,7 @@ local.get $4 i32.const 0 i32.lt_s - if + if (result i32) local.get $6 local.get $4 i32.add @@ -4285,7 +4285,6 @@ local.get $8 i32.gt_s select - local.set $4 else local.get $4 local.tee $7 @@ -4295,23 +4294,22 @@ local.get $8 i32.lt_s select - local.set $4 end + local.set $4 local.get $3 i32.const 0 i32.lt_s - if + if (result i32) local.get $6 local.get $3 i32.add local.tee $7 - local.get $4 + i32.const 0 local.tee $8 local.get $7 local.get $8 i32.gt_s select - local.set $3 else local.get $3 local.tee $7 @@ -4321,15 +4319,17 @@ local.get $8 i32.lt_s select - local.tee $7 - local.get $4 - local.tee $8 - local.get $7 - local.get $8 - i32.gt_s - select - local.set $3 end + local.set $3 + local.get $3 + local.tee $7 + local.get $4 + local.tee $8 + local.get $7 + local.get $8 + i32.gt_s + select + local.set $3 i32.const 12 i32.const 13 call $~lib/rt/tlsf/__alloc @@ -5583,7 +5583,7 @@ local.get $4 i32.const 0 i32.lt_s - if + if (result i32) local.get $6 local.get $4 i32.add @@ -5594,7 +5594,6 @@ local.get $8 i32.gt_s select - local.set $4 else local.get $4 local.tee $7 @@ -5604,23 +5603,22 @@ local.get $8 i32.lt_s select - local.set $4 end + local.set $4 local.get $3 i32.const 0 i32.lt_s - if + if (result i32) local.get $6 local.get $3 i32.add local.tee $7 - local.get $4 + i32.const 0 local.tee $8 local.get $7 local.get $8 i32.gt_s select - local.set $3 else local.get $3 local.tee $7 @@ -5630,15 +5628,17 @@ local.get $8 i32.lt_s select - local.tee $7 - local.get $4 - local.tee $8 - local.get $7 - local.get $8 - i32.gt_s - select - local.set $3 end + local.set $3 + local.get $3 + local.tee $7 + local.get $4 + local.tee $8 + local.get $7 + local.get $8 + i32.gt_s + select + local.set $3 i32.const 12 i32.const 3 call $~lib/rt/tlsf/__alloc @@ -18613,7 +18613,7 @@ local.get $4 i32.const 0 i32.lt_s - if + if (result i32) local.get $6 local.get $4 i32.add @@ -18624,7 +18624,6 @@ local.get $8 i32.gt_s select - local.set $4 else local.get $4 local.tee $7 @@ -18634,23 +18633,22 @@ local.get $8 i32.lt_s select - local.set $4 end + local.set $4 local.get $3 i32.const 0 i32.lt_s - if + if (result i32) local.get $6 local.get $3 i32.add local.tee $7 - local.get $4 + i32.const 0 local.tee $8 local.get $7 local.get $8 i32.gt_s select - local.set $3 else local.get $3 local.tee $7 @@ -18660,15 +18658,17 @@ local.get $8 i32.lt_s select - local.tee $7 - local.get $4 - local.tee $8 - local.get $7 - local.get $8 - i32.gt_s - select - local.set $3 end + local.set $3 + local.get $3 + local.tee $7 + local.get $4 + local.tee $8 + local.get $7 + local.get $8 + i32.gt_s + select + local.set $3 i32.const 12 i32.const 4 call $~lib/rt/tlsf/__alloc @@ -18987,7 +18987,7 @@ local.get $4 i32.const 0 i32.lt_s - if + if (result i32) local.get $6 local.get $4 i32.add @@ -18998,7 +18998,6 @@ local.get $8 i32.gt_s select - local.set $4 else local.get $4 local.tee $7 @@ -19008,23 +19007,22 @@ local.get $8 i32.lt_s select - local.set $4 end + local.set $4 local.get $3 i32.const 0 i32.lt_s - if + if (result i32) local.get $6 local.get $3 i32.add local.tee $7 - local.get $4 + i32.const 0 local.tee $8 local.get $7 local.get $8 i32.gt_s select - local.set $3 else local.get $3 local.tee $7 @@ -19034,15 +19032,17 @@ local.get $8 i32.lt_s select - local.tee $7 - local.get $4 - local.tee $8 - local.get $7 - local.get $8 - i32.gt_s - select - local.set $3 end + local.set $3 + local.get $3 + local.tee $7 + local.get $4 + local.tee $8 + local.get $7 + local.get $8 + i32.gt_s + select + local.set $3 i32.const 12 i32.const 5 call $~lib/rt/tlsf/__alloc @@ -19361,7 +19361,7 @@ local.get $4 i32.const 0 i32.lt_s - if + if (result i32) local.get $6 local.get $4 i32.add @@ -19372,7 +19372,6 @@ local.get $8 i32.gt_s select - local.set $4 else local.get $4 local.tee $7 @@ -19382,23 +19381,22 @@ local.get $8 i32.lt_s select - local.set $4 end + local.set $4 local.get $3 i32.const 0 i32.lt_s - if + if (result i32) local.get $6 local.get $3 i32.add local.tee $7 - local.get $4 + i32.const 0 local.tee $8 local.get $7 local.get $8 i32.gt_s select - local.set $3 else local.get $3 local.tee $7 @@ -19408,15 +19406,17 @@ local.get $8 i32.lt_s select - local.tee $7 - local.get $4 - local.tee $8 - local.get $7 - local.get $8 - i32.gt_s - select - local.set $3 end + local.set $3 + local.get $3 + local.tee $7 + local.get $4 + local.tee $8 + local.get $7 + local.get $8 + i32.gt_s + select + local.set $3 i32.const 12 i32.const 6 call $~lib/rt/tlsf/__alloc @@ -19741,7 +19741,7 @@ local.get $4 i32.const 0 i32.lt_s - if + if (result i32) local.get $6 local.get $4 i32.add @@ -19752,7 +19752,6 @@ local.get $8 i32.gt_s select - local.set $4 else local.get $4 local.tee $7 @@ -19762,23 +19761,22 @@ local.get $8 i32.lt_s select - local.set $4 end + local.set $4 local.get $3 i32.const 0 i32.lt_s - if + if (result i32) local.get $6 local.get $3 i32.add local.tee $7 - local.get $4 + i32.const 0 local.tee $8 local.get $7 local.get $8 i32.gt_s select - local.set $3 else local.get $3 local.tee $7 @@ -19788,15 +19786,17 @@ local.get $8 i32.lt_s select - local.tee $7 - local.get $4 - local.tee $8 - local.get $7 - local.get $8 - i32.gt_s - select - local.set $3 end + local.set $3 + local.get $3 + local.tee $7 + local.get $4 + local.tee $8 + local.get $7 + local.get $8 + i32.gt_s + select + local.set $3 i32.const 12 i32.const 7 call $~lib/rt/tlsf/__alloc @@ -20365,7 +20365,7 @@ local.get $4 i32.const 0 i32.lt_s - if + if (result i32) local.get $6 local.get $4 i32.add @@ -20376,7 +20376,6 @@ local.get $8 i32.gt_s select - local.set $4 else local.get $4 local.tee $7 @@ -20386,23 +20385,22 @@ local.get $8 i32.lt_s select - local.set $4 end + local.set $4 local.get $3 i32.const 0 i32.lt_s - if + if (result i32) local.get $6 local.get $3 i32.add local.tee $7 - local.get $4 + i32.const 0 local.tee $8 local.get $7 local.get $8 i32.gt_s select - local.set $3 else local.get $3 local.tee $7 @@ -20412,15 +20410,17 @@ local.get $8 i32.lt_s select - local.tee $7 - local.get $4 - local.tee $8 - local.get $7 - local.get $8 - i32.gt_s - select - local.set $3 end + local.set $3 + local.get $3 + local.tee $7 + local.get $4 + local.tee $8 + local.get $7 + local.get $8 + i32.gt_s + select + local.set $3 i32.const 12 i32.const 9 call $~lib/rt/tlsf/__alloc @@ -20733,7 +20733,7 @@ local.get $4 i32.const 0 i32.lt_s - if + if (result i32) local.get $6 local.get $4 i32.add @@ -20744,7 +20744,6 @@ local.get $8 i32.gt_s select - local.set $4 else local.get $4 local.tee $7 @@ -20754,23 +20753,22 @@ local.get $8 i32.lt_s select - local.set $4 end + local.set $4 local.get $3 i32.const 0 i32.lt_s - if + if (result i32) local.get $6 local.get $3 i32.add local.tee $7 - local.get $4 + i32.const 0 local.tee $8 local.get $7 local.get $8 i32.gt_s select - local.set $3 else local.get $3 local.tee $7 @@ -20780,15 +20778,17 @@ local.get $8 i32.lt_s select - local.tee $7 - local.get $4 - local.tee $8 - local.get $7 - local.get $8 - i32.gt_s - select - local.set $3 end + local.set $3 + local.get $3 + local.tee $7 + local.get $4 + local.tee $8 + local.get $7 + local.get $8 + i32.gt_s + select + local.set $3 i32.const 12 i32.const 10 call $~lib/rt/tlsf/__alloc @@ -21104,7 +21104,7 @@ local.get $4 i32.const 0 i32.lt_s - if + if (result i32) local.get $6 local.get $4 i32.add @@ -21115,7 +21115,6 @@ local.get $8 i32.gt_s select - local.set $4 else local.get $4 local.tee $7 @@ -21125,23 +21124,22 @@ local.get $8 i32.lt_s select - local.set $4 end + local.set $4 local.get $3 i32.const 0 i32.lt_s - if + if (result i32) local.get $6 local.get $3 i32.add local.tee $7 - local.get $4 + i32.const 0 local.tee $8 local.get $7 local.get $8 i32.gt_s select - local.set $3 else local.get $3 local.tee $7 @@ -21151,15 +21149,17 @@ local.get $8 i32.lt_s select - local.tee $7 - local.get $4 - local.tee $8 - local.get $7 - local.get $8 - i32.gt_s - select - local.set $3 end + local.set $3 + local.get $3 + local.tee $7 + local.get $4 + local.tee $8 + local.get $7 + local.get $8 + i32.gt_s + select + local.set $3 i32.const 12 i32.const 11 call $~lib/rt/tlsf/__alloc @@ -21475,7 +21475,7 @@ local.get $4 i32.const 0 i32.lt_s - if + if (result i32) local.get $6 local.get $4 i32.add @@ -21486,7 +21486,6 @@ local.get $8 i32.gt_s select - local.set $4 else local.get $4 local.tee $7 @@ -21496,23 +21495,22 @@ local.get $8 i32.lt_s select - local.set $4 end + local.set $4 local.get $3 i32.const 0 i32.lt_s - if + if (result i32) local.get $6 local.get $3 i32.add local.tee $7 - local.get $4 + i32.const 0 local.tee $8 local.get $7 local.get $8 i32.gt_s select - local.set $3 else local.get $3 local.tee $7 @@ -21522,15 +21520,17 @@ local.get $8 i32.lt_s select - local.tee $7 - local.get $4 - local.tee $8 - local.get $7 - local.get $8 - i32.gt_s - select - local.set $3 end + local.set $3 + local.get $3 + local.tee $7 + local.get $4 + local.tee $8 + local.get $7 + local.get $8 + i32.gt_s + select + local.set $3 i32.const 12 i32.const 12 call $~lib/rt/tlsf/__alloc