Files
Odin/tests/issues/test_issue_7010.odin

165 lines
4.2 KiB
Odin

// Tests issue: https://github.com/odin-lang/Odin/issues/7010
package test_issues
Matrix4x4 :: struct {
columns: [4]#simd[4]f32,
}
Matrix5x4 :: struct {
columns: [5]#simd[4]f32,
}
Matrix4x2 :: struct {
columns: [4]#simd[2]f32,
}
odin_add_vec4f32 :: proc (a: #simd[4]f32, b: #simd[4]f32) -> #simd[4]f32 {
return a + b
}
odin_add_vec2u32 :: proc (a: #simd[2]u32, b: #simd[2]u32) -> #simd[2]u32 {
return a + b
}
odin_add_matrix4x4 :: proc (a: Matrix4x4, b: Matrix4x4) -> Matrix4x4 {
copy_mat := a
copy_mat.columns[0] += b.columns[0]
copy_mat.columns[1] += b.columns[1]
copy_mat.columns[2] += b.columns[2]
copy_mat.columns[3] += b.columns[3]
return copy_mat
}
odin_add_matrix5x4 :: proc (a: Matrix5x4, b: Matrix5x4) -> Matrix5x4 {
copy_mat := a
copy_mat.columns[0] += b.columns[0]
copy_mat.columns[1] += b.columns[1]
copy_mat.columns[2] += b.columns[2]
copy_mat.columns[3] += b.columns[3]
copy_mat.columns[4] += b.columns[4]
return copy_mat
}
odin_add_matrix4x2 :: proc (a: Matrix4x2, b: Matrix4x2) -> Matrix4x2 {
copy_mat := a
copy_mat.columns[0] += b.columns[0]
copy_mat.columns[1] += b.columns[1]
copy_mat.columns[2] += b.columns[2]
copy_mat.columns[3] += b.columns[3]
return copy_mat
}
foreign import ctest "build/test_issue_7010_c.o"
foreign ctest {
c_add_vec4f32 :: proc "c" (a: #simd[4]f32, b: #simd[4]f32) -> #simd[4]f32 ---
c_add_vec2u32 :: proc "c" (a: #simd[2]u32, b: #simd[2]u32) -> #simd[2]u32 ---
c_add_matrix4x4 :: proc "c" (a: Matrix4x4, b: Matrix4x4) -> Matrix4x4 ---
c_add_matrix5x4 :: proc "c" (a: Matrix5x4, b: Matrix5x4) -> Matrix5x4 ---
c_add_matrix4x2 :: proc "c" (a: Matrix4x2, b: Matrix4x2) -> Matrix4x2 ---
}
import "core:testing"
@test
test_simd :: proc(t: ^testing.T) {
a_f32 :#simd[4]f32 = {1.0, 2.0, 3.0, 4.0}
b_f32 :#simd[4]f32 = {4.0, 3.0, 2.0, 1.0}
a_u32 :#simd[2]u32 = {1, 2}
b_u32 :#simd[2]u32 = {4, 3}
mat_a_4x4: Matrix4x4 = {
{{1.0, 0.0, 0.0, 0.0},
{0.0, 2.0, 0.0, 0.0},
{0.0, 0.0, 3.0, 0.0},
{0.0, 0.0, 0.0, 4.0}},
}
mat_b_4x4: Matrix4x4 = {
{{0.0, 0.0, 0.0, 0.0},
{0.0, 1.0, 2.0, 0.0},
{0.0, 3.0, 4.0, 0.0},
{0.0, 0.0, 0.0, 0.0}},
}
mat_a_5x4: Matrix5x4 = {
{{1.0, 0.0, 0.0, 0.0},
{0.0, 2.0, 0.0, 0.0},
{0.0, 0.0, 3.0, 0.0},
{0.0, 0.0, 0.0, 4.0},
{1.0, 0.0, 0.0, 1.0}},
}
mat_b_5x4: Matrix5x4 = {
{{0.0, 0.0, 0.0, 0.0},
{0.0, 1.0, 2.0, 0.0},
{0.0, 3.0, 4.0, 0.0},
{0.0, 0.0, 0.0, 0.0},
{0.0, 1.0, 1.0, 0.0}},
}
mat_a_4x2: Matrix4x2 = {
{{1.0, 0.0},
{0.0, 2.0},
{0.0, 0.0},
{0.0, 0.0}},
}
mat_b_4x2: Matrix4x2 = {
{{0.0, 0.0},
{0.0, 1.0},
{0.0, 3.0},
{1.0, 0.0}},
}
odin_add_vec4_f32_result := odin_add_vec4f32(a_f32, b_f32)
testing.expect(t, odin_add_vec4_f32_result == {5.0, 5.0, 5.0, 5.0})
odin_add_vec2_u32_result := odin_add_vec2u32(a_u32, b_u32)
testing.expect(t, odin_add_vec2_u32_result == {5, 5})
odin_add_matrix4x4_result := odin_add_matrix4x4(mat_a_4x4, mat_b_4x4)
testing.expect(t, odin_add_matrix4x4_result == {
{{1.0, 0.0, 0.0, 0.0},
{0.0, 3.0, 2.0, 0.0},
{0.0, 3.0, 7.0, 0.0},
{0.0, 0.0, 0.0, 4.0}},
})
odin_add_matrix5x4_result := odin_add_matrix5x4(mat_a_5x4, mat_b_5x4)
testing.expect(t, odin_add_matrix5x4_result == {
{{1.0, 0.0, 0.0, 0.0},
{0.0, 3.0, 2.0, 0.0},
{0.0, 3.0, 7.0, 0.0},
{0.0, 0.0, 0.0, 4.0},
{1.0, 1.0, 1.0, 1.0}},
})
odin_add_matrix4x2_result := odin_add_matrix4x2(mat_a_4x2, mat_b_4x2)
testing.expect(t, odin_add_matrix4x2_result == {
{{1.0, 0.0},
{0.0, 3.0},
{0.0, 3.0},
{1.0, 0.0}},
})
c_add_vec4_f32_result := c_add_vec4f32(a_f32, b_f32)
testing.expect(t, c_add_vec4_f32_result == odin_add_vec4_f32_result)
c_add_vec2_u32_result := c_add_vec2u32(a_u32, b_u32)
testing.expect(t, c_add_vec2_u32_result == odin_add_vec2_u32_result)
c_add_matrix4x4_result := c_add_matrix4x4(mat_a_4x4, mat_b_4x4)
testing.expect(t, c_add_matrix4x4_result == odin_add_matrix4x4_result)
c_add_matrix5x4_result := c_add_matrix5x4(mat_a_5x4, mat_b_5x4)
testing.expect(t, c_add_matrix5x4_result == odin_add_matrix5x4_result)
c_add_matrix4x2_result := c_add_matrix4x2(mat_a_4x2, mat_b_4x2)
testing.expect(t, c_add_matrix4x2_result == odin_add_matrix4x2_result)
}
// clang -c test_issue_7010.c -o test_issue_7010_c.o
// odin test test_issue_7010.odin -file