mirror of
https://github.com/fluencelabs/assemblyscript
synced 2025-05-06 04:12:15 +00:00
Notes on unary EQZ in compileBinary EQ
This commit is contained in:
parent
f507fc8168
commit
fb2b7aa96b
@ -1545,6 +1545,11 @@ export class Compiler extends DiagnosticEmitter {
|
|||||||
|
|
||||||
case Token.EQUALS_EQUALS:
|
case Token.EQUALS_EQUALS:
|
||||||
case Token.EQUALS_EQUALS_EQUALS:
|
case Token.EQUALS_EQUALS_EQUALS:
|
||||||
|
|
||||||
|
// NOTE that this favors correctness, in terms of emitting a binary expression, over
|
||||||
|
// checking for a possible use of unary EQZ. while the most classic of all optimizations,
|
||||||
|
// that's not what the source told us to do. for reference, `!left` emits unary EQZ.
|
||||||
|
|
||||||
left = this.compileExpression(expression.left, contextualType, ConversionKind.NONE);
|
left = this.compileExpression(expression.left, contextualType, ConversionKind.NONE);
|
||||||
right = this.compileExpression(expression.right, this.currentType);
|
right = this.compileExpression(expression.right, this.currentType);
|
||||||
|
|
||||||
|
@ -154,18 +154,18 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
(block
|
(block
|
||||||
(set_local $4
|
|
||||||
(i64.shl
|
|
||||||
(get_local $4)
|
|
||||||
(i64.const 1)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
(set_local $3
|
(set_local $3
|
||||||
(i32.sub
|
(i32.sub
|
||||||
(get_local $3)
|
(get_local $3)
|
||||||
(i32.const 1)
|
(i32.const 1)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
(set_local $4
|
||||||
|
(i64.shl
|
||||||
|
(get_local $4)
|
||||||
|
(i64.const 1)
|
||||||
|
)
|
||||||
|
)
|
||||||
(br $continue|0)
|
(br $continue|0)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@ -211,18 +211,18 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
(block
|
(block
|
||||||
(set_local $4
|
|
||||||
(i64.shl
|
|
||||||
(get_local $4)
|
|
||||||
(i64.const 1)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
(set_local $6
|
(set_local $6
|
||||||
(i32.sub
|
(i32.sub
|
||||||
(get_local $6)
|
(get_local $6)
|
||||||
(i32.const 1)
|
(i32.const 1)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
(set_local $4
|
||||||
|
(i64.shl
|
||||||
|
(get_local $4)
|
||||||
|
(i64.const 1)
|
||||||
|
)
|
||||||
|
)
|
||||||
(br $continue|1)
|
(br $continue|1)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@ -332,18 +332,18 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
(block
|
(block
|
||||||
(set_local $2
|
|
||||||
(i64.shl
|
|
||||||
(get_local $2)
|
|
||||||
(i64.const 1)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
(set_local $3
|
(set_local $3
|
||||||
(i32.sub
|
(i32.sub
|
||||||
(get_local $3)
|
(get_local $3)
|
||||||
(i32.const 1)
|
(i32.const 1)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
(set_local $2
|
||||||
|
(i64.shl
|
||||||
|
(get_local $2)
|
||||||
|
(i64.const 1)
|
||||||
|
)
|
||||||
|
)
|
||||||
(br $continue|3)
|
(br $continue|3)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -15,14 +15,16 @@ export function fmod(x: f64, y: f64): f64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!ex) {
|
if (!ex) {
|
||||||
for (var i = ux << 12; !(i >> 63); ex--) i <<= 1;
|
for (var i = ux << 12; !(i >> 63); i <<= 1)
|
||||||
|
--ex;
|
||||||
ux <<= -ex + 1;
|
ux <<= -ex + 1;
|
||||||
} else {
|
} else {
|
||||||
ux &= -1 >> 12;
|
ux &= -1 >> 12;
|
||||||
ux |= 1 << 52;
|
ux |= 1 << 52;
|
||||||
}
|
}
|
||||||
if (!ey) {
|
if (!ey) {
|
||||||
for (i = uy << 12; !(i >> 63); ey--) i <<= 1;
|
for (i = uy << 12; !(i >> 63); i <<= 1)
|
||||||
|
--ey;
|
||||||
uy <<= -ey + 1;
|
uy <<= -ey + 1;
|
||||||
} else {
|
} else {
|
||||||
uy &= -1 >> 12;
|
uy &= -1 >> 12;
|
||||||
@ -44,7 +46,8 @@ export function fmod(x: f64, y: f64): f64 {
|
|||||||
return 0 * x;
|
return 0 * x;
|
||||||
ux = i;
|
ux = i;
|
||||||
}
|
}
|
||||||
for (; !(ux >> 52); ex--) ux <<= 1;
|
for (; !(ux >> 52); ux <<= 1)
|
||||||
|
--ex;
|
||||||
|
|
||||||
if (ex > 0) {
|
if (ex > 0) {
|
||||||
ux -= 1 << 52;
|
ux -= 1 << 52;
|
||||||
|
@ -165,26 +165,18 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
(block
|
(block
|
||||||
|
(set_local $4
|
||||||
|
(i32.sub
|
||||||
|
(get_local $4)
|
||||||
|
(i32.const 1)
|
||||||
|
)
|
||||||
|
)
|
||||||
(set_local $9
|
(set_local $9
|
||||||
(i64.shl
|
(i64.shl
|
||||||
(get_local $9)
|
(get_local $9)
|
||||||
(i64.const 1)
|
(i64.const 1)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(drop
|
|
||||||
(block (result i32)
|
|
||||||
(set_local $8
|
|
||||||
(get_local $4)
|
|
||||||
)
|
|
||||||
(set_local $4
|
|
||||||
(i32.sub
|
|
||||||
(get_local $8)
|
|
||||||
(i32.const 1)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
(get_local $8)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
(br $continue|0)
|
(br $continue|0)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@ -250,26 +242,18 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
(block
|
(block
|
||||||
|
(set_local $5
|
||||||
|
(i32.sub
|
||||||
|
(get_local $5)
|
||||||
|
(i32.const 1)
|
||||||
|
)
|
||||||
|
)
|
||||||
(set_local $9
|
(set_local $9
|
||||||
(i64.shl
|
(i64.shl
|
||||||
(get_local $9)
|
(get_local $9)
|
||||||
(i64.const 1)
|
(i64.const 1)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(drop
|
|
||||||
(block (result i32)
|
|
||||||
(set_local $8
|
|
||||||
(get_local $5)
|
|
||||||
)
|
|
||||||
(set_local $5
|
|
||||||
(i32.sub
|
|
||||||
(get_local $8)
|
|
||||||
(i32.const 1)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
(get_local $8)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
(br $continue|1)
|
(br $continue|1)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@ -421,26 +405,18 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
(block
|
(block
|
||||||
|
(set_local $4
|
||||||
|
(i32.sub
|
||||||
|
(get_local $4)
|
||||||
|
(i32.const 1)
|
||||||
|
)
|
||||||
|
)
|
||||||
(set_local $2
|
(set_local $2
|
||||||
(i64.shl
|
(i64.shl
|
||||||
(get_local $2)
|
(get_local $2)
|
||||||
(i64.const 1)
|
(i64.const 1)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(drop
|
|
||||||
(block (result i32)
|
|
||||||
(set_local $8
|
|
||||||
(get_local $4)
|
|
||||||
)
|
|
||||||
(set_local $4
|
|
||||||
(i32.sub
|
|
||||||
(get_local $8)
|
|
||||||
(i32.const 1)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
(get_local $8)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
(br $continue|3)
|
(br $continue|3)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user