forked from M-Labs/artiq
compiler/ir_values: implement sign extension and truncation
This commit is contained in:
parent
4ff61a8f56
commit
219aa23d25
|
@ -57,24 +57,23 @@ class VInt:
|
||||||
zero = lc.Constant.int(lc.Type.int(self.nbits), 0)
|
zero = lc.Constant.int(lc.Type.int(self.nbits), 0)
|
||||||
return VBool(llvm_value=builder.icmp(lc.ICMP_NE, self.llvm_value, zero))
|
return VBool(llvm_value=builder.icmp(lc.ICMP_NE, self.llvm_value, zero))
|
||||||
|
|
||||||
def o_int(self, builder):
|
def _o_intx(self, target_bits, builder):
|
||||||
if builder is None:
|
if builder is None:
|
||||||
return VInt()
|
return VInt(target_bits)
|
||||||
else:
|
else:
|
||||||
if self.nbits == 32:
|
if self.nbits == target_bits:
|
||||||
return self
|
return self
|
||||||
else:
|
if self.nbits > target_bits:
|
||||||
raise NotImplementedError
|
return VInt(target_bits, llvm_value=builder.trunc(self.llvm_value, lc.Type.int(target_bits)))
|
||||||
|
if self.nbits < target_bits:
|
||||||
|
return VInt(target_bits, llvm_value=builder.sext(self.llvm_value, lc.Type.int(target_bits)))
|
||||||
|
|
||||||
|
def o_int(self, builder):
|
||||||
|
return self._o_intx(32, builder)
|
||||||
o_round = o_int
|
o_round = o_int
|
||||||
|
|
||||||
def o_int64(self, builder):
|
def o_int64(self, builder):
|
||||||
if builder is None:
|
return self._o_intx(64, builder)
|
||||||
return VInt(64)
|
|
||||||
else:
|
|
||||||
if self.nbits == 64:
|
|
||||||
return self
|
|
||||||
else:
|
|
||||||
raise NotImplementedError
|
|
||||||
o_round64 = o_int64
|
o_round64 = o_int64
|
||||||
|
|
||||||
def _make_vint_binop_method(builder_name):
|
def _make_vint_binop_method(builder_name):
|
||||||
|
|
Loading…
Reference in New Issue