codon/test/core/llvmops.codon

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()