Switch signed/unsigned instructions when upcasting 32- to 64-bit integers, fixes #247

Matches C semantics now. Turns around some instructions in tests, especially libm, but doesn't break anything.
This commit is contained in:
dcodeIO 2018-09-10 14:25:33 +02:00
parent 9603c13fb7
commit 6949cf9f9e
17 changed files with 231 additions and 96 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -2641,7 +2641,7 @@ export class Compiler extends DiagnosticEmitter {
// i32 or smaller to i64
} else if (toType.is(TypeFlags.LONG)) {
expr = module.createUnary(
toType.is(TypeFlags.SIGNED) ? UnaryOp.ExtendI32 : UnaryOp.ExtendU32,
fromType.is(TypeFlags.SIGNED) ? UnaryOp.ExtendI32 : UnaryOp.ExtendU32,
this.ensureSmallIntegerWrap(expr, fromType) // must clear garbage bits
);
wrapMode = WrapMode.NONE;

View File

@ -116,7 +116,7 @@
(f64.reinterpret/i64
(i64.shl
(i64.add
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $1)
)
(i64.const 1023)
@ -877,7 +877,7 @@
(i64.const 4294967295)
)
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $5)
)
(i64.const 32)
@ -912,7 +912,7 @@
(tee_local $3
(f64.reinterpret/i64
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(i32.add
(i32.add
(i32.or
@ -1321,7 +1321,7 @@
(set_local $3
(f64.reinterpret/i64
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(i32.and
(get_local $7)
(i32.xor
@ -1523,7 +1523,7 @@
(i64.const 4294967295)
)
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $8)
)
(i64.const 32)
@ -3366,7 +3366,7 @@
)
(i64.shl
(get_local $2)
(i64.extend_u/i32
(i64.extend_s/i32
(i32.sub
(i32.const 1)
(get_local $3)
@ -3422,7 +3422,7 @@
)
(i64.shl
(get_local $5)
(i64.extend_u/i32
(i64.extend_s/i32
(i32.sub
(i32.const 1)
(get_local $6)
@ -3543,7 +3543,7 @@
(i64.const 4503599627370496)
)
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $3)
)
(i64.const 52)
@ -3551,7 +3551,7 @@
)
(i64.shr_u
(get_local $2)
(i64.extend_u/i32
(i64.extend_s/i32
(i32.sub
(i32.const 1)
(get_local $3)
@ -3561,7 +3561,7 @@
)
)
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $8)
)
(i64.const 63)

View File

@ -123,7 +123,7 @@
(i64.shl
(i64.add
(i64.const 1023)
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $1)
)
)
@ -932,7 +932,7 @@
(i64.const 4294967295)
)
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $7)
)
(i64.const 32)
@ -984,7 +984,7 @@
(set_local $30
(f64.reinterpret/i64
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(i32.add
(i32.add
(i32.or
@ -1461,7 +1461,7 @@
(set_local $20
(f64.reinterpret/i64
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(i32.and
(get_local $25)
(i32.xor
@ -1679,7 +1679,7 @@
(i64.const 4294967295)
)
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $24)
)
(i64.const 32)
@ -3728,7 +3728,7 @@
(set_local $2
(i64.shl
(get_local $2)
(i64.extend_u/i32
(i64.extend_s/i32
(i32.add
(i32.sub
(i32.const 0)
@ -3802,7 +3802,7 @@
(set_local $3
(i64.shl
(get_local $3)
(i64.extend_u/i32
(i64.extend_s/i32
(i32.add
(i32.sub
(i32.const 0)
@ -3968,7 +3968,7 @@
(i64.or
(get_local $2)
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $4)
)
(i64.const 52)
@ -3979,7 +3979,7 @@
(set_local $2
(i64.shr_u
(get_local $2)
(i64.extend_u/i32
(i64.extend_s/i32
(i32.add
(i32.sub
(i32.const 0)
@ -3995,7 +3995,7 @@
(i64.or
(get_local $2)
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $6)
)
(i64.const 63)

View File

@ -0,0 +1,135 @@
(module
(type $i (func (result i32)))
(type $ii (func (param i32) (result i32)))
(type $v (func))
(global $~lib/allocator/arena/startOffset (mut i32) (i32.const 0))
(global $~lib/allocator/arena/offset (mut i32) (i32.const 0))
(global $~argc (mut i32) (i32.const 0))
(table 1 1 anyfunc)
(elem (i32.const 0) $getter-call/C#get:x~anonymous|0)
(memory $0 0)
(export "memory" (memory $0))
(export "table" (table $0))
(export "test" (func $getter-call/test))
(start $start)
(func $~lib/allocator/arena/__memory_allocate (; 0 ;) (; has Stack IR ;) (type $ii) (param $0 i32) (result i32)
(local $1 i32)
(local $2 i32)
(local $3 i32)
(if
(i32.gt_u
(get_local $0)
(i32.const 1073741824)
)
(unreachable)
)
(if
(i32.gt_u
(tee_local $2
(i32.and
(i32.add
(i32.add
(tee_local $1
(get_global $~lib/allocator/arena/offset)
)
(select
(get_local $0)
(i32.const 1)
(i32.gt_u
(get_local $0)
(i32.const 1)
)
)
)
(i32.const 7)
)
(i32.const -8)
)
)
(i32.shl
(tee_local $3
(current_memory)
)
(i32.const 16)
)
)
(if
(i32.lt_s
(grow_memory
(select
(get_local $3)
(tee_local $0
(i32.shr_u
(i32.and
(i32.add
(i32.sub
(get_local $2)
(get_local $1)
)
(i32.const 65535)
)
(i32.const -65536)
)
(i32.const 16)
)
)
(i32.gt_s
(get_local $3)
(get_local $0)
)
)
)
(i32.const 0)
)
(if
(i32.lt_s
(grow_memory
(get_local $0)
)
(i32.const 0)
)
(unreachable)
)
)
)
(set_global $~lib/allocator/arena/offset
(get_local $2)
)
(get_local $1)
)
(func $~lib/memory/memory.allocate (; 1 ;) (; has Stack IR ;) (type $ii) (param $0 i32) (result i32)
(call $~lib/allocator/arena/__memory_allocate
(get_local $0)
)
)
(func $getter-call/C#get:x~anonymous|0 (; 2 ;) (; has Stack IR ;) (type $i) (result i32)
(i32.const 42)
)
(func $getter-call/C#get:x (; 3 ;) (; has Stack IR ;) (type $ii) (param $0 i32) (result i32)
(i32.const 0)
)
(func $getter-call/test (; 4 ;) (; has Stack IR ;) (type $i) (result i32)
(local $0 i32)
(set_local $0
(call $~lib/memory/memory.allocate
(i32.const 0)
)
)
(set_global $~argc
(i32.const 0)
)
(call_indirect (type $i)
(call $getter-call/C#get:x
(get_local $0)
)
)
)
(func $start (; 5 ;) (; has Stack IR ;) (type $v)
(set_global $~lib/allocator/arena/startOffset
(i32.const 8)
)
(set_global $~lib/allocator/arena/offset
(get_global $~lib/allocator/arena/startOffset)
)
)
)

View File

@ -154,7 +154,7 @@
)
)
(drop
(i64.extend_u/i32
(i64.extend_s/i32
(get_global $portable-conversions/i)
)
)

View File

@ -2683,7 +2683,7 @@
(f64.reinterpret/i64
(i64.shl
(i64.add
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $2)
)
(i64.const 1023)
@ -2750,7 +2750,7 @@
(i64.shl
(i64.sub
(i64.const 1023)
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $2)
)
)
@ -2900,7 +2900,7 @@
(f64.reinterpret/i64
(i64.shl
(i64.add
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $1)
)
(i64.const 1023)
@ -4954,7 +4954,7 @@
(i64.const 4294967295)
)
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $5)
)
(i64.const 32)
@ -4989,7 +4989,7 @@
(tee_local $3
(f64.reinterpret/i64
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(i32.add
(i32.add
(i32.or
@ -5398,7 +5398,7 @@
(set_local $3
(f64.reinterpret/i64
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(i32.and
(get_local $7)
(i32.xor
@ -5600,7 +5600,7 @@
(i64.const 4294967295)
)
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $8)
)
(i64.const 32)

View File

@ -3120,7 +3120,7 @@
(i64.shl
(i64.add
(i64.const 1023)
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $3)
)
)
@ -3189,7 +3189,7 @@
(i64.shl
(i64.sub
(i64.const 1023)
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $3)
)
)
@ -3347,7 +3347,7 @@
(i64.shl
(i64.add
(i64.const 1023)
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $1)
)
)
@ -5651,7 +5651,7 @@
(i64.const 4294967295)
)
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $7)
)
(i64.const 32)
@ -5703,7 +5703,7 @@
(set_local $30
(f64.reinterpret/i64
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(i32.add
(i32.add
(i32.or
@ -6180,7 +6180,7 @@
(set_local $20
(f64.reinterpret/i64
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(i32.and
(get_local $25)
(i32.xor
@ -6398,7 +6398,7 @@
(i64.const 4294967295)
)
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $24)
)
(i64.const 32)

View File

@ -226,7 +226,7 @@
(f64.reinterpret/i64
(i64.shl
(i64.add
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $1)
)
(i64.const 1023)
@ -5448,7 +5448,7 @@
(f64.reinterpret/i64
(i64.shl
(i64.add
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $2)
)
(i64.const 1023)
@ -5515,7 +5515,7 @@
(i64.shl
(i64.sub
(i64.const 1023)
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $2)
)
)
@ -8705,7 +8705,7 @@
)
(i64.shl
(get_local $2)
(i64.extend_u/i32
(i64.extend_s/i32
(i32.sub
(i32.const 1)
(get_local $3)
@ -8761,7 +8761,7 @@
)
(i64.shl
(get_local $5)
(i64.extend_u/i32
(i64.extend_s/i32
(i32.sub
(i32.const 1)
(get_local $6)
@ -8882,7 +8882,7 @@
(i64.const 4503599627370496)
)
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $3)
)
(i64.const 52)
@ -8890,7 +8890,7 @@
)
(i64.shr_u
(get_local $2)
(i64.extend_u/i32
(i64.extend_s/i32
(i32.sub
(i32.const 1)
(get_local $3)
@ -8900,7 +8900,7 @@
)
)
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $8)
)
(i64.const 63)
@ -10054,7 +10054,7 @@
(i64.const 4294967295)
)
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $5)
)
(i64.const 32)
@ -10089,7 +10089,7 @@
(tee_local $3
(f64.reinterpret/i64
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(i32.add
(i32.add
(i32.or
@ -10498,7 +10498,7 @@
(set_local $3
(f64.reinterpret/i64
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(i32.and
(get_local $7)
(i32.xor
@ -10700,7 +10700,7 @@
(i64.const 4294967295)
)
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $8)
)
(i64.const 32)
@ -12598,7 +12598,7 @@
)
(i64.shl
(get_local $2)
(i64.extend_u/i32
(i64.extend_s/i32
(i32.sub
(i32.const 1)
(get_local $3)
@ -12653,7 +12653,7 @@
)
(i64.shl
(get_local $7)
(i64.extend_u/i32
(i64.extend_s/i32
(i32.sub
(i32.const 1)
(get_local $6)
@ -12813,7 +12813,7 @@
(i64.const 4503599627370496)
)
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $3)
)
(i64.const 52)
@ -12821,7 +12821,7 @@
)
(i64.shr_u
(get_local $2)
(i64.extend_u/i32
(i64.extend_s/i32
(i32.sub
(i32.const 1)
(get_local $3)

View File

@ -265,7 +265,7 @@
(i64.shl
(i64.add
(i64.const 1023)
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $1)
)
)
@ -6337,7 +6337,7 @@
(i64.shl
(i64.add
(i64.const 1023)
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $3)
)
)
@ -6406,7 +6406,7 @@
(i64.shl
(i64.sub
(i64.const 1023)
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $3)
)
)
@ -10061,7 +10061,7 @@
(set_local $2
(i64.shl
(get_local $2)
(i64.extend_u/i32
(i64.extend_s/i32
(i32.add
(i32.sub
(i32.const 0)
@ -10135,7 +10135,7 @@
(set_local $3
(i64.shl
(get_local $3)
(i64.extend_u/i32
(i64.extend_s/i32
(i32.add
(i32.sub
(i32.const 0)
@ -10301,7 +10301,7 @@
(i64.or
(get_local $2)
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $4)
)
(i64.const 52)
@ -10312,7 +10312,7 @@
(set_local $2
(i64.shr_u
(get_local $2)
(i64.extend_u/i32
(i64.extend_s/i32
(i32.add
(i32.sub
(i32.const 0)
@ -10328,7 +10328,7 @@
(i64.or
(get_local $2)
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $6)
)
(i64.const 63)
@ -11614,7 +11614,7 @@
(i64.const 4294967295)
)
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $7)
)
(i64.const 32)
@ -11666,7 +11666,7 @@
(set_local $30
(f64.reinterpret/i64
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(i32.add
(i32.add
(i32.or
@ -12143,7 +12143,7 @@
(set_local $20
(f64.reinterpret/i64
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(i32.and
(get_local $25)
(i32.xor
@ -12361,7 +12361,7 @@
(i64.const 4294967295)
)
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $24)
)
(i64.const 32)
@ -14464,7 +14464,7 @@
(set_local $9
(i64.shl
(get_local $9)
(i64.extend_u/i32
(i64.extend_s/i32
(i32.add
(i32.sub
(i32.const 0)
@ -14542,7 +14542,7 @@
(set_local $3
(i64.shl
(get_local $3)
(i64.extend_u/i32
(i64.extend_s/i32
(i32.add
(i32.sub
(i32.const 0)
@ -14749,7 +14749,7 @@
(i64.or
(get_local $9)
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $4)
)
(i64.const 52)
@ -14760,7 +14760,7 @@
(set_local $9
(i64.shr_u
(get_local $9)
(i64.extend_u/i32
(i64.extend_s/i32
(i32.add
(i32.sub
(i32.const 0)

View File

@ -181,7 +181,7 @@
)
(i64.shl
(get_local $2)
(i64.extend_u/i32
(i64.extend_s/i32
(i32.sub
(i32.const 1)
(get_local $3)
@ -237,7 +237,7 @@
)
(i64.shl
(get_local $5)
(i64.extend_u/i32
(i64.extend_s/i32
(i32.sub
(i32.const 1)
(get_local $6)
@ -358,7 +358,7 @@
(i64.const 4503599627370496)
)
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $3)
)
(i64.const 52)
@ -366,7 +366,7 @@
)
(i64.shr_u
(get_local $2)
(i64.extend_u/i32
(i64.extend_s/i32
(i32.sub
(i32.const 1)
(get_local $3)
@ -376,7 +376,7 @@
)
)
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $8)
)
(i64.const 63)

View File

@ -190,7 +190,7 @@
(set_local $2
(i64.shl
(get_local $2)
(i64.extend_u/i32
(i64.extend_s/i32
(i32.add
(i32.sub
(i32.const 0)
@ -264,7 +264,7 @@
(set_local $3
(i64.shl
(get_local $3)
(i64.extend_u/i32
(i64.extend_s/i32
(i32.add
(i32.sub
(i32.const 0)
@ -430,7 +430,7 @@
(i64.or
(get_local $2)
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $4)
)
(i64.const 52)
@ -441,7 +441,7 @@
(set_local $2
(i64.shr_u
(get_local $2)
(i64.extend_u/i32
(i64.extend_s/i32
(i32.add
(i32.sub
(i32.const 0)
@ -457,7 +457,7 @@
(i64.or
(get_local $2)
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $6)
)
(i64.const 63)

View File

@ -399,7 +399,7 @@
(f64.reinterpret/i64
(i64.shl
(i64.add
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $1)
)
(i64.const 1023)
@ -1160,7 +1160,7 @@
(i64.const 4294967295)
)
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $5)
)
(i64.const 32)
@ -1195,7 +1195,7 @@
(tee_local $3
(f64.reinterpret/i64
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(i32.add
(i32.add
(i32.or
@ -1604,7 +1604,7 @@
(set_local $3
(f64.reinterpret/i64
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(i32.and
(get_local $7)
(i32.xor
@ -1806,7 +1806,7 @@
(i64.const 4294967295)
)
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $8)
)
(i64.const 32)

View File

@ -444,7 +444,7 @@
(i64.shl
(i64.add
(i64.const 1023)
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $1)
)
)
@ -1253,7 +1253,7 @@
(i64.const 4294967295)
)
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $7)
)
(i64.const 32)
@ -1305,7 +1305,7 @@
(set_local $30
(f64.reinterpret/i64
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(i32.add
(i32.add
(i32.or
@ -1782,7 +1782,7 @@
(set_local $20
(f64.reinterpret/i64
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(i32.and
(get_local $25)
(i32.xor
@ -2000,7 +2000,7 @@
(i64.const 4294967295)
)
(i64.shl
(i64.extend_u/i32
(i64.extend_s/i32
(get_local $24)
)
(i64.const 32)

View File

@ -142,7 +142,7 @@
)
)
(set_global $unary/I
(i64.extend_s/i32
(i64.extend_u/i32
(i64.eqz
(get_global $unary/I)
)
@ -305,7 +305,7 @@
)
)
(set_global $unary/I
(i64.extend_s/i32
(i64.extend_u/i32
(f64.eq
(get_global $unary/F)
(f64.const 0)

View File

@ -224,7 +224,7 @@
(i64.const -1)
)
(set_global $unary/I
(i64.extend_s/i32
(i64.extend_u/i32
(i64.eqz
(i64.const 1)
)
@ -246,7 +246,7 @@
)
)
(set_global $unary/I
(i64.extend_s/i32
(i64.extend_u/i32
(i64.eqz
(get_global $unary/I)
)
@ -467,7 +467,7 @@
(f64.const -1.25)
)
(set_global $unary/I
(i64.extend_s/i32
(i64.extend_u/i32
(f64.eq
(f64.const 1.25)
(f64.const 0)
@ -483,7 +483,7 @@
)
)
(set_global $unary/I
(i64.extend_s/i32
(i64.extend_u/i32
(f64.eq
(get_global $unary/F)
(f64.const 0)