mirror of https://github.com/exaloop/codon.git
186 lines
5.8 KiB
Python
186 lines
5.8 KiB
Python
from core.llvm import *
|
|
|
|
@test
|
|
def test_int_llvm_ops():
|
|
assert add_int(42, 99) == 141
|
|
assert add_int(-10, 10) == 0
|
|
assert sub_int(12, 6) == 6
|
|
assert sub_int(5, -5) == 10
|
|
assert mul_int(22, 33) == 726
|
|
assert mul_int(-3, 3) == -9
|
|
assert div_int(10, 2) == 5
|
|
assert div_int(10, 3) == 3
|
|
assert div_int(10, -3) == -3
|
|
assert mod_int(10, 2) == 0
|
|
assert mod_int(10, 3) == 1
|
|
|
|
assert eq_int(42, 42)
|
|
assert not eq_int(10, -10)
|
|
assert ne_int(0, 1)
|
|
assert not ne_int(-3, -3)
|
|
|
|
assert lt_int(2, 3)
|
|
assert not lt_int(3, 2)
|
|
assert not lt_int(3, 3)
|
|
|
|
assert not gt_int(2, 3)
|
|
assert gt_int(3, 2)
|
|
assert not gt_int(3, 3)
|
|
|
|
assert le_int(2, 3)
|
|
assert not le_int(3, 2)
|
|
assert le_int(3, 3)
|
|
|
|
assert not ge_int(2, 3)
|
|
assert ge_int(3, 2)
|
|
assert ge_int(3, 3)
|
|
|
|
assert inv_int(0b1010) == -11
|
|
assert and_int(0b1010, 0b1101) == 0b1000
|
|
assert or_int(0b1010, 0b1101) == 0b1111
|
|
assert xor_int(0b1010, 0b1101) == 0b0111
|
|
assert shr_int(0b1010, 3) == 0b1
|
|
assert shl_int(0b1010, 3) == 0b1010000
|
|
|
|
assert bitreverse_int(0b0111110111010110001001001000001010001000110001010110001101001101) == 0b1011001011000110101000110001000101000001001001000110101110111110
|
|
assert bitreverse_int(0) == 0
|
|
assert bitreverse_int(0xffffffffffffffff) == 0xffffffffffffffff
|
|
assert ctpop_int(0x7dd6248288c5634d) == 29
|
|
assert ctpop_int(0) == 0
|
|
assert ctpop_int(0xffffffffffffffff) == 64
|
|
assert bswap_int(0x7dd6248288c5634d) == 0x4d63c5888224d67d
|
|
assert bswap_int(0) == 0
|
|
assert bswap_int(0xffffffffffffffff) == 0xffffffffffffffff
|
|
assert ctlz_int(0b0001110111010110001001001000001010001000110001010110001101001101) == 3
|
|
assert ctlz_int(0b0011110111010110001001001000001010001000110001010110001101001101) == 2
|
|
assert ctlz_int(0b0111110111010110001001001000001010001000110001010110001101001101) == 1
|
|
assert ctlz_int(0b1111110111010110001001001000001010001000110001010110001101001101) == 0
|
|
assert ctlz_int(0) == 64
|
|
assert cttz_int(0b0001110111010110001001001000001010001000110001010110001101001000) == 3
|
|
assert cttz_int(0b0001110111010110001001001000001010001000110001010110001101001100) == 2
|
|
assert cttz_int(0b0001110111010110001001001000001010001000110001010110001101001110) == 1
|
|
assert cttz_int(0b0001110111010110001001001000001010001000110001010110001101001111) == 0
|
|
assert cttz_int(0) == 64
|
|
|
|
@test
|
|
def test_float_llvm_ops():
|
|
def approx_eq(a: float, b: float, thresh: float = 1e-10):
|
|
return -thresh <= a - b <= thresh
|
|
PI = 3.1415926535897932384626433832795028841971693993751058209749445923078164062
|
|
E = 2.718281828459045235360287471352662497757247093699959574966967627724076630353
|
|
|
|
assert add_float(42., 99.) == 141.
|
|
assert add_float(-10., 10.) == 0.
|
|
assert sub_float(12., 6.) == 6.
|
|
assert sub_float(5., -5.) == 10.
|
|
assert mul_float(22., 33.) == 726.
|
|
assert mul_float(-3., 3.) == -9.
|
|
assert div_float(10., 2.) == 5.
|
|
assert div_float(10., 4.) == 2.5
|
|
assert div_float(10., -2.5) == -4.
|
|
assert mod_float(10., 2.) == 0.
|
|
assert mod_float(10., 3.) == 1.
|
|
|
|
assert eq_float(42., 42.)
|
|
assert not eq_float(10., -10.)
|
|
assert ne_float(0., 1.)
|
|
assert not ne_float(-3., -3.)
|
|
|
|
assert lt_float(2., 3.)
|
|
assert not lt_float(3., 2.)
|
|
assert not lt_float(3., 3.)
|
|
|
|
assert not gt_float(2., 3.)
|
|
assert gt_float(3., 2.)
|
|
assert not gt_float(3., 3.)
|
|
|
|
assert le_float(2., 3.)
|
|
assert not le_float(3., 2.)
|
|
assert le_float(3., 3.)
|
|
|
|
assert not ge_float(2., 3.)
|
|
assert ge_float(3., 2.)
|
|
assert ge_float(3., 3.)
|
|
|
|
assert pow_float(10., 2.) == 100.
|
|
assert sqrt_float(100.) == 10.
|
|
assert sin_float(0.0) == 0.
|
|
assert sin_float(PI/2) == 1.
|
|
assert approx_eq(sin_float(PI), 0.)
|
|
assert cos_float(0.0) == 1.
|
|
assert approx_eq(cos_float(PI/2), 0.)
|
|
assert cos_float(PI) == -1.
|
|
assert exp_float(0.) == 1.
|
|
assert exp_float(1.) == E
|
|
assert exp2_float(0.) == 1.
|
|
assert exp2_float(1.) == 2.
|
|
assert log_float(1.) == 0.
|
|
assert log_float(E) == 1.
|
|
assert log10_float(1.) == 0.
|
|
assert log10_float(10.) == 1.
|
|
assert log2_float(1.) == 0.
|
|
assert log2_float(2.) == 1.
|
|
assert abs_float(1.5) == 1.5
|
|
assert abs_float(-1.5) == 1.5
|
|
assert pow_float(1., 0.) == 1.
|
|
assert pow_float(3., 2.) == 9.
|
|
assert pow_float(2., -2.) == 0.25
|
|
assert pow_float(-2., 2.) == 4.
|
|
assert min_float(1., 1.) == 1.
|
|
assert min_float(-1., 1.) == -1.
|
|
assert min_float(3., 2.) == 2.
|
|
assert max_float(1., 1.) == 1.
|
|
assert max_float(-1., 1.) == 1.
|
|
assert max_float(3., 2.) == 3.
|
|
assert copysign_float(100., 1.234) == 100.
|
|
assert copysign_float(100., -1.234) == -100.
|
|
assert copysign_float(-100., 1.234) == 100.
|
|
assert copysign_float(-100., -1.234) == -100.
|
|
assert fma_float(2., 3., 4.) == 10.
|
|
|
|
assert floor_float(1.5) == 1.
|
|
assert ceil_float(1.5) == 2.
|
|
assert trunc_float(-1.5) == -1.
|
|
assert rint_float(1.8) == 2.
|
|
assert rint_float(1.3) == 1.
|
|
assert nearbyint_float(2.3) == 2.
|
|
assert nearbyint_float(-3.8) == -4.
|
|
assert round_float(2.3) == 2.
|
|
assert round_float(-2.3) == -2.
|
|
|
|
@test
|
|
def test_conversion_llvm_ops():
|
|
assert int_to_float(42) == 42.0
|
|
assert int_to_float(-100) == -100.0
|
|
assert float_to_int(3.14) == 3
|
|
assert float_to_int(-3.14) == -3
|
|
|
|
@test
|
|
def test_str_llvm_ops():
|
|
N = 10
|
|
p = ptr[byte](N)
|
|
for i in range(N):
|
|
p[i] = byte(i + 1)
|
|
|
|
q = ptr[byte](N)
|
|
for i in range(N):
|
|
q[i] = byte(0)
|
|
|
|
memcpy(q, p, N)
|
|
for i in range(10):
|
|
assert q[i] == byte(i + 1)
|
|
|
|
memmove(p + 1, p, N - 1)
|
|
assert p[1] == p[0]
|
|
for i in range(1, N):
|
|
assert p[i] == byte(i)
|
|
|
|
memset(p, byte(42), N)
|
|
for i in range(N):
|
|
assert p[i] == byte(42)
|
|
|
|
test_int_llvm_ops()
|
|
test_float_llvm_ops()
|
|
test_conversion_llvm_ops()
|
|
test_str_llvm_ops()
|