blob: d891722796e31fec7aaa4512538dc242fec9bea6 [file] [log] [blame] [edit]
-- Test cases for packed/specialized vec item types other than i64, such as
-- vec[i32] and vec[float]. Since many of the code paths are the same as for
-- vec[i64], only test a subset of functionality.
--
-- vec[i64] test cases are in irbuild-vec-i64.test.
[case testVecMiscCreateEmpty]
from librt.vecs import vec
from mypy_extensions import i32, i16, u8
def create_float() -> vec[float]:
return vec[float]()
def create_i32() -> vec[i32]:
return vec[i32]()
def create_i16() -> vec[i16]:
return vec[i16]()
def create_u8() -> vec[u8]:
return vec[u8]()
def create_bool() -> vec[bool]:
return vec[bool]()
[out]
def create_float():
r0 :: vec[float]
L0:
r0 = VecFloatApi.alloc(0, 0)
return r0
def create_i32():
r0 :: vec[i32]
L0:
r0 = VecI32Api.alloc(0, 0)
return r0
def create_i16():
r0 :: vec[i16]
L0:
r0 = VecI16Api.alloc(0, 0)
return r0
def create_u8():
r0 :: vec[u8]
L0:
r0 = VecU8Api.alloc(0, 0)
return r0
def create_bool():
r0 :: vec[bool]
L0:
r0 = VecBoolApi.alloc(0, 0)
return r0
[case testVecMiscCreateFromList]
from librt.vecs import vec
from mypy_extensions import i64, i32
def create_i32() -> vec[i32]:
return vec[i32]([1, -5])
[out]
def create_i32():
r0 :: vec[i32]
r1 :: object
r2, r3, r4 :: ptr
L0:
r0 = VecI32Api.alloc(2, 2)
r1 = r0.buf
r2 = get_element_ptr r1 items :: VecI32BufObject
set_mem r2, 1 :: i32*
r3 = r2 + 4
set_mem r3, -5 :: i32*
r4 = r3 + 4
keep_alive r0
return r0
[case testVecMiscLen_64bit]
from librt.vecs import vec
from mypy_extensions import i64, i32
def len_i32(v: vec[i32]) -> i64:
return len(v)
[out]
def len_i32(v):
v :: vec[i32]
r0 :: native_int
L0:
r0 = v.len
return r0
[case testVecMiscAppend]
from librt.vecs import vec, append
from mypy_extensions import i32
def append_float(v: vec[float]) -> vec[float]:
return append(v, 1.5)
def append_i32(v: vec[i32]) -> vec[i32]:
return append(v, 123)
[out]
def append_float(v):
v, r0 :: vec[float]
L0:
r0 = VecFloatApi.append(v, 1.5)
return r0
def append_i32(v):
v, r0 :: vec[i32]
L0:
r0 = VecI32Api.append(v, 123)
return r0
[case testVecMiscGetItem_64bit]
from librt.vecs import vec
from mypy_extensions import i64
def get_item_bool(v: vec[bool], i: i64) -> bool:
return v[i]
[out]
def get_item_bool(v, i):
v :: vec[bool]
i :: i64
r0 :: native_int
r1 :: bit
r2 :: i64
r3 :: bit
r4 :: bool
r5 :: i64
r6 :: object
r7 :: ptr
r8 :: i64
r9 :: ptr
r10 :: bool
L0:
r0 = v.len
r1 = i < r0 :: unsigned
if r1 goto L4 else goto L1 :: bool
L1:
r2 = i + r0
r3 = r2 < r0 :: unsigned
if r3 goto L3 else goto L2 :: bool
L2:
r4 = raise IndexError
unreachable
L3:
r5 = r2
goto L5
L4:
r5 = i
L5:
r6 = v.buf
r7 = get_element_ptr r6 items :: VecBoolBufObject
r8 = r5 * 1
r9 = r7 + r8
r10 = load_mem r9 :: builtins.bool*
keep_alive v
return r10
[case testVecMiscPop]
from librt.vecs import vec, pop
from mypy_extensions import i64
def pop_float(v: vec[float], i: i64) -> float:
v, x = pop(v)
return x
[out]
def pop_float(v, i):
v :: vec[float]
i :: i64
r0 :: tuple[vec[float], float]
r1 :: vec[float]
r2 :: float
r3 :: vec[float]
r4, x :: float
L0:
r0 = VecFloatApi.pop(v, -1)
r1 = borrow r0[0]
r2 = borrow r0[1]
keep_alive steal r0
r3 = unborrow r1
v = r3
r4 = unborrow r2
x = r4
return x
[case testVecMiscRemove]
from librt.vecs import vec, remove
def remove_float(v: vec[float]) -> vec[float]:
return remove(v, 1.5)
[out]
def remove_float(v):
v, r0 :: vec[float]
L0:
r0 = VecFloatApi.remove(v, 1.5)
return r0
[case testVecMiscSlice]
from librt.vecs import vec, remove
from mypy_extensions import i64
def remove_float(v: vec[float], x: i64, y: i64) -> vec[float]:
return v[x:y]
[out]
def remove_float(v, x, y):
v :: vec[float]
x, y :: i64
r0 :: vec[float]
L0:
r0 = VecFloatApi.slice(v, x, y)
return r0
[case testVecMiscForLoop]
from librt.vecs import vec, remove
from mypy_extensions import i64, i16
def for_bool(v: vec[i16]) -> i16:
s: i16 = 0
for x in v:
s += x
return s
[out]
def for_bool(v):
v :: vec[i16]
s :: i16
r0, r1 :: native_int
r2 :: bit
r3 :: object
r4 :: ptr
r5 :: native_int
r6 :: ptr
r7, x, r8 :: i16
r9 :: native_int
L0:
s = 0
r0 = 0
L1:
r1 = v.len
r2 = r0 < r1 :: signed
if r2 goto L2 else goto L4 :: bool
L2:
r3 = v.buf
r4 = get_element_ptr r3 items :: VecI16BufObject
r5 = r0 * 2
r6 = r4 + r5
r7 = load_mem r6 :: i16*
x = r7
keep_alive v
r8 = s + x
s = r8
L3:
r9 = r0 + 1
r0 = r9
goto L1
L4:
return s
[case testVecMiscNestedGetItem_64bit]
from librt.vecs import vec
from mypy_extensions import i64, i32
def get_item_nested(v: vec[vec[i32]], i: i64) -> vec[i32]:
return v[i]
[out]
def get_item_nested(v, i):
v :: vec[vec[i32]]
i :: i64
r0 :: native_int
r1 :: bit
r2 :: i64
r3 :: bit
r4 :: bool
r5 :: i64
r6 :: object
r7 :: ptr
r8 :: i64
r9 :: ptr
r10 :: vec[i32]
L0:
r0 = v.len
r1 = i < r0 :: unsigned
if r1 goto L4 else goto L1 :: bool
L1:
r2 = i + r0
r3 = r2 < r0 :: unsigned
if r3 goto L3 else goto L2 :: bool
L2:
r4 = raise IndexError
unreachable
L3:
r5 = r2
goto L5
L4:
r5 = i
L5:
r6 = v.buf
r7 = get_element_ptr r6 items :: VecNestedBufObject
r8 = r5 * 16
r9 = r7 + r8
r10 = load_mem r9 :: vec[i32]*
keep_alive v
return r10
[case testVecMiscNestedPop_64bit]
from librt.vecs import vec, pop
from mypy_extensions import i64, i32
def get_item_nested(v: vec[vec[i32]], i: i64) -> vec[i32]:
v, x = pop(v, i)
return x
[out]
def get_item_nested(v, i):
v :: vec[vec[i32]]
i :: i64
r0 :: tuple[vec[vec[i32]], VecNestedBufItem{len:native_int, buf:object_nrc}]
r1, r2 :: vec[vec[i32]]
r3, r4 :: VecNestedBufItem{len:native_int, buf:object_nrc}
r5 :: vec[i32]
r6 :: tuple[vec[vec[i32]], vec[i32]]
r7 :: vec[vec[i32]]
r8 :: vec[i32]
r9 :: vec[vec[i32]]
r10, x :: vec[i32]
L0:
r0 = VecNestedApi.pop(v, i)
r1 = borrow r0[0]
r2 = unborrow r1
r3 = borrow r0[1]
r4 = unborrow r3
r5 = VecI32Api.convert_from_nested(r4)
r6 = (r2, r5)
keep_alive steal r0
r7 = borrow r6[0]
r8 = borrow r6[1]
keep_alive steal r6
r9 = unborrow r7
v = r9
r10 = unborrow r8
x = r10
return x