forked from M-Labs/artiq
py2llvm/fractions: fix round()
This commit is contained in:
parent
5dbc1aa5a3
commit
2e45d7267d
|
@ -129,8 +129,28 @@ class VFraction(VGeneric):
|
||||||
else:
|
else:
|
||||||
r = VInt(64)
|
r = VInt(64)
|
||||||
a, b = self._nd(builder)
|
a, b = self._nd(builder)
|
||||||
h_b = builder.ashr(b, lc.Constant.int(lc.Type.int(), 1))
|
h_b = builder.ashr(b, lc.Constant.int(lc.Type.int(64), 1))
|
||||||
a = builder.add(a, h_b)
|
|
||||||
|
function = builder.basic_block.function
|
||||||
|
add_block = function.append_basic_block("fr_add")
|
||||||
|
sub_block = function.append_basic_block("fr_sub")
|
||||||
|
merge_block = function.append_basic_block("fr_merge")
|
||||||
|
|
||||||
|
condition = builder.icmp(
|
||||||
|
lc.ICMP_SLT, a, lc.Constant.int(lc.Type.int(64), 0))
|
||||||
|
builder.cbranch(condition, sub_block, add_block)
|
||||||
|
|
||||||
|
builder.position_at_end(add_block)
|
||||||
|
a_add = builder.add(a, h_b)
|
||||||
|
builder.branch(merge_block)
|
||||||
|
builder.position_at_end(sub_block)
|
||||||
|
a_sub = builder.sub(a, h_b)
|
||||||
|
builder.branch(merge_block)
|
||||||
|
|
||||||
|
builder.position_at_end(merge_block)
|
||||||
|
a = builder.phi(lc.Type.int(64))
|
||||||
|
a.add_incoming(a_add, add_block)
|
||||||
|
a.add_incoming(a_sub, sub_block)
|
||||||
r.auto_store(builder, builder.sdiv(a, b))
|
r.auto_store(builder, builder.sdiv(a, b))
|
||||||
return r.o_intx(target_bits, builder)
|
return r.o_intx(target_bits, builder)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue