Fix unsigned ops; Fix parenthesized conversion; Minor restructure

This commit is contained in:
dcodeIO
2017-12-11 18:46:11 +01:00
parent b5ffaf36cd
commit b5cc2f9924
24 changed files with 1062 additions and 79 deletions

View File

@ -48,7 +48,7 @@
)
(loop $continue|0
(if
(i32.lt_s
(i32.lt_u
(get_local $0)
(get_global $game-of-life/h)
)
@ -81,7 +81,7 @@
)
(loop $continue|1
(if
(i32.lt_s
(i32.lt_u
(get_local $1)
(get_global $game-of-life/w)
)
@ -208,13 +208,13 @@
(if
(if (result i32)
(tee_local $3
(i32.lt_s
(i32.lt_u
(get_local $2)
(i32.const 2)
)
)
(get_local $3)
(i32.gt_s
(i32.gt_u
(get_local $2)
(i32.const 3)
)

View File

@ -63,7 +63,7 @@
)
(loop $continue|0
(if
(i32.lt_s
(i32.lt_u
(get_local $0)
(get_global $game-of-life/h)
)
@ -101,7 +101,7 @@
)
(loop $continue|1
(if
(i32.lt_s
(i32.lt_u
(get_local $3)
(get_global $game-of-life/w)
)
@ -237,13 +237,13 @@
(if
(if (result i32)
(tee_local $11
(i32.lt_s
(i32.lt_u
(get_local $8)
(i32.const 2)
)
)
(get_local $11)
(i32.gt_s
(i32.gt_u
(get_local $8)
(i32.const 3)
)

View File

@ -0,0 +1,301 @@
(module
(type $iiiiv (func (param i32 i32 i32 i32)))
(global $i64/lo (mut i32) (i32.const 0))
(global $i64/hi (mut i32) (i32.const 0))
(memory $0 1)
(export "add" (func $i64/add))
(export "sub" (func $i64/sub))
(export "mul" (func $i64/mul))
(export "div_s" (func $i64/div_s))
(export "div_u" (func $i64/div_u))
(export "rem_s" (func $i64/rem_s))
(export "rem_u" (func $i64/rem_u))
(export "memory" (memory $0))
(func $i64/add (; 0 ;) (type $iiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32)
(local $4 i64)
(set_global $i64/lo
(i32.wrap/i64
(tee_local $4
(i64.add
(i64.or
(i64.extend_s/i32
(get_local $0)
)
(i64.shl
(i64.extend_s/i32
(get_local $1)
)
(i64.const 32)
)
)
(i64.or
(i64.extend_s/i32
(get_local $2)
)
(i64.shl
(i64.extend_s/i32
(get_local $3)
)
(i64.const 32)
)
)
)
)
)
)
(set_global $i64/hi
(i32.wrap/i64
(i64.shr_u
(get_local $4)
(i64.const 32)
)
)
)
)
(func $i64/sub (; 1 ;) (type $iiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32)
(local $4 i64)
(set_global $i64/lo
(i32.wrap/i64
(tee_local $4
(i64.sub
(i64.or
(i64.extend_s/i32
(get_local $0)
)
(i64.shl
(i64.extend_s/i32
(get_local $1)
)
(i64.const 32)
)
)
(i64.or
(i64.extend_s/i32
(get_local $2)
)
(i64.shl
(i64.extend_s/i32
(get_local $3)
)
(i64.const 32)
)
)
)
)
)
)
(set_global $i64/hi
(i32.wrap/i64
(i64.shr_u
(get_local $4)
(i64.const 32)
)
)
)
)
(func $i64/mul (; 2 ;) (type $iiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32)
(local $4 i64)
(set_global $i64/lo
(i32.wrap/i64
(tee_local $4
(i64.mul
(i64.or
(i64.extend_s/i32
(get_local $0)
)
(i64.shl
(i64.extend_s/i32
(get_local $1)
)
(i64.const 32)
)
)
(i64.or
(i64.extend_s/i32
(get_local $2)
)
(i64.shl
(i64.extend_s/i32
(get_local $3)
)
(i64.const 32)
)
)
)
)
)
)
(set_global $i64/hi
(i32.wrap/i64
(i64.shr_u
(get_local $4)
(i64.const 32)
)
)
)
)
(func $i64/div_s (; 3 ;) (type $iiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32)
(local $4 i64)
(set_global $i64/lo
(i32.wrap/i64
(tee_local $4
(i64.div_s
(i64.or
(i64.extend_s/i32
(get_local $0)
)
(i64.shl
(i64.extend_s/i32
(get_local $1)
)
(i64.const 32)
)
)
(i64.or
(i64.extend_s/i32
(get_local $2)
)
(i64.shl
(i64.extend_s/i32
(get_local $3)
)
(i64.const 32)
)
)
)
)
)
)
(set_global $i64/hi
(i32.wrap/i64
(i64.shr_u
(get_local $4)
(i64.const 32)
)
)
)
)
(func $i64/div_u (; 4 ;) (type $iiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32)
(local $4 i64)
(set_global $i64/lo
(i32.wrap/i64
(tee_local $4
(i64.div_u
(i64.or
(i64.extend_u/i32
(get_local $0)
)
(i64.shl
(i64.extend_u/i32
(get_local $1)
)
(i64.const 32)
)
)
(i64.or
(i64.extend_u/i32
(get_local $2)
)
(i64.shl
(i64.extend_u/i32
(get_local $3)
)
(i64.const 32)
)
)
)
)
)
)
(set_global $i64/hi
(i32.wrap/i64
(i64.shr_u
(get_local $4)
(i64.const 32)
)
)
)
)
(func $i64/rem_s (; 5 ;) (type $iiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32)
(local $4 i64)
(set_global $i64/lo
(i32.wrap/i64
(tee_local $4
(i64.rem_s
(i64.or
(i64.extend_s/i32
(get_local $0)
)
(i64.shl
(i64.extend_s/i32
(get_local $1)
)
(i64.const 32)
)
)
(i64.or
(i64.extend_s/i32
(get_local $2)
)
(i64.shl
(i64.extend_s/i32
(get_local $3)
)
(i64.const 32)
)
)
)
)
)
)
(set_global $i64/hi
(i32.wrap/i64
(i64.shr_u
(get_local $4)
(i64.const 32)
)
)
)
)
(func $i64/rem_u (; 6 ;) (type $iiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32)
(local $4 i64)
(set_global $i64/lo
(i32.wrap/i64
(tee_local $4
(i64.rem_u
(i64.or
(i64.extend_u/i32
(get_local $0)
)
(i64.shl
(i64.extend_u/i32
(get_local $1)
)
(i64.const 32)
)
)
(i64.or
(i64.extend_u/i32
(get_local $2)
)
(i64.shl
(i64.extend_u/i32
(get_local $3)
)
(i64.const 32)
)
)
)
)
)
)
(set_global $i64/hi
(i32.wrap/i64
(i64.shr_u
(get_local $4)
(i64.const 32)
)
)
)
)
)

44
tests/compiler/i64.ts Normal file
View File

@ -0,0 +1,44 @@
let lo: u32;
let hi: u32;
export function add(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
const ret: i64 = (<i64>loLeft | <i64>hiLeft << 32) + (<i64>loRight | <i64>hiRight << 32);
lo = <u32>ret;
hi = <u32>(ret >>> 32);
}
export function sub(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
const ret: i64 = (<i64>loLeft | <i64>hiLeft << 32) - (<i64>loRight | <i64>hiRight << 32);
lo = <u32>ret;
hi = <u32>(ret >>> 32);
}
export function mul(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
const ret: i64 = (<i64>loLeft | <i64>hiLeft << 32) * (<i64>loRight | <i64>hiRight << 32);
lo = <u32>ret;
hi = <u32>(ret >>> 32);
}
export function div_s(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
const ret: i64 = (<i64>loLeft | <i64>hiLeft << 32) / (<i64>loRight | <i64>hiRight << 32);
lo = <u32>ret;
hi = <u32>(ret >>> 32);
}
export function div_u(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
const ret: u64 = (<u64>loLeft | <u64>hiLeft << 32) / (<u64>loRight | <u64>hiRight << 32);
lo = <u32>ret;
hi = <u32>(ret >>> 32);
}
export function rem_s(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
const ret: i64 = (<i64>loLeft | <i64>hiLeft << 32) % (<i64>loRight | <i64>hiRight << 32);
lo = <u32>ret;
hi = <u32>(ret >>> 32);
}
export function rem_u(loLeft: u32, hiLeft: u32, loRight: u32, hiRight: u32): void {
const ret: u64 = (<u64>loLeft | <u64>hiLeft << 32) % (<u64>loRight | <u64>hiRight << 32);
lo = <u32>ret;
hi = <u32>(ret >>> 32);
}

369
tests/compiler/i64.wast Normal file
View File

@ -0,0 +1,369 @@
(module
(type $iiiiv (func (param i32 i32 i32 i32)))
(global $i64/lo (mut i32) (i32.const 0))
(global $i64/hi (mut i32) (i32.const 0))
(global $HEAP_START i32 (i32.const 4))
(memory $0 1)
(export "add" (func $i64/add))
(export "sub" (func $i64/sub))
(export "mul" (func $i64/mul))
(export "div_s" (func $i64/div_s))
(export "div_u" (func $i64/div_u))
(export "rem_s" (func $i64/rem_s))
(export "rem_u" (func $i64/rem_u))
(export "memory" (memory $0))
(func $i64/add (; 0 ;) (type $iiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32)
(local $4 i64)
(block
(set_local $4
(i64.add
(i64.or
(i64.extend_s/i32
(get_local $0)
)
(i64.shl
(i64.extend_s/i32
(get_local $1)
)
(i64.const 32)
)
)
(i64.or
(i64.extend_s/i32
(get_local $2)
)
(i64.shl
(i64.extend_s/i32
(get_local $3)
)
(i64.const 32)
)
)
)
)
)
(set_global $i64/lo
(i32.wrap/i64
(get_local $4)
)
)
(set_global $i64/hi
(i32.wrap/i64
(i64.shr_u
(get_local $4)
(i64.const 32)
)
)
)
)
(func $i64/sub (; 1 ;) (type $iiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32)
(local $4 i64)
(block
(set_local $4
(i64.sub
(i64.or
(i64.extend_s/i32
(get_local $0)
)
(i64.shl
(i64.extend_s/i32
(get_local $1)
)
(i64.const 32)
)
)
(i64.or
(i64.extend_s/i32
(get_local $2)
)
(i64.shl
(i64.extend_s/i32
(get_local $3)
)
(i64.const 32)
)
)
)
)
)
(set_global $i64/lo
(i32.wrap/i64
(get_local $4)
)
)
(set_global $i64/hi
(i32.wrap/i64
(i64.shr_u
(get_local $4)
(i64.const 32)
)
)
)
)
(func $i64/mul (; 2 ;) (type $iiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32)
(local $4 i64)
(block
(set_local $4
(i64.mul
(i64.or
(i64.extend_s/i32
(get_local $0)
)
(i64.shl
(i64.extend_s/i32
(get_local $1)
)
(i64.const 32)
)
)
(i64.or
(i64.extend_s/i32
(get_local $2)
)
(i64.shl
(i64.extend_s/i32
(get_local $3)
)
(i64.const 32)
)
)
)
)
)
(set_global $i64/lo
(i32.wrap/i64
(get_local $4)
)
)
(set_global $i64/hi
(i32.wrap/i64
(i64.shr_u
(get_local $4)
(i64.const 32)
)
)
)
)
(func $i64/div_s (; 3 ;) (type $iiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32)
(local $4 i64)
(block
(set_local $4
(i64.div_s
(i64.or
(i64.extend_s/i32
(get_local $0)
)
(i64.shl
(i64.extend_s/i32
(get_local $1)
)
(i64.const 32)
)
)
(i64.or
(i64.extend_s/i32
(get_local $2)
)
(i64.shl
(i64.extend_s/i32
(get_local $3)
)
(i64.const 32)
)
)
)
)
)
(set_global $i64/lo
(i32.wrap/i64
(get_local $4)
)
)
(set_global $i64/hi
(i32.wrap/i64
(i64.shr_u
(get_local $4)
(i64.const 32)
)
)
)
)
(func $i64/div_u (; 4 ;) (type $iiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32)
(local $4 i64)
(block
(set_local $4
(i64.div_u
(i64.or
(i64.extend_u/i32
(get_local $0)
)
(i64.shl
(i64.extend_u/i32
(get_local $1)
)
(i64.const 32)
)
)
(i64.or
(i64.extend_u/i32
(get_local $2)
)
(i64.shl
(i64.extend_u/i32
(get_local $3)
)
(i64.const 32)
)
)
)
)
)
(set_global $i64/lo
(i32.wrap/i64
(get_local $4)
)
)
(set_global $i64/hi
(i32.wrap/i64
(i64.shr_u
(get_local $4)
(i64.const 32)
)
)
)
)
(func $i64/rem_s (; 5 ;) (type $iiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32)
(local $4 i64)
(block
(set_local $4
(i64.rem_s
(i64.or
(i64.extend_s/i32
(get_local $0)
)
(i64.shl
(i64.extend_s/i32
(get_local $1)
)
(i64.const 32)
)
)
(i64.or
(i64.extend_s/i32
(get_local $2)
)
(i64.shl
(i64.extend_s/i32
(get_local $3)
)
(i64.const 32)
)
)
)
)
)
(set_global $i64/lo
(i32.wrap/i64
(get_local $4)
)
)
(set_global $i64/hi
(i32.wrap/i64
(i64.shr_u
(get_local $4)
(i64.const 32)
)
)
)
)
(func $i64/rem_u (; 6 ;) (type $iiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32)
(local $4 i64)
(block
(set_local $4
(i64.rem_u
(i64.or
(i64.extend_u/i32
(get_local $0)
)
(i64.shl
(i64.extend_u/i32
(get_local $1)
)
(i64.const 32)
)
)
(i64.or
(i64.extend_u/i32
(get_local $2)
)
(i64.shl
(i64.extend_u/i32
(get_local $3)
)
(i64.const 32)
)
)
)
)
)
(set_global $i64/lo
(i32.wrap/i64
(get_local $4)
)
)
(set_global $i64/hi
(i32.wrap/i64
(i64.shr_u
(get_local $4)
(i64.const 32)
)
)
)
)
)
(;
[program.elements]
clz
ctz
popcnt
rotl
rotr
abs
ceil
copysign
floor
max
min
nearest
sqrt
trunc
current_memory
grow_memory
unreachable
load
store
reinterpret
select
sizeof
changetype
isNaN
isFinite
assert
i64/lo
i64/hi
i64/add
i64/sub
i64/mul
i64/div_s
i64/div_u
i64/rem_s
i64/rem_u
[program.exports]
i64/add
i64/sub
i64/mul
i64/div_s
i64/div_u
i64/rem_s
i64/rem_u
;)

View File

@ -19,7 +19,7 @@
(tee_local $3
(get_local $2)
)
(i32.rem_s
(i32.rem_u
(get_local $1)
(i32.const 4)
)
@ -62,7 +62,7 @@
)
(if
(i32.eqz
(i32.rem_s
(i32.rem_u
(get_local $4)
(i32.const 4)
)
@ -70,7 +70,7 @@
(block
(loop $continue|1
(if
(i32.ge_s
(i32.ge_u
(get_local $2)
(i32.const 16)
)
@ -247,7 +247,7 @@
)
)
(if
(i32.ge_s
(i32.ge_u
(get_local $2)
(i32.const 32)
)
@ -258,7 +258,7 @@
(block $tablify|0
(br_table $case0|2 $case1|2 $case2|2 $tablify|0
(i32.sub
(i32.rem_s
(i32.rem_u
(get_local $4)
(i32.const 4)
)
@ -353,7 +353,7 @@
)
(loop $continue|3
(if
(i32.ge_s
(i32.ge_u
(get_local $2)
(i32.const 17)
)
@ -532,7 +532,7 @@
)
(loop $continue|4
(if
(i32.ge_s
(i32.ge_u
(get_local $2)
(i32.const 18)
)
@ -687,7 +687,7 @@
)
(loop $continue|5
(if
(i32.ge_s
(i32.ge_u
(get_local $2)
(i32.const 19)
)

View File

@ -110,7 +110,7 @@
(tee_local $7
(get_local $2)
)
(i32.rem_s
(i32.rem_u
(get_local $4)
(i32.const 4)
)
@ -168,7 +168,7 @@
)
(if
(i32.eq
(i32.rem_s
(i32.rem_u
(get_local $3)
(i32.const 4)
)
@ -178,7 +178,7 @@
(block $break|1
(loop $continue|1
(if
(i32.ge_s
(i32.ge_u
(get_local $2)
(i32.const 16)
)
@ -380,7 +380,7 @@
)
)
(if
(i32.ge_s
(i32.ge_u
(get_local $2)
(i32.const 32)
)
@ -389,7 +389,7 @@
(block $case1|2
(block $case0|2
(set_local $13
(i32.rem_s
(i32.rem_u
(get_local $3)
(i32.const 4)
)
@ -512,7 +512,7 @@
(block $break|3
(loop $continue|3
(if
(i32.ge_s
(i32.ge_u
(get_local $2)
(i32.const 17)
)
@ -707,7 +707,7 @@
(block $break|4
(loop $continue|4
(if
(i32.ge_s
(i32.ge_u
(get_local $2)
(i32.const 18)
)
@ -874,7 +874,7 @@
(block $break|5
(loop $continue|5
(if
(i32.ge_s
(i32.ge_u
(get_local $2)
(i32.const 19)
)

View File

@ -32,14 +32,14 @@
)
(func $tlsf/control$set_block (; 2 ;) (type $iiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32)
(if
(i32.ge_s
(i32.ge_u
(get_local $1)
(i32.const 23)
)
(unreachable)
)
(if
(i32.ge_s
(i32.ge_u
(get_local $2)
(i32.const 32)
)
@ -133,7 +133,7 @@
)
(loop $continue|0
(if
(i32.lt_s
(i32.lt_u
(get_local $1)
(i32.const 23)
)
@ -151,7 +151,7 @@
)
(block
(if
(i32.ge_s
(i32.ge_u
(get_local $10)
(i32.const 23)
)
@ -178,7 +178,7 @@
)
(loop $continue|1
(if
(i32.lt_s
(i32.lt_u
(get_local $2)
(i32.const 32)
)

View File

@ -59,7 +59,7 @@
)
(func $tlsf/control$set_sl_bitmap (; 5 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32)
(if
(i32.ge_s
(i32.ge_u
(get_local $1)
(i32.const 23)
)
@ -81,14 +81,14 @@
)
(func $tlsf/control$set_block (; 6 ;) (type $iiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32)
(if
(i32.ge_s
(i32.ge_u
(get_local $1)
(i32.const 23)
)
(unreachable)
)
(if
(i32.ge_s
(i32.ge_u
(get_local $2)
(i32.const 32)
)
@ -134,7 +134,7 @@
)
(loop $continue|0
(if
(i32.lt_s
(i32.lt_u
(get_local $1)
(i32.const 23)
)
@ -149,7 +149,7 @@
)
(loop $continue|1
(if
(i32.lt_s
(i32.lt_u
(get_local $2)
(i32.const 32)
)

View File

@ -91,7 +91,7 @@
(func $tlsf/control$set_sl_bitmap (; 5 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32)
(if
(i32.eqz
(i32.lt_s
(i32.lt_u
(get_local $1)
(i32.const 23)
)
@ -115,7 +115,7 @@
(func $tlsf/control$set_block (; 6 ;) (type $iiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32)
(if
(i32.eqz
(i32.lt_s
(i32.lt_u
(get_local $1)
(i32.const 23)
)
@ -124,7 +124,7 @@
)
(if
(i32.eqz
(i32.lt_s
(i32.lt_u
(get_local $2)
(i32.const 32)
)
@ -174,7 +174,7 @@
)
(loop $continue|0
(if
(i32.lt_s
(i32.lt_u
(get_local $1)
(i32.const 23)
)
@ -193,7 +193,7 @@
)
(loop $continue|1
(if
(i32.lt_s
(i32.lt_u
(get_local $2)
(i32.const 32)
)