73 lines
1.9 KiB
Python
73 lines
1.9 KiB
Python
import unittest
|
|
import llvm
|
|
from llvm.core import (Module, Type, Builder)
|
|
from llvm.ee import EngineBuilder
|
|
from .support import TestCase, tests, skip_if, skip_if_not_64bits
|
|
|
|
@skip_if(llvm.version < (3, 3))
|
|
class TestArith(TestCase):
|
|
'''
|
|
Test basic arithmetic support with LLVM MCJIT
|
|
'''
|
|
def func_template(self, ty, op):
|
|
m = Module.new('dofjaa')
|
|
fnty = Type.function(ty, [ty, ty])
|
|
fn = m.add_function(fnty, 'foo')
|
|
bldr = Builder.new(fn.append_basic_block(''))
|
|
bldr.ret(getattr(bldr, op)(*fn.args))
|
|
|
|
engine = EngineBuilder.new(m).mcjit(True).create()
|
|
ptr = engine.get_pointer_to_function(fn)
|
|
|
|
from ctypes import c_uint32, c_uint64, c_float, c_double, CFUNCTYPE
|
|
|
|
maptypes = {
|
|
Type.int(32): c_uint32,
|
|
Type.int(64): c_uint64,
|
|
Type.float(): c_float,
|
|
Type.double(): c_double,
|
|
}
|
|
cty = maptypes[ty]
|
|
prototype = CFUNCTYPE(*[cty] * 3)
|
|
callee = prototype(ptr)
|
|
callee(12, 23)
|
|
|
|
def template(self, iop, fop):
|
|
inttys = [Type.int(32), Type.int(64)]
|
|
flttys = [Type.float(), Type.double()]
|
|
|
|
if iop:
|
|
for ty in inttys:
|
|
self.func_template(ty, iop)
|
|
if fop:
|
|
for ty in flttys:
|
|
self.func_template(ty, fop)
|
|
|
|
def test_add(self):
|
|
self.template('add', 'fadd')
|
|
|
|
def test_sub(self):
|
|
self.template('sub', 'fsub')
|
|
|
|
def test_mul(self):
|
|
self.template('mul', 'fmul')
|
|
|
|
@skip_if_not_64bits
|
|
def test_div(self):
|
|
'''
|
|
known failure due to unresolved external symbol __udivdi3
|
|
'''
|
|
self.template('udiv', None) # 'fdiv')
|
|
|
|
@skip_if_not_64bits
|
|
def test_rem(self):
|
|
'''
|
|
known failure due to unresolved external symbol __umoddi3
|
|
'''
|
|
self.template('urem', None) # 'frem')
|
|
|
|
tests.append(TestArith)
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|
|
|