clean up bytecode
This commit is contained in:
175
qbe.cm
175
qbe.cm
@@ -732,167 +732,6 @@ var ushr = function(p, ctx, a, b) {
|
||||
// These map directly to the new IR ops emitted by mcode.cm.
|
||||
// ============================================================
|
||||
|
||||
// --- Arithmetic (int path) ---
|
||||
// add_int: assume both operands are tagged ints. Overflow -> float.
|
||||
var add_int = function(p, ctx, a, b) {
|
||||
return ` %${p}.ia =l sar ${a}, 1
|
||||
%${p}.ib =l sar ${b}, 1
|
||||
%${p}.sum =l add %${p}.ia, %${p}.ib
|
||||
%${p}.lo =w csltl %${p}.sum, ${int32_min}
|
||||
%${p}.hi =w csgtl %${p}.sum, ${int32_max}
|
||||
%${p}.ov =w or %${p}.lo, %${p}.hi
|
||||
jnz %${p}.ov, @${p}.ov, @${p}.ok
|
||||
@${p}.ok
|
||||
%${p}.rw =w copy %${p}.sum
|
||||
%${p}.rext =l extuw %${p}.rw
|
||||
%${p} =l shl %${p}.rext, 1
|
||||
jmp @${p}.done
|
||||
@${p}.ov
|
||||
%${p}.fd =d sltof %${p}.sum
|
||||
%${p} =l call $__JS_NewFloat64(l ${ctx}, d %${p}.fd)
|
||||
@${p}.done
|
||||
`
|
||||
}
|
||||
|
||||
var sub_int = function(p, ctx, a, b) {
|
||||
return ` %${p}.ia =l sar ${a}, 1
|
||||
%${p}.ib =l sar ${b}, 1
|
||||
%${p}.diff =l sub %${p}.ia, %${p}.ib
|
||||
%${p}.lo =w csltl %${p}.diff, ${int32_min}
|
||||
%${p}.hi =w csgtl %${p}.diff, ${int32_max}
|
||||
%${p}.ov =w or %${p}.lo, %${p}.hi
|
||||
jnz %${p}.ov, @${p}.ov, @${p}.ok
|
||||
@${p}.ok
|
||||
%${p}.rw =w copy %${p}.diff
|
||||
%${p}.rext =l extuw %${p}.rw
|
||||
%${p} =l shl %${p}.rext, 1
|
||||
jmp @${p}.done
|
||||
@${p}.ov
|
||||
%${p}.fd =d sltof %${p}.diff
|
||||
%${p} =l call $__JS_NewFloat64(l ${ctx}, d %${p}.fd)
|
||||
@${p}.done
|
||||
`
|
||||
}
|
||||
|
||||
var mul_int = function(p, ctx, a, b) {
|
||||
return ` %${p}.ia =l sar ${a}, 1
|
||||
%${p}.ib =l sar ${b}, 1
|
||||
%${p}.prod =l mul %${p}.ia, %${p}.ib
|
||||
%${p}.lo =w csltl %${p}.prod, ${int32_min}
|
||||
%${p}.hi =w csgtl %${p}.prod, ${int32_max}
|
||||
%${p}.ov =w or %${p}.lo, %${p}.hi
|
||||
jnz %${p}.ov, @${p}.ov, @${p}.ok
|
||||
@${p}.ok
|
||||
%${p}.rw =w copy %${p}.prod
|
||||
%${p}.rext =l extuw %${p}.rw
|
||||
%${p} =l shl %${p}.rext, 1
|
||||
jmp @${p}.done
|
||||
@${p}.ov
|
||||
%${p}.fd =d sltof %${p}.prod
|
||||
%${p} =l call $__JS_NewFloat64(l ${ctx}, d %${p}.fd)
|
||||
@${p}.done
|
||||
`
|
||||
}
|
||||
|
||||
var div_int = function(p, ctx, a, b) {
|
||||
return ` %${p}.ia =w copy 0
|
||||
%${p}.tmp =l sar ${a}, 1
|
||||
%${p}.ia =w copy %${p}.tmp
|
||||
%${p}.ib =w copy 0
|
||||
%${p}.tmp2 =l sar ${b}, 1
|
||||
%${p}.ib =w copy %${p}.tmp2
|
||||
%${p}.div0 =w ceqw %${p}.ib, 0
|
||||
jnz %${p}.div0, @${p}.null, @${p}.chk
|
||||
@${p}.null
|
||||
%${p} =l copy ${js_null}
|
||||
jmp @${p}.done
|
||||
@${p}.chk
|
||||
%${p}.rem =w rem %${p}.ia, %${p}.ib
|
||||
%${p}.exact =w ceqw %${p}.rem, 0
|
||||
jnz %${p}.exact, @${p}.idiv, @${p}.fdiv
|
||||
@${p}.idiv
|
||||
%${p}.q =w div %${p}.ia, %${p}.ib
|
||||
%${p}.qext =l extuw %${p}.q
|
||||
%${p} =l shl %${p}.qext, 1
|
||||
jmp @${p}.done
|
||||
@${p}.fdiv
|
||||
%${p}.da =d swtof %${p}.ia
|
||||
%${p}.db =d swtof %${p}.ib
|
||||
%${p}.dr =d div %${p}.da, %${p}.db
|
||||
%${p} =l call $__JS_NewFloat64(l ${ctx}, d %${p}.dr)
|
||||
@${p}.done
|
||||
`
|
||||
}
|
||||
|
||||
var mod_int = function(p, ctx, a, b) {
|
||||
return ` %${p}.ia =w copy 0
|
||||
%${p}.tmp =l sar ${a}, 1
|
||||
%${p}.ia =w copy %${p}.tmp
|
||||
%${p}.ib =w copy 0
|
||||
%${p}.tmp2 =l sar ${b}, 1
|
||||
%${p}.ib =w copy %${p}.tmp2
|
||||
%${p}.div0 =w ceqw %${p}.ib, 0
|
||||
jnz %${p}.div0, @${p}.null, @${p}.do_mod
|
||||
@${p}.null
|
||||
%${p} =l copy ${js_null}
|
||||
jmp @${p}.done
|
||||
@${p}.do_mod
|
||||
%${p}.r =w rem %${p}.ia, %${p}.ib
|
||||
%${p}.rext =l extuw %${p}.r
|
||||
%${p} =l shl %${p}.rext, 1
|
||||
@${p}.done
|
||||
`
|
||||
}
|
||||
|
||||
var neg_int = function(p, ctx, v) {
|
||||
return ` %${p}.sl =l sar ${v}, 1
|
||||
%${p}.iw =w copy %${p}.sl
|
||||
%${p}.is_min =w ceqw %${p}.iw, ${int32_min}
|
||||
jnz %${p}.is_min, @${p}.ov, @${p}.ok
|
||||
@${p}.ov
|
||||
%${p}.fd =d swtof %${p}.iw
|
||||
%${p}.fdn =d neg %${p}.fd
|
||||
%${p} =l call $__JS_NewFloat64(l ${ctx}, d %${p}.fdn)
|
||||
jmp @${p}.done
|
||||
@${p}.ok
|
||||
%${p}.ni =w sub 0, %${p}.iw
|
||||
%${p}.niext =l extuw %${p}.ni
|
||||
%${p} =l shl %${p}.niext, 1
|
||||
@${p}.done
|
||||
`
|
||||
}
|
||||
|
||||
// --- Arithmetic (float path) ---
|
||||
var add_float = function(p, ctx, a, b) {
|
||||
return ` %${p} =l call $qbe_float_add(l ${ctx}, l ${a}, l ${b})
|
||||
`
|
||||
}
|
||||
|
||||
var sub_float = function(p, ctx, a, b) {
|
||||
return ` %${p} =l call $qbe_float_sub(l ${ctx}, l ${a}, l ${b})
|
||||
`
|
||||
}
|
||||
|
||||
var mul_float = function(p, ctx, a, b) {
|
||||
return ` %${p} =l call $qbe_float_mul(l ${ctx}, l ${a}, l ${b})
|
||||
`
|
||||
}
|
||||
|
||||
var div_float = function(p, ctx, a, b) {
|
||||
return ` %${p} =l call $qbe_float_div(l ${ctx}, l ${a}, l ${b})
|
||||
`
|
||||
}
|
||||
|
||||
var mod_float = function(p, ctx, a, b) {
|
||||
return ` %${p} =l call $qbe_float_mod(l ${ctx}, l ${a}, l ${b})
|
||||
`
|
||||
}
|
||||
|
||||
var neg_float = function(p, ctx, v) {
|
||||
return ` %${p} =l call $qbe_float_neg(l ${ctx}, l ${v})
|
||||
`
|
||||
}
|
||||
|
||||
// --- Text concat ---
|
||||
var concat = function(p, ctx, a, b) {
|
||||
return ` %${p} =l call $JS_ConcatString(l ${ctx}, l ${a}, l ${b})
|
||||
@@ -1039,20 +878,6 @@ return {
|
||||
shl: shl,
|
||||
shr: shr,
|
||||
ushr: ushr,
|
||||
// decomposed arithmetic (int path)
|
||||
add_int: add_int,
|
||||
sub_int: sub_int,
|
||||
mul_int: mul_int,
|
||||
div_int: div_int,
|
||||
mod_int: mod_int,
|
||||
neg_int: neg_int,
|
||||
// decomposed arithmetic (float path)
|
||||
add_float: add_float,
|
||||
sub_float: sub_float,
|
||||
mul_float: mul_float,
|
||||
div_float: div_float,
|
||||
mod_float: mod_float,
|
||||
neg_float: neg_float,
|
||||
// text concat
|
||||
concat: concat,
|
||||
// decomposed comparisons (int)
|
||||
|
||||
Reference in New Issue
Block a user