forked from M-Labs/artiq
1
0
Fork 0

compiler: minor intrinsic refactoring.

This commit is contained in:
whitequark 2017-10-01 19:00:10 +00:00 committed by Sebastien Bourdeauducq
parent 05096a98a8
commit d0276abb5c
1 changed files with 15 additions and 14 deletions

View File

@ -334,11 +334,11 @@ class LLVMIRGenerator:
llty = ll.FunctionType(llptr, []) llty = ll.FunctionType(llptr, [])
elif name == "llvm.stackrestore": elif name == "llvm.stackrestore":
llty = ll.FunctionType(llvoid, [llptr]) llty = ll.FunctionType(llvoid, [llptr])
elif name == "__py_modsi4": elif name == "__py_modsi3":
llty = ll.FunctionType(lli32, [lli32, lli32]) llty = ll.FunctionType(lli32, [lli32, lli32])
elif name == "__py_moddi4": elif name == "__py_moddi3":
llty = ll.FunctionType(lli64, [lli64, lli64]) llty = ll.FunctionType(lli64, [lli64, lli64])
elif name == "__py_moddf4": elif name == "__py_moddf3":
llty = ll.FunctionType(lldouble, [lldouble, lldouble]) llty = ll.FunctionType(lldouble, [lldouble, lldouble])
elif name == self.target.print_function: elif name == self.target.print_function:
llty = ll.FunctionType(llvoid, [llptr], var_arg=True) llty = ll.FunctionType(llvoid, [llptr], var_arg=True)
@ -387,10 +387,10 @@ class LLVMIRGenerator:
llbuilder = ll.IRBuilder() llbuilder = ll.IRBuilder()
llbuilder.position_at_end(llfun.append_basic_block("entry")) llbuilder.position_at_end(llfun.append_basic_block("entry"))
if name == "__py_modsi4" or name == "__py_moddi4": if name == "__py_modsi3" or name == "__py_moddi3":
if name == "__py_modsi4": if name == "__py_modsi3":
llty = lli32 llty = lli32
elif name == "__py_moddi4": elif name == "__py_moddi3":
llty = lli64 llty = lli64
else: else:
assert False assert False
@ -413,15 +413,14 @@ class LLVMIRGenerator:
llxdivy = llbuilder.sdiv(llx, lly) llxdivy = llbuilder.sdiv(llx, lly)
llxremy = llbuilder.srem(llx, lly) llxremy = llbuilder.srem(llx, lly)
llxmodynonzero = llbuilder.icmp_signed('!=', llxremy, llxmodynonzero = llbuilder.icmp_signed('!=', llxremy, ll.Constant(llty, 0))
ll.Constant(llty, 0)) lldiffsign = llbuilder.icmp_signed('<', llbuilder.xor(llx, lly), ll.Constant(llty, 0))
lldiffsign = llbuilder.icmp_signed('<', llbuilder.xor(lly, llxremy),
ll.Constant(llty, 0))
llcond = llbuilder.and_(llxmodynonzero, lldiffsign) llcond = llbuilder.and_(llxmodynonzero, lldiffsign)
with llbuilder.if_then(llcond): with llbuilder.if_then(llcond):
llbuilder.ret(llbuilder.add(llxremy, lly)) llbuilder.ret(llbuilder.add(llxremy, lly))
llbuilder.ret(llxremy) llbuilder.ret(llxremy)
elif name == "__py_moddf4": elif name == "__py_moddf3":
""" """
Reference Objects/floatobject.c Reference Objects/floatobject.c
mod = fmod(vx, wx); mod = fmod(vx, wx);
@ -461,6 +460,8 @@ class LLVMIRGenerator:
with llbuilder.if_then(llcond): with llbuilder.if_then(llcond):
llbuilder.ret(llbuilder.fadd(llrem, llw)) llbuilder.ret(llbuilder.fadd(llrem, llw))
llbuilder.ret(llrem) llbuilder.ret(llrem)
else:
assert False
def get_function(self, typ, name): def get_function(self, typ, name):
llfun = self.llmodule.get_global(name) llfun = self.llmodule.get_global(name)
@ -1012,11 +1013,11 @@ class LLVMIRGenerator:
elif isinstance(insn.op, ast.Mod): elif isinstance(insn.op, ast.Mod):
lllhs, llrhs = map(self.map, (insn.lhs(), insn.rhs())) lllhs, llrhs = map(self.map, (insn.lhs(), insn.rhs()))
if builtins.is_float(insn.type): if builtins.is_float(insn.type):
intrinsic = "__py_moddf4" intrinsic = "__py_moddf3"
elif builtins.is_int32(insn.type): elif builtins.is_int32(insn.type):
intrinsic = "__py_modsi4" intrinsic = "__py_modsi3"
elif builtins.is_int64(insn.type): elif builtins.is_int64(insn.type):
intrinsic = "__py_moddi4" intrinsic = "__py_moddi3"
return self.llbuilder.call(self.llbuiltin(intrinsic), [lllhs, llrhs], return self.llbuilder.call(self.llbuiltin(intrinsic), [lllhs, llrhs],
name=insn.name) name=insn.name)
elif isinstance(insn.op, ast.Pow): elif isinstance(insn.op, ast.Pow):