Swapping around vec128 to match AVX order.
Was really hoping all this would fix some bugs, but no luck :(
This commit is contained in:
@@ -13,6 +13,7 @@
|
||||
|
||||
'dependencies': [
|
||||
'alloy',
|
||||
'xenia',
|
||||
],
|
||||
|
||||
'include_dirs': [
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
|
||||
'dependencies': [
|
||||
'alloy',
|
||||
'xenia',
|
||||
],
|
||||
|
||||
'include_dirs': [
|
||||
@@ -40,11 +41,11 @@
|
||||
#'test_div.cc',
|
||||
#'test_dot_product_3.cc',
|
||||
#'test_dot_product_4.cc',
|
||||
#'test_extract.cc',
|
||||
#'test_insert.cc',
|
||||
'test_extract.cc',
|
||||
'test_insert.cc',
|
||||
#'test_is_true_false.cc',
|
||||
#'test_load_clock.cc',
|
||||
#'test_load_vector.cc',
|
||||
'test_load_vector_shl_shr.cc',
|
||||
#'test_log2.cc',
|
||||
#'test_max.cc',
|
||||
#'test_min.cc',
|
||||
@@ -55,32 +56,32 @@
|
||||
#'test_neg.cc',
|
||||
#'test_not.cc',
|
||||
#'test_or.cc',
|
||||
#'test_pack.cc',
|
||||
#'test_permute.cc',
|
||||
'test_pack.cc',
|
||||
'test_permute.cc',
|
||||
#'test_pow2.cc',
|
||||
#'test_rotate_left.cc',
|
||||
#'test_round.cc',
|
||||
#'test_rsqrt.cc',
|
||||
#'test_select.cc',
|
||||
#'test_sha.cc',
|
||||
#'test_shl.cc',
|
||||
#'test_shr.cc',
|
||||
'test_sha.cc',
|
||||
'test_shl.cc',
|
||||
'test_shr.cc',
|
||||
#'test_sign_extend.cc',
|
||||
#'test_splat.cc',
|
||||
#'test_sqrt.cc',
|
||||
#'test_sub.cc',
|
||||
#'test_swizzle.cc',
|
||||
'test_swizzle.cc',
|
||||
#'test_truncate.cc',
|
||||
#'test_unpack.cc',
|
||||
'test_unpack.cc',
|
||||
'test_vector_add.cc',
|
||||
#'test_vector_compare.cc',
|
||||
#'test_vector_convert.cc',
|
||||
'test_vector_max.cc',
|
||||
'test_vector_min.cc',
|
||||
#'test_vector_rotate_left.cc',
|
||||
#'test_vector_sha.cc',
|
||||
#'test_vector_shl.cc',
|
||||
#'test_vector_shr.cc',
|
||||
'test_vector_rotate_left.cc',
|
||||
'test_vector_sha.cc',
|
||||
'test_vector_shl.cc',
|
||||
'test_vector_shr.cc',
|
||||
#'test_vector_sub.cc',
|
||||
#'test_xor.cc',
|
||||
#'test_zero_extend.cc',
|
||||
|
||||
141
tools/alloy-test/test_extract.cc
Normal file
141
tools/alloy-test/test_extract.cc
Normal file
@@ -0,0 +1,141 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* Xenia : Xbox 360 Emulator Research Project *
|
||||
******************************************************************************
|
||||
* Copyright 2014 Ben Vanik. All rights reserved. *
|
||||
* Released under the BSD license - see LICENSE in the root for more details. *
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include <tools/alloy-test/util.h>
|
||||
|
||||
#include <cfloat>
|
||||
|
||||
using namespace alloy;
|
||||
using namespace alloy::hir;
|
||||
using namespace alloy::runtime;
|
||||
using namespace alloy::test;
|
||||
using alloy::frontend::ppc::PPCContext;
|
||||
|
||||
TEST_CASE("EXTRACT_INT8", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreGPR(b, 3, b.ZeroExtend(b.Extract(LoadVR(b, 4),
|
||||
b.Truncate(LoadGPR(b, 4), INT8_TYPE),
|
||||
INT8_TYPE),
|
||||
INT64_TYPE));
|
||||
b.Return();
|
||||
});
|
||||
for (int i = 0; i < 16; ++i) {
|
||||
test.Run([i](PPCContext* ctx) {
|
||||
ctx->r[4] = i;
|
||||
ctx->v[4] = vec128b(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
|
||||
14, 15);
|
||||
},
|
||||
[i](PPCContext* ctx) {
|
||||
auto result = ctx->r[3];
|
||||
REQUIRE(result == i);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("EXTRACT_INT8_CONSTANT", "[instr]") {
|
||||
for (int i = 0; i < 16; ++i) {
|
||||
TestFunction([i](hir::HIRBuilder& b) {
|
||||
StoreGPR(b, 3,
|
||||
b.ZeroExtend(
|
||||
b.Extract(LoadVR(b, 4),
|
||||
b.LoadConstant(int8_t(i)), INT8_TYPE),
|
||||
INT64_TYPE));
|
||||
b.Return();
|
||||
}).Run([i](PPCContext* ctx) {
|
||||
ctx->r[4] = i;
|
||||
ctx->v[4] = vec128b(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
|
||||
11, 12, 13, 14, 15);
|
||||
},
|
||||
[i](PPCContext* ctx) {
|
||||
auto result = ctx->r[3];
|
||||
REQUIRE(result == i);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("EXTRACT_INT16", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreGPR(b, 3, b.ZeroExtend(b.Extract(LoadVR(b, 4),
|
||||
b.Truncate(LoadGPR(b, 4), INT8_TYPE),
|
||||
INT16_TYPE),
|
||||
INT64_TYPE));
|
||||
b.Return();
|
||||
});
|
||||
for (int i = 0; i < 8; ++i) {
|
||||
test.Run([i](PPCContext* ctx) {
|
||||
ctx->r[4] = i;
|
||||
ctx->v[4] = vec128s(0x0000, 0x1001, 0x2002, 0x3003, 0x4004,
|
||||
0x5005, 0x6006, 0x7007);
|
||||
},
|
||||
[i](PPCContext* ctx) {
|
||||
auto result = ctx->r[3];
|
||||
REQUIRE(result == (i | (i << 12)));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("EXTRACT_INT16_CONSTANT", "[instr]") {
|
||||
for (int i = 0; i < 8; ++i) {
|
||||
TestFunction([i](hir::HIRBuilder& b) {
|
||||
StoreGPR(b, 3,
|
||||
b.ZeroExtend(b.Extract(LoadVR(b, 4),
|
||||
b.LoadConstant(int8_t(i)),
|
||||
INT16_TYPE),
|
||||
INT64_TYPE));
|
||||
b.Return();
|
||||
}).Run([i](PPCContext* ctx) {
|
||||
ctx->r[4] = i;
|
||||
ctx->v[4] = vec128s(0, 1, 2, 3, 4, 5, 6, 7);
|
||||
},
|
||||
[i](PPCContext* ctx) {
|
||||
auto result = ctx->r[3];
|
||||
REQUIRE(result == i);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("EXTRACT_INT32", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreGPR(b, 3, b.ZeroExtend(b.Extract(LoadVR(b, 4),
|
||||
b.Truncate(LoadGPR(b, 4), INT8_TYPE),
|
||||
INT32_TYPE),
|
||||
INT64_TYPE));
|
||||
b.Return();
|
||||
});
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
test.Run([i](PPCContext* ctx) {
|
||||
ctx->r[4] = i;
|
||||
ctx->v[4] = vec128i(0, 1, 2, 3);
|
||||
},
|
||||
[i](PPCContext* ctx) {
|
||||
auto result = ctx->r[3];
|
||||
REQUIRE(result == i);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("EXTRACT_INT32_CONSTANT", "[instr]") {
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
TestFunction([i](hir::HIRBuilder& b) {
|
||||
StoreGPR(b, 3,
|
||||
b.ZeroExtend(b.Extract(LoadVR(b, 4),
|
||||
b.LoadConstant(int8_t(i)),
|
||||
INT32_TYPE),
|
||||
INT64_TYPE));
|
||||
b.Return();
|
||||
}).Run([i](PPCContext* ctx) {
|
||||
ctx->r[4] = i;
|
||||
ctx->v[4] = vec128i(0, 1, 2, 3);
|
||||
},
|
||||
[i](PPCContext* ctx) {
|
||||
auto result = ctx->r[3];
|
||||
REQUIRE(result == i);
|
||||
});
|
||||
}
|
||||
}
|
||||
83
tools/alloy-test/test_insert.cc
Normal file
83
tools/alloy-test/test_insert.cc
Normal file
@@ -0,0 +1,83 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* Xenia : Xbox 360 Emulator Research Project *
|
||||
******************************************************************************
|
||||
* Copyright 2014 Ben Vanik. All rights reserved. *
|
||||
* Released under the BSD license - see LICENSE in the root for more details. *
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include <tools/alloy-test/util.h>
|
||||
|
||||
#include <cfloat>
|
||||
|
||||
using namespace alloy;
|
||||
using namespace alloy::hir;
|
||||
using namespace alloy::runtime;
|
||||
using namespace alloy::test;
|
||||
using alloy::frontend::ppc::PPCContext;
|
||||
|
||||
TEST_CASE("INSERT_INT8", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.Insert(LoadVR(b, 4), LoadGPR(b, 4),
|
||||
b.Truncate(LoadGPR(b, 5), INT8_TYPE)));
|
||||
b.Return();
|
||||
});
|
||||
for (int i = 0; i < 16; ++i) {
|
||||
test.Run([i](PPCContext* ctx) {
|
||||
ctx->v[4] = vec128b(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
|
||||
14, 15);
|
||||
ctx->r[4] = i;
|
||||
ctx->r[5] = 100 + i;
|
||||
},
|
||||
[i](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
auto expected = vec128b(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
|
||||
13, 14, 15);
|
||||
expected.i8[i ^ 0x3] = 100 + i;
|
||||
REQUIRE(result == expected);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("INSERT_INT16", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.Insert(LoadVR(b, 4), LoadGPR(b, 4),
|
||||
b.Truncate(LoadGPR(b, 5), INT16_TYPE)));
|
||||
b.Return();
|
||||
});
|
||||
for (int i = 0; i < 8; ++i) {
|
||||
test.Run([i](PPCContext* ctx) {
|
||||
ctx->v[4] = vec128s(0, 1, 2, 3, 4, 5, 6, 7);
|
||||
ctx->r[4] = i;
|
||||
ctx->r[5] = 100 + i;
|
||||
},
|
||||
[i](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
auto expected = vec128s(0, 1, 2, 3, 4, 5, 6, 7);
|
||||
expected.i16[i ^ 0x1] = 100 + i;
|
||||
REQUIRE(result == expected);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("INSERT_INT32", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.Insert(LoadVR(b, 4), LoadGPR(b, 4),
|
||||
b.Truncate(LoadGPR(b, 5), INT32_TYPE)));
|
||||
b.Return();
|
||||
});
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
test.Run([i](PPCContext* ctx) {
|
||||
ctx->v[4] = vec128i(0, 1, 2, 3);
|
||||
ctx->r[4] = i;
|
||||
ctx->r[5] = 100 + i;
|
||||
},
|
||||
[i](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
auto expected = vec128i(0, 1, 2, 3);
|
||||
expected.i32[i] = 100 + i;
|
||||
REQUIRE(result == expected);
|
||||
});
|
||||
}
|
||||
}
|
||||
78
tools/alloy-test/test_load_vector_shl_shr.cc
Normal file
78
tools/alloy-test/test_load_vector_shl_shr.cc
Normal file
@@ -0,0 +1,78 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* Xenia : Xbox 360 Emulator Research Project *
|
||||
******************************************************************************
|
||||
* Copyright 2014 Ben Vanik. All rights reserved. *
|
||||
* Released under the BSD license - see LICENSE in the root for more details. *
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include <tools/alloy-test/util.h>
|
||||
|
||||
using namespace alloy;
|
||||
using namespace alloy::hir;
|
||||
using namespace alloy::runtime;
|
||||
using namespace alloy::test;
|
||||
using alloy::frontend::ppc::PPCContext;
|
||||
|
||||
TEST_CASE("LOAD_VECTOR_SHL", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.LoadVectorShl(b.Truncate(LoadGPR(b, 4), INT8_TYPE)));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) { ctx->r[4] = 0; },
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128b(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
|
||||
13, 14, 15));
|
||||
});
|
||||
test.Run([](PPCContext* ctx) { ctx->r[4] = 7; },
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128b(7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
|
||||
18, 19, 20, 21, 22));
|
||||
});
|
||||
test.Run([](PPCContext* ctx) { ctx->r[4] = 15; },
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128b(15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
|
||||
25, 26, 27, 28, 29, 30));
|
||||
});
|
||||
test.Run([](PPCContext* ctx) { ctx->r[4] = 16; },
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128b(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
|
||||
13, 14, 15));
|
||||
});
|
||||
}
|
||||
|
||||
TEST_CASE("LOAD_VECTOR_SHR", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.LoadVectorShr(b.Truncate(LoadGPR(b, 4), INT8_TYPE)));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) { ctx->r[4] = 0; },
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128b(16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
|
||||
26, 27, 28, 29, 30, 31));
|
||||
});
|
||||
test.Run([](PPCContext* ctx) { ctx->r[4] = 7; },
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128b(9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||
19, 20, 21, 22, 23, 24));
|
||||
});
|
||||
test.Run([](PPCContext* ctx) { ctx->r[4] = 15; },
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128b(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
|
||||
13, 14, 15, 16));
|
||||
});
|
||||
test.Run([](PPCContext* ctx) { ctx->r[4] = 16; },
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128b(16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
|
||||
26, 27, 28, 29, 30, 31));
|
||||
});
|
||||
}
|
||||
111
tools/alloy-test/test_pack.cc
Normal file
111
tools/alloy-test/test_pack.cc
Normal file
@@ -0,0 +1,111 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* Xenia : Xbox 360 Emulator Research Project *
|
||||
******************************************************************************
|
||||
* Copyright 2014 Ben Vanik. All rights reserved. *
|
||||
* Released under the BSD license - see LICENSE in the root for more details. *
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include <tools/alloy-test/util.h>
|
||||
|
||||
using namespace alloy;
|
||||
using namespace alloy::hir;
|
||||
using namespace alloy::runtime;
|
||||
using namespace alloy::test;
|
||||
using alloy::frontend::ppc::PPCContext;
|
||||
|
||||
TEST_CASE("PACK_D3DCOLOR", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.Pack(LoadVR(b, 4), PACK_TYPE_D3DCOLOR));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) { ctx->v[4] = vec128f(1.0f); },
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128i(0));
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[4] =
|
||||
vec128i(0x3F800050, 0x3F800060, 0x3F800070, 0x3F800080);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128i(0, 0, 0, 0x80506070));
|
||||
});
|
||||
}
|
||||
|
||||
TEST_CASE("PACK_FLOAT16_2", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.Pack(LoadVR(b, 4), PACK_TYPE_FLOAT16_2));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) { ctx->v[4] = vec128i(0, 0, 0, 0x3F800000); },
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128i(0));
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[4] =
|
||||
vec128i(0x47FFE000, 0xC7FFE000, 0x00000000, 0x3F800000);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128i(0, 0, 0, 0x7FFFFFFF));
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[4] =
|
||||
vec128i(0x42AAA000, 0x44CCC000, 0x00000000, 0x3F800000);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128i(0, 0, 0, 0x55556666));
|
||||
});
|
||||
}
|
||||
|
||||
TEST_CASE("PACK_FLOAT16_4", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.Pack(LoadVR(b, 4), PACK_TYPE_FLOAT16_4));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) { ctx->v[4] = vec128i(0, 0, 0, 0); },
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128i(0));
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[4] =
|
||||
vec128i(0x449A4000, 0x45B17000, 0x41103261, 0x40922B6B);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result ==
|
||||
vec128i(0x00000000, 0x00000000, 0x64D26D8C, 0x48824491));
|
||||
});
|
||||
}
|
||||
|
||||
TEST_CASE("PACK_SHORT_2", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.Pack(LoadVR(b, 4), PACK_TYPE_SHORT_2));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) { ctx->v[4] = vec128i(0); },
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128i(0));
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[4] = vec128i(0x43817E00, 0xC37CFC00, 0, 0);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128i(0, 0, 0, 0x7FFF8001));
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[4] = vec128i(0xC0D47D97, 0xC2256E9D, 0, 0);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128i(0, 0, 0, 0x80018001));
|
||||
});
|
||||
}
|
||||
139
tools/alloy-test/test_permute.cc
Normal file
139
tools/alloy-test/test_permute.cc
Normal file
@@ -0,0 +1,139 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* Xenia : Xbox 360 Emulator Research Project *
|
||||
******************************************************************************
|
||||
* Copyright 2014 Ben Vanik. All rights reserved. *
|
||||
* Released under the BSD license - see LICENSE in the root for more details. *
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include <tools/alloy-test/util.h>
|
||||
|
||||
using namespace alloy;
|
||||
using namespace alloy::hir;
|
||||
using namespace alloy::runtime;
|
||||
using namespace alloy::test;
|
||||
using alloy::frontend::ppc::PPCContext;
|
||||
|
||||
TEST_CASE("PERMUTE_V128_BY_INT32_CONSTANT", "[instr]") {
|
||||
{
|
||||
uint32_t mask = PERMUTE_MASK(0, 0, 0, 1, 0, 2, 0, 3);
|
||||
TestFunction([mask](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.Permute(b.LoadConstant(mask), LoadVR(b, 4),
|
||||
LoadVR(b, 5), INT32_TYPE));
|
||||
b.Return();
|
||||
}).Run([](PPCContext* ctx) {
|
||||
ctx->v[4] = vec128i(0, 1, 2, 3);
|
||||
ctx->v[5] = vec128i(4, 5, 6, 7);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128i(0, 1, 2, 3));
|
||||
});
|
||||
}
|
||||
{
|
||||
uint32_t mask = PERMUTE_MASK(1, 0, 1, 1, 1, 2, 1, 3);
|
||||
TestFunction([mask](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.Permute(b.LoadConstant(mask), LoadVR(b, 4),
|
||||
LoadVR(b, 5), INT32_TYPE));
|
||||
b.Return();
|
||||
}).Run([](PPCContext* ctx) {
|
||||
ctx->v[4] = vec128i(0, 1, 2, 3);
|
||||
ctx->v[5] = vec128i(4, 5, 6, 7);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128i(4, 5, 6, 7));
|
||||
});
|
||||
}
|
||||
{
|
||||
uint32_t mask = PERMUTE_MASK(0, 3, 0, 2, 0, 1, 0, 0);
|
||||
TestFunction([mask](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.Permute(b.LoadConstant(mask), LoadVR(b, 4),
|
||||
LoadVR(b, 5), INT32_TYPE));
|
||||
b.Return();
|
||||
}).Run([](PPCContext* ctx) {
|
||||
ctx->v[4] = vec128i(0, 1, 2, 3);
|
||||
ctx->v[5] = vec128i(4, 5, 6, 7);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128i(3, 2, 1, 0));
|
||||
});
|
||||
}
|
||||
{
|
||||
uint32_t mask = PERMUTE_MASK(1, 3, 1, 2, 1, 1, 1, 0);
|
||||
TestFunction([mask](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.Permute(b.LoadConstant(mask), LoadVR(b, 4),
|
||||
LoadVR(b, 5), INT32_TYPE));
|
||||
b.Return();
|
||||
}).Run([](PPCContext* ctx) {
|
||||
ctx->v[4] = vec128i(0, 1, 2, 3);
|
||||
ctx->v[5] = vec128i(4, 5, 6, 7);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128i(7, 6, 5, 4));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("PERMUTE_V128_BY_V128", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3,
|
||||
b.Permute(LoadVR(b, 3), LoadVR(b, 4), LoadVR(b, 5), VEC128_TYPE));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[3] =
|
||||
vec128b(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
|
||||
ctx->v[4] = vec128b(100, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
|
||||
14, 15);
|
||||
ctx->v[5] = vec128b(16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
|
||||
28, 29, 30, 31);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128b(100, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
|
||||
12, 13, 14, 15));
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[3] = vec128b(16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
|
||||
28, 29, 30, 31);
|
||||
ctx->v[4] =
|
||||
vec128b(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
|
||||
ctx->v[5] = vec128b(116, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
|
||||
27, 28, 29, 30, 31);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128b(116, 17, 18, 19, 20, 21, 22, 23, 24, 25,
|
||||
26, 27, 28, 29, 30, 31));
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[3] =
|
||||
vec128b(15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0);
|
||||
ctx->v[4] = vec128b(100, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
|
||||
14, 15);
|
||||
ctx->v[5] = vec128b(16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
|
||||
28, 29, 30, 31);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128b(15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4,
|
||||
3, 2, 1, 100));
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[3] = vec128b(31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20,
|
||||
19, 18, 17, 16);
|
||||
ctx->v[4] =
|
||||
vec128b(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
|
||||
ctx->v[5] = vec128b(16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
|
||||
28, 29, 30, 131);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128b(131, 30, 29, 28, 27, 26, 25, 24, 23, 22,
|
||||
21, 20, 19, 18, 17, 16));
|
||||
});
|
||||
}
|
||||
211
tools/alloy-test/test_sha.cc
Normal file
211
tools/alloy-test/test_sha.cc
Normal file
@@ -0,0 +1,211 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* Xenia : Xbox 360 Emulator Research Project *
|
||||
******************************************************************************
|
||||
* Copyright 2014 Ben Vanik. All rights reserved. *
|
||||
* Released under the BSD license - see LICENSE in the root for more details. *
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include <tools/alloy-test/util.h>
|
||||
|
||||
using namespace alloy;
|
||||
using namespace alloy::hir;
|
||||
using namespace alloy::runtime;
|
||||
using namespace alloy::test;
|
||||
using alloy::frontend::ppc::PPCContext;
|
||||
|
||||
TEST_CASE("SHA_I8", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreGPR(b, 3, b.ZeroExtend(b.Sha(b.Truncate(LoadGPR(b, 4), INT8_TYPE),
|
||||
b.Truncate(LoadGPR(b, 5), INT8_TYPE)),
|
||||
INT64_TYPE));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0xF0;
|
||||
ctx->r[5] = 4;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint8_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0xFF);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0xFF;
|
||||
ctx->r[5] = 0;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint8_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0xFF);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0xFF;
|
||||
ctx->r[5] = 1;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint8_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0xFF);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0x80;
|
||||
ctx->r[5] = 8;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint8_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0xFF);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0x7F;
|
||||
ctx->r[5] = 7;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint8_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0);
|
||||
});
|
||||
}
|
||||
|
||||
TEST_CASE("SHA_I16", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreGPR(b, 3, b.ZeroExtend(b.Sha(b.Truncate(LoadGPR(b, 4), INT16_TYPE),
|
||||
b.Truncate(LoadGPR(b, 5), INT8_TYPE)),
|
||||
INT64_TYPE));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0xFF00;
|
||||
ctx->r[5] = 8;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint16_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0xFFFF);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0xFFFF;
|
||||
ctx->r[5] = 0;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint16_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0xFFFF);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0xFFFE;
|
||||
ctx->r[5] = 1;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint16_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0xFFFF);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0x8000;
|
||||
ctx->r[5] = 16;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint16_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0xFFFF);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0x7FFF;
|
||||
ctx->r[5] = 15;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint16_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0);
|
||||
});
|
||||
}
|
||||
|
||||
TEST_CASE("SHA_I32", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreGPR(b, 3, b.ZeroExtend(b.Sha(b.Truncate(LoadGPR(b, 4), INT32_TYPE),
|
||||
b.Truncate(LoadGPR(b, 5), INT8_TYPE)),
|
||||
INT64_TYPE));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0xFFFF0000;
|
||||
ctx->r[5] = 16;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint32_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0xFFFFFFFF);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0xFFFFFFFF;
|
||||
ctx->r[5] = 0;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint32_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0xFFFFFFFF);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0xFFFFFFFE;
|
||||
ctx->r[5] = 1;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint32_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0xFFFFFFFF);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0x80000000;
|
||||
ctx->r[5] = 32;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint32_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0x80000000);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0x7FFFFFFF;
|
||||
ctx->r[5] = 31;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint32_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0);
|
||||
});
|
||||
}
|
||||
|
||||
TEST_CASE("SHA_I64", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreGPR(b, 3, b.Sha(b.Truncate(LoadGPR(b, 4), INT64_TYPE),
|
||||
b.Truncate(LoadGPR(b, 5), INT8_TYPE)));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0xFFFFFFFF00000000ull;
|
||||
ctx->r[5] = 32;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint64_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0xFFFFFFFFFFFFFFFFull);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0xFFFFFFFFFFFFFFFFull;
|
||||
ctx->r[5] = 0;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint64_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0xFFFFFFFFFFFFFFFFull);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0xFFFFFFFFFFFFFFFEull;
|
||||
ctx->r[5] = 1;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint64_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0xFFFFFFFFFFFFFFFFull);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0x8000000000000000ull;
|
||||
ctx->r[5] = 64;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint64_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0x8000000000000000ull);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0x7FFFFFFFFFFFFFFFull;
|
||||
ctx->r[5] = 63;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint64_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0);
|
||||
});
|
||||
}
|
||||
211
tools/alloy-test/test_shl.cc
Normal file
211
tools/alloy-test/test_shl.cc
Normal file
@@ -0,0 +1,211 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* Xenia : Xbox 360 Emulator Research Project *
|
||||
******************************************************************************
|
||||
* Copyright 2014 Ben Vanik. All rights reserved. *
|
||||
* Released under the BSD license - see LICENSE in the root for more details. *
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include <tools/alloy-test/util.h>
|
||||
|
||||
using namespace alloy;
|
||||
using namespace alloy::hir;
|
||||
using namespace alloy::runtime;
|
||||
using namespace alloy::test;
|
||||
using alloy::frontend::ppc::PPCContext;
|
||||
|
||||
TEST_CASE("SHL_I8", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreGPR(b, 3, b.ZeroExtend(b.Shl(b.Truncate(LoadGPR(b, 4), INT8_TYPE),
|
||||
b.Truncate(LoadGPR(b, 5), INT8_TYPE)),
|
||||
INT64_TYPE));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0x0F;
|
||||
ctx->r[5] = 4;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint8_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0xF0);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0xFF;
|
||||
ctx->r[5] = 0;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint8_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0xFF);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0xFF;
|
||||
ctx->r[5] = 1;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint8_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0xFE);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0x80;
|
||||
ctx->r[5] = 8;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint8_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0x7F;
|
||||
ctx->r[5] = 7;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint8_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0x80);
|
||||
});
|
||||
}
|
||||
|
||||
TEST_CASE("SHL_I16", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreGPR(b, 3, b.ZeroExtend(b.Shl(b.Truncate(LoadGPR(b, 4), INT16_TYPE),
|
||||
b.Truncate(LoadGPR(b, 5), INT8_TYPE)),
|
||||
INT64_TYPE));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0x00FF;
|
||||
ctx->r[5] = 8;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint16_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0xFF00);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0xFFFF;
|
||||
ctx->r[5] = 0;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint16_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0xFFFF);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0x7FFF;
|
||||
ctx->r[5] = 1;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint16_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0xFFFE);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0x8000;
|
||||
ctx->r[5] = 16;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint16_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0x7FFF;
|
||||
ctx->r[5] = 15;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint16_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0x8000);
|
||||
});
|
||||
}
|
||||
|
||||
TEST_CASE("SHL_I32", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreGPR(b, 3, b.ZeroExtend(b.Shl(b.Truncate(LoadGPR(b, 4), INT32_TYPE),
|
||||
b.Truncate(LoadGPR(b, 5), INT8_TYPE)),
|
||||
INT64_TYPE));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0x0000FFFF;
|
||||
ctx->r[5] = 16;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint32_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0xFFFF0000);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0xFFFFFFFF;
|
||||
ctx->r[5] = 0;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint32_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0xFFFFFFFF);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0x7FFFFFFF;
|
||||
ctx->r[5] = 1;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint32_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0xFFFFFFFE);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0x80000000;
|
||||
ctx->r[5] = 32;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint32_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0x80000000);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0x7FFFFFFF;
|
||||
ctx->r[5] = 31;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint32_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0x80000000);
|
||||
});
|
||||
}
|
||||
|
||||
TEST_CASE("SHL_I64", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreGPR(b, 3, b.Shl(b.Truncate(LoadGPR(b, 4), INT64_TYPE),
|
||||
b.Truncate(LoadGPR(b, 5), INT8_TYPE)));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0x00000000FFFFFFFFull;
|
||||
ctx->r[5] = 32;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint64_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0xFFFFFFFF00000000ull);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0xFFFFFFFFFFFFFFFFull;
|
||||
ctx->r[5] = 0;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint64_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0xFFFFFFFFFFFFFFFFull);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0x7FFFFFFFFFFFFFFFull;
|
||||
ctx->r[5] = 1;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint64_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0xFFFFFFFFFFFFFFFEull);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0x8000000000000000ull;
|
||||
ctx->r[5] = 64;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint64_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0x8000000000000000ull);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0x7FFFFFFFFFFFFFFFull;
|
||||
ctx->r[5] = 63;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint64_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0x8000000000000000ull);
|
||||
});
|
||||
}
|
||||
211
tools/alloy-test/test_shr.cc
Normal file
211
tools/alloy-test/test_shr.cc
Normal file
@@ -0,0 +1,211 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* Xenia : Xbox 360 Emulator Research Project *
|
||||
******************************************************************************
|
||||
* Copyright 2014 Ben Vanik. All rights reserved. *
|
||||
* Released under the BSD license - see LICENSE in the root for more details. *
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include <tools/alloy-test/util.h>
|
||||
|
||||
using namespace alloy;
|
||||
using namespace alloy::hir;
|
||||
using namespace alloy::runtime;
|
||||
using namespace alloy::test;
|
||||
using alloy::frontend::ppc::PPCContext;
|
||||
|
||||
TEST_CASE("SHR_I8", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreGPR(b, 3, b.ZeroExtend(b.Shr(b.Truncate(LoadGPR(b, 4), INT8_TYPE),
|
||||
b.Truncate(LoadGPR(b, 5), INT8_TYPE)),
|
||||
INT64_TYPE));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0xF0;
|
||||
ctx->r[5] = 4;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint8_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0x0F);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0xFF;
|
||||
ctx->r[5] = 0;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint8_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0xFF);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0xFF;
|
||||
ctx->r[5] = 1;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint8_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0x7F);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0x80;
|
||||
ctx->r[5] = 8;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint8_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0x7F;
|
||||
ctx->r[5] = 7;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint8_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0);
|
||||
});
|
||||
}
|
||||
|
||||
TEST_CASE("SHR_I16", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreGPR(b, 3, b.ZeroExtend(b.Shr(b.Truncate(LoadGPR(b, 4), INT16_TYPE),
|
||||
b.Truncate(LoadGPR(b, 5), INT8_TYPE)),
|
||||
INT64_TYPE));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0xFF00;
|
||||
ctx->r[5] = 8;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint16_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0x00FF);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0xFFFF;
|
||||
ctx->r[5] = 0;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint16_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0xFFFF);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0xFFFE;
|
||||
ctx->r[5] = 1;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint16_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0x7FFF);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0x8000;
|
||||
ctx->r[5] = 16;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint16_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0x7FFF;
|
||||
ctx->r[5] = 15;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint16_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0);
|
||||
});
|
||||
}
|
||||
|
||||
TEST_CASE("SHR_I32", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreGPR(b, 3, b.ZeroExtend(b.Shr(b.Truncate(LoadGPR(b, 4), INT32_TYPE),
|
||||
b.Truncate(LoadGPR(b, 5), INT8_TYPE)),
|
||||
INT64_TYPE));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0xFFFF0000;
|
||||
ctx->r[5] = 16;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint32_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0x0000FFFF);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0xFFFFFFFF;
|
||||
ctx->r[5] = 0;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint32_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0xFFFFFFFF);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0xFFFFFFFE;
|
||||
ctx->r[5] = 1;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint32_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0x7FFFFFFF);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0x80000000;
|
||||
ctx->r[5] = 32;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint32_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0x80000000);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0x7FFFFFFF;
|
||||
ctx->r[5] = 31;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint32_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0);
|
||||
});
|
||||
}
|
||||
|
||||
TEST_CASE("SHR_I64", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreGPR(b, 3, b.Shr(b.Truncate(LoadGPR(b, 4), INT64_TYPE),
|
||||
b.Truncate(LoadGPR(b, 5), INT8_TYPE)));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0xFFFFFFFF00000000ull;
|
||||
ctx->r[5] = 32;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint64_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0x00000000FFFFFFFFull);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0xFFFFFFFFFFFFFFFFull;
|
||||
ctx->r[5] = 0;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint64_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0xFFFFFFFFFFFFFFFFull);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0xFFFFFFFFFFFFFFFEull;
|
||||
ctx->r[5] = 1;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint64_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0x7FFFFFFFFFFFFFFFull);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0x8000000000000000ull;
|
||||
ctx->r[5] = 64;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint64_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0x8000000000000000ull);
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->r[4] = 0x7FFFFFFFFFFFFFFFull;
|
||||
ctx->r[5] = 63;
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = static_cast<uint64_t>(ctx->r[3]);
|
||||
REQUIRE(result == 0);
|
||||
});
|
||||
}
|
||||
46
tools/alloy-test/test_swizzle.cc
Normal file
46
tools/alloy-test/test_swizzle.cc
Normal file
@@ -0,0 +1,46 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* Xenia : Xbox 360 Emulator Research Project *
|
||||
******************************************************************************
|
||||
* Copyright 2014 Ben Vanik. All rights reserved. *
|
||||
* Released under the BSD license - see LICENSE in the root for more details. *
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include <tools/alloy-test/util.h>
|
||||
|
||||
using namespace alloy;
|
||||
using namespace alloy::hir;
|
||||
using namespace alloy::runtime;
|
||||
using namespace alloy::test;
|
||||
using alloy::frontend::ppc::PPCContext;
|
||||
|
||||
TEST_CASE("SWIZZLE_V128", "[instr]") {
|
||||
TestFunction([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.Swizzle(LoadVR(b, 4), INT32_TYPE,
|
||||
SWIZZLE_MASK(0, 1, 2, 3)));
|
||||
b.Return();
|
||||
}).Run([](PPCContext* ctx) { ctx->v[4] = vec128i(0, 1, 2, 3); },
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128i(0, 1, 2, 3));
|
||||
});
|
||||
TestFunction([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.Swizzle(LoadVR(b, 4), INT32_TYPE,
|
||||
SWIZZLE_MASK(3, 2, 1, 0)));
|
||||
b.Return();
|
||||
}).Run([](PPCContext* ctx) { ctx->v[4] = vec128i(0, 1, 2, 3); },
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128i(3, 2, 1, 0));
|
||||
});
|
||||
TestFunction([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.Swizzle(LoadVR(b, 4), INT32_TYPE,
|
||||
SWIZZLE_MASK(1, 1, 2, 2)));
|
||||
b.Return();
|
||||
}).Run([](PPCContext* ctx) { ctx->v[4] = vec128i(0, 1, 2, 3); },
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128i(1, 1, 2, 2));
|
||||
});
|
||||
}
|
||||
162
tools/alloy-test/test_unpack.cc
Normal file
162
tools/alloy-test/test_unpack.cc
Normal file
@@ -0,0 +1,162 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* Xenia : Xbox 360 Emulator Research Project *
|
||||
******************************************************************************
|
||||
* Copyright 2014 Ben Vanik. All rights reserved. *
|
||||
* Released under the BSD license - see LICENSE in the root for more details. *
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include <tools/alloy-test/util.h>
|
||||
|
||||
using namespace alloy;
|
||||
using namespace alloy::hir;
|
||||
using namespace alloy::runtime;
|
||||
using namespace alloy::test;
|
||||
using alloy::frontend::ppc::PPCContext;
|
||||
|
||||
TEST_CASE("UNPACK_D3DCOLOR", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.Unpack(LoadVR(b, 4), PACK_TYPE_D3DCOLOR));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
uint32_t value = 0;
|
||||
ctx->v[4] = vec128i(0, 0, 0, value);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128f(1.0f, 1.0f, 1.0f, 1.0f));
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
uint32_t value = 0x80506070;
|
||||
ctx->v[4] = vec128i(0, 0, 0, value);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result ==
|
||||
vec128i(0x3F800050, 0x3F800060, 0x3F800070, 0x3F800080));
|
||||
});
|
||||
}
|
||||
|
||||
TEST_CASE("UNPACK_FLOAT16_2", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.Unpack(LoadVR(b, 4), PACK_TYPE_FLOAT16_2));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) { ctx->v[4] = vec128i(0); },
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128i(0, 0, 0, 0x3F800000));
|
||||
});
|
||||
test.Run([](PPCContext* ctx) { ctx->v[4] = vec128i(0, 0, 0, 0x7FFFFFFF); },
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result ==
|
||||
vec128i(0x47FFE000, 0xC7FFE000, 0x00000000, 0x3F800000));
|
||||
});
|
||||
test.Run([](PPCContext* ctx) { ctx->v[4] = vec128i(0, 0, 0, 0x55556666); },
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result ==
|
||||
vec128i(0x42AAA000, 0x44CCC000, 0x00000000, 0x3F800000));
|
||||
});
|
||||
}
|
||||
|
||||
TEST_CASE("UNPACK_FLOAT16_4", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.Unpack(LoadVR(b, 4), PACK_TYPE_FLOAT16_4));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) { ctx->v[4] = vec128i(0); },
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128i(0));
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[4] = vec128s(0, 0, 0, 0, 0x64D2, 0x6D8B, 0x4881, 0x4491);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result ==
|
||||
vec128i(0x449A4000, 0x45B16000, 0x41102000, 0x40922000));
|
||||
});
|
||||
}
|
||||
|
||||
TEST_CASE("UNPACK_SHORT_2", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.Unpack(LoadVR(b, 4), PACK_TYPE_SHORT_2));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) { ctx->v[4] = vec128i(0); },
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result ==
|
||||
vec128i(0x40400000, 0x40400000, 0x00000000, 0x3F800000));
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[4] =
|
||||
vec128i(0x7004FD60, 0x8201C990, 0x00000000, 0x7FFF8001);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result ==
|
||||
vec128i(0x40407FFF, 0x403F8001, 0x00000000, 0x3F800000));
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[4] = vec128i(0, 0, 0, (0x1234u << 16) | 0x5678u);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result ==
|
||||
vec128i(0x40401234, 0x40405678, 0x00000000, 0x3F800000));
|
||||
});
|
||||
}
|
||||
|
||||
// TEST_CASE("UNPACK_S8_IN_16_LO", "[instr]") {
|
||||
// TestFunction test([](hir::HIRBuilder& b) {
|
||||
// StoreVR(b, 3, b.Unpack(LoadVR(b, 4), PACK_TYPE_S8_IN_16_LO));
|
||||
// b.Return();
|
||||
// });
|
||||
// test.Run([](PPCContext* ctx) { ctx->v[4] = vec128b(0); },
|
||||
// [](PPCContext* ctx) {
|
||||
// auto result = ctx->v[3];
|
||||
// REQUIRE(result == vec128b(0));
|
||||
// });
|
||||
//}
|
||||
//
|
||||
// TEST_CASE("UNPACK_S8_IN_16_HI", "[instr]") {
|
||||
// TestFunction test([](hir::HIRBuilder& b) {
|
||||
// StoreVR(b, 3, b.Unpack(LoadVR(b, 4), PACK_TYPE_S8_IN_16_HI));
|
||||
// b.Return();
|
||||
// });
|
||||
// test.Run([](PPCContext* ctx) { ctx->v[4] = vec128b(0); },
|
||||
// [](PPCContext* ctx) {
|
||||
// auto result = ctx->v[3];
|
||||
// REQUIRE(result == vec128b(0));
|
||||
// });
|
||||
//}
|
||||
//
|
||||
// TEST_CASE("UNPACK_S16_IN_32_LO", "[instr]") {
|
||||
// TestFunction test([](hir::HIRBuilder& b) {
|
||||
// StoreVR(b, 3, b.Unpack(LoadVR(b, 4), PACK_TYPE_S16_IN_32_LO));
|
||||
// b.Return();
|
||||
// });
|
||||
// test.Run([](PPCContext* ctx) { ctx->v[4] = vec128b(0); },
|
||||
// [](PPCContext* ctx) {
|
||||
// auto result = ctx->v[3];
|
||||
// REQUIRE(result == vec128b(0));
|
||||
// });
|
||||
//}
|
||||
//
|
||||
// TEST_CASE("UNPACK_S16_IN_32_HI", "[instr]") {
|
||||
// TestFunction test([](hir::HIRBuilder& b) {
|
||||
// StoreVR(b, 3, b.Unpack(LoadVR(b, 4), PACK_TYPE_S16_IN_32_HI));
|
||||
// b.Return();
|
||||
// });
|
||||
// test.Run([](PPCContext* ctx) { ctx->v[4] = vec128b(0); },
|
||||
// [](PPCContext* ctx) {
|
||||
// auto result = ctx->v[3];
|
||||
// REQUIRE(result == vec128b(0));
|
||||
// });
|
||||
//}
|
||||
71
tools/alloy-test/test_vector_rotate_left.cc
Normal file
71
tools/alloy-test/test_vector_rotate_left.cc
Normal file
@@ -0,0 +1,71 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* Xenia : Xbox 360 Emulator Research Project *
|
||||
******************************************************************************
|
||||
* Copyright 2014 Ben Vanik. All rights reserved. *
|
||||
* Released under the BSD license - see LICENSE in the root for more details. *
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include <third_party/xbyak/xbyak/xbyak_bin2hex.h>
|
||||
#include <tools/alloy-test/util.h>
|
||||
|
||||
using namespace alloy;
|
||||
using namespace alloy::hir;
|
||||
using namespace alloy::runtime;
|
||||
using namespace alloy::test;
|
||||
using alloy::frontend::ppc::PPCContext;
|
||||
|
||||
TEST_CASE("VECTOR_ROTATE_LEFT_I8", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.VectorRotateLeft(LoadVR(b, 4), LoadVR(b, 5), INT8_TYPE));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[4] = vec128b(B00000001);
|
||||
ctx->v[5] =
|
||||
vec128b(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result ==
|
||||
vec128b(B00000001, B00000010, B00000100, B00001000,
|
||||
B00010000, B00100000, B01000000, B10000000,
|
||||
B00000001, B00000010, B00000100, B00001000,
|
||||
B00010000, B00100000, B01000000, B10000000));
|
||||
});
|
||||
}
|
||||
|
||||
TEST_CASE("VECTOR_ROTATE_LEFT_I16", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.VectorRotateLeft(LoadVR(b, 4), LoadVR(b, 5), INT16_TYPE));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[4] = vec128s(0x0001, 0x0001, 0x0001, 0x0001, 0x1000, 0x1000,
|
||||
0x1000, 0x1000);
|
||||
ctx->v[5] = vec128s(0, 1, 2, 3, 14, 15, 16, 17);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128s(0x0001, 0x0002, 0x0004, 0x0008, 0x0400,
|
||||
0x0800, 0x1000, 0x2000));
|
||||
});
|
||||
}
|
||||
|
||||
TEST_CASE("VECTOR_ROTATE_LEFT_I32", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.VectorRotateLeft(LoadVR(b, 4), LoadVR(b, 5), INT32_TYPE));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[4] =
|
||||
vec128i(0x00000001, 0x00000001, 0x80000000, 0x80000000);
|
||||
ctx->v[5] = vec128i(0, 1, 1, 2);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result ==
|
||||
vec128i(0x00000001, 0x00000002, 0x00000001, 0x00000002));
|
||||
});
|
||||
}
|
||||
145
tools/alloy-test/test_vector_sha.cc
Normal file
145
tools/alloy-test/test_vector_sha.cc
Normal file
@@ -0,0 +1,145 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* Xenia : Xbox 360 Emulator Research Project *
|
||||
******************************************************************************
|
||||
* Copyright 2014 Ben Vanik. All rights reserved. *
|
||||
* Released under the BSD license - see LICENSE in the root for more details. *
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include <tools/alloy-test/util.h>
|
||||
|
||||
using namespace alloy;
|
||||
using namespace alloy::hir;
|
||||
using namespace alloy::runtime;
|
||||
using namespace alloy::test;
|
||||
using alloy::frontend::ppc::PPCContext;
|
||||
|
||||
TEST_CASE("VECTOR_SHA_I8", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.VectorSha(LoadVR(b, 4), LoadVR(b, 5), INT8_TYPE));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[4] =
|
||||
vec128b(0x7E, 0x7E, 0x7E, 0x7F, 0x80, 0xFF, 0x01, 0x12, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
|
||||
ctx->v[5] =
|
||||
vec128b(0, 1, 2, 8, 4, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128b(0x7E, 0x3F, 0x1F, 0x7F, 0xF8, 0xFF, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00));
|
||||
});
|
||||
}
|
||||
|
||||
TEST_CASE("VECTOR_SHA_I8_CONSTANT", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.VectorSha(LoadVR(b, 4), b.LoadConstant(vec128b(
|
||||
0, 1, 2, 8, 4, 4, 6, 7, 8, 9,
|
||||
10, 11, 12, 13, 14, 15)),
|
||||
INT8_TYPE));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[4] =
|
||||
vec128b(0x7E, 0x7E, 0x7E, 0x7F, 0x80, 0xFF, 0x01, 0x12, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128b(0x7E, 0x3F, 0x1F, 0x7F, 0xF8, 0xFF, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00));
|
||||
});
|
||||
}
|
||||
|
||||
TEST_CASE("VECTOR_SHA_I16", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.VectorSha(LoadVR(b, 4), LoadVR(b, 5), INT16_TYPE));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[4] = vec128s(0x7FFE, 0x7FFE, 0x7FFE, 0x7FFF, 0x8000, 0xFFFF,
|
||||
0x0001, 0x1234);
|
||||
ctx->v[5] = vec128s(0, 1, 8, 15, 15, 8, 1, 16);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128s(0x7FFE, 0x3FFF, 0x007F, 0x0000, 0xFFFF,
|
||||
0xFFFF, 0x0000, 0x1234));
|
||||
});
|
||||
}
|
||||
|
||||
TEST_CASE("VECTOR_SHA_I16_CONSTANT", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.VectorSha(LoadVR(b, 4), b.LoadConstant(vec128s(
|
||||
0, 1, 8, 15, 15, 8, 1, 16)),
|
||||
INT16_TYPE));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[4] = vec128s(0x7FFE, 0x7FFE, 0x7FFE, 0x7FFF, 0x8000, 0xFFFF,
|
||||
0x0001, 0x1234);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128s(0x7FFE, 0x3FFF, 0x007F, 0x0000, 0xFFFF,
|
||||
0xFFFF, 0x0000, 0x1234));
|
||||
});
|
||||
}
|
||||
|
||||
TEST_CASE("VECTOR_SHA_I32", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.VectorSha(LoadVR(b, 4), LoadVR(b, 5), INT32_TYPE));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[4] =
|
||||
vec128i(0x7FFFFFFE, 0x7FFFFFFE, 0x7FFFFFFE, 0x7FFFFFFF);
|
||||
ctx->v[5] = vec128i(0, 1, 16, 31);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result ==
|
||||
vec128i(0x7FFFFFFE, 0x3FFFFFFF, 0x00007FFF, 0x00000000));
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[4] =
|
||||
vec128i(0x80000000, 0xFFFFFFFF, 0x00000001, 0x12345678);
|
||||
ctx->v[5] = vec128i(31, 16, 1, 32);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result ==
|
||||
vec128i(0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x12345678));
|
||||
});
|
||||
}
|
||||
|
||||
TEST_CASE("VECTOR_SHA_I32_CONSTANT", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3,
|
||||
b.VectorSha(LoadVR(b, 4), b.LoadConstant(vec128i(0, 1, 16, 31)),
|
||||
INT32_TYPE));
|
||||
StoreVR(b, 4,
|
||||
b.VectorSha(LoadVR(b, 5), b.LoadConstant(vec128i(31, 16, 1, 32)),
|
||||
INT32_TYPE));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[4] =
|
||||
vec128i(0x7FFFFFFE, 0x7FFFFFFE, 0x7FFFFFFE, 0x7FFFFFFF);
|
||||
ctx->v[5] =
|
||||
vec128i(0x80000000, 0xFFFFFFFF, 0x00000001, 0x12345678);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result1 = ctx->v[3];
|
||||
REQUIRE(result1 ==
|
||||
vec128i(0x7FFFFFFE, 0x3FFFFFFF, 0x00007FFF, 0x00000000));
|
||||
auto result2 = ctx->v[4];
|
||||
REQUIRE(result2 ==
|
||||
vec128i(0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x12345678));
|
||||
});
|
||||
}
|
||||
145
tools/alloy-test/test_vector_shl.cc
Normal file
145
tools/alloy-test/test_vector_shl.cc
Normal file
@@ -0,0 +1,145 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* Xenia : Xbox 360 Emulator Research Project *
|
||||
******************************************************************************
|
||||
* Copyright 2014 Ben Vanik. All rights reserved. *
|
||||
* Released under the BSD license - see LICENSE in the root for more details. *
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include <tools/alloy-test/util.h>
|
||||
|
||||
using namespace alloy;
|
||||
using namespace alloy::hir;
|
||||
using namespace alloy::runtime;
|
||||
using namespace alloy::test;
|
||||
using alloy::frontend::ppc::PPCContext;
|
||||
|
||||
TEST_CASE("VECTOR_SHL_I8", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.VectorShl(LoadVR(b, 4), LoadVR(b, 5), INT8_TYPE));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[4] =
|
||||
vec128b(0x7E, 0x7E, 0x7E, 0x7F, 0x80, 0xFF, 0x01, 0x12, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
|
||||
ctx->v[5] =
|
||||
vec128b(0, 1, 2, 8, 4, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128b(0x7E, 0xFC, 0xF8, 0x7F, 0x00, 0xF0, 0x40,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00));
|
||||
});
|
||||
}
|
||||
|
||||
TEST_CASE("VECTOR_SHL_I8_CONSTANT", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.VectorShl(LoadVR(b, 4), b.LoadConstant(vec128b(
|
||||
0, 1, 2, 8, 4, 4, 6, 7, 8, 9,
|
||||
10, 11, 12, 13, 14, 15)),
|
||||
INT8_TYPE));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[4] =
|
||||
vec128b(0x7E, 0x7E, 0x7E, 0x7F, 0x80, 0xFF, 0x01, 0x12, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128b(0x7E, 0xFC, 0xF8, 0x7F, 0x00, 0xF0, 0x40,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00));
|
||||
});
|
||||
}
|
||||
|
||||
TEST_CASE("VECTOR_SHL_I16", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.VectorShl(LoadVR(b, 4), LoadVR(b, 5), INT16_TYPE));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[4] = vec128s(0x7FFE, 0x7FFE, 0x7FFE, 0x7FFF, 0x8000, 0xFFFF,
|
||||
0x0001, 0x1234);
|
||||
ctx->v[5] = vec128s(0, 1, 8, 15, 15, 8, 1, 16);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128s(0x7FFE, 0xFFFC, 0xFE00, 0x8000, 0x0000,
|
||||
0xFF00, 0x0002, 0x1234));
|
||||
});
|
||||
}
|
||||
|
||||
TEST_CASE("VECTOR_SHL_I16_CONSTANT", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.VectorShl(LoadVR(b, 4), b.LoadConstant(vec128s(
|
||||
0, 1, 8, 15, 15, 8, 1, 16)),
|
||||
INT16_TYPE));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[4] = vec128s(0x7FFE, 0x7FFE, 0x7FFE, 0x7FFF, 0x8000, 0xFFFF,
|
||||
0x0001, 0x1234);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128s(0x7FFE, 0xFFFC, 0xFE00, 0x8000, 0x0000,
|
||||
0xFF00, 0x0002, 0x1234));
|
||||
});
|
||||
}
|
||||
|
||||
TEST_CASE("VECTOR_SHL_I32", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.VectorShl(LoadVR(b, 4), LoadVR(b, 5), INT32_TYPE));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[4] =
|
||||
vec128i(0x7FFFFFFE, 0x7FFFFFFE, 0x7FFFFFFE, 0x7FFFFFFF);
|
||||
ctx->v[5] = vec128i(0, 1, 16, 31);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result ==
|
||||
vec128i(0x7FFFFFFE, 0xFFFFFFFC, 0xFFFE0000, 0x80000000));
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[4] =
|
||||
vec128i(0x80000000, 0xFFFFFFFF, 0x00000001, 0x12345678);
|
||||
ctx->v[5] = vec128i(31, 16, 1, 32);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result ==
|
||||
vec128i(0x00000000, 0xFFFF0000, 0x00000002, 0x12345678));
|
||||
});
|
||||
}
|
||||
|
||||
TEST_CASE("VECTOR_SHL_I32_CONSTANT", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3,
|
||||
b.VectorShl(LoadVR(b, 4), b.LoadConstant(vec128i(0, 1, 16, 31)),
|
||||
INT32_TYPE));
|
||||
StoreVR(b, 4,
|
||||
b.VectorShl(LoadVR(b, 5), b.LoadConstant(vec128i(31, 16, 1, 32)),
|
||||
INT32_TYPE));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[4] =
|
||||
vec128i(0x7FFFFFFE, 0x7FFFFFFE, 0x7FFFFFFE, 0x7FFFFFFF);
|
||||
ctx->v[5] =
|
||||
vec128i(0x80000000, 0xFFFFFFFF, 0x00000001, 0x12345678);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result1 = ctx->v[3];
|
||||
REQUIRE(result1 ==
|
||||
vec128i(0x7FFFFFFE, 0xFFFFFFFC, 0xFFFE0000, 0x80000000));
|
||||
auto result2 = ctx->v[4];
|
||||
REQUIRE(result2 ==
|
||||
vec128i(0x00000000, 0xFFFF0000, 0x00000002, 0x12345678));
|
||||
});
|
||||
}
|
||||
145
tools/alloy-test/test_vector_shr.cc
Normal file
145
tools/alloy-test/test_vector_shr.cc
Normal file
@@ -0,0 +1,145 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* Xenia : Xbox 360 Emulator Research Project *
|
||||
******************************************************************************
|
||||
* Copyright 2014 Ben Vanik. All rights reserved. *
|
||||
* Released under the BSD license - see LICENSE in the root for more details. *
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include <tools/alloy-test/util.h>
|
||||
|
||||
using namespace alloy;
|
||||
using namespace alloy::hir;
|
||||
using namespace alloy::runtime;
|
||||
using namespace alloy::test;
|
||||
using alloy::frontend::ppc::PPCContext;
|
||||
|
||||
TEST_CASE("VECTOR_SHR_I8", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.VectorShr(LoadVR(b, 4), LoadVR(b, 5), INT8_TYPE));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[4] =
|
||||
vec128b(0x7E, 0x7E, 0x7E, 0x7F, 0x80, 0xFF, 0x01, 0x12, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
|
||||
ctx->v[5] =
|
||||
vec128b(0, 1, 2, 8, 4, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128b(0x7E, 0x3F, 0x1F, 0x7F, 0x08, 0x0F, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00));
|
||||
});
|
||||
}
|
||||
|
||||
TEST_CASE("VECTOR_SHR_I8_CONSTANT", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.VectorShr(LoadVR(b, 4), b.LoadConstant(vec128b(
|
||||
0, 1, 2, 8, 4, 4, 6, 7, 8, 9,
|
||||
10, 11, 12, 13, 14, 15)),
|
||||
INT8_TYPE));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[4] =
|
||||
vec128b(0x7E, 0x7E, 0x7E, 0x7F, 0x80, 0xFF, 0x01, 0x12, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128b(0x7E, 0x3F, 0x1F, 0x7F, 0x08, 0x0F, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00));
|
||||
});
|
||||
}
|
||||
|
||||
TEST_CASE("VECTOR_SHR_I16", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.VectorShr(LoadVR(b, 4), LoadVR(b, 5), INT16_TYPE));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[4] = vec128s(0x7FFE, 0x7FFE, 0x7FFE, 0x7FFF, 0x8000, 0xFFFF,
|
||||
0x0001, 0x1234);
|
||||
ctx->v[5] = vec128s(0, 1, 8, 15, 15, 8, 1, 16);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128s(0x7FFE, 0x3FFF, 0x007F, 0x0000, 0x0001,
|
||||
0x00FF, 0x0000, 0x1234));
|
||||
});
|
||||
}
|
||||
|
||||
TEST_CASE("VECTOR_SHR_I16_CONSTANT", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.VectorShr(LoadVR(b, 4), b.LoadConstant(vec128s(
|
||||
0, 1, 8, 15, 15, 8, 1, 16)),
|
||||
INT16_TYPE));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[4] = vec128s(0x7FFE, 0x7FFE, 0x7FFE, 0x7FFF, 0x8000, 0xFFFF,
|
||||
0x0001, 0x1234);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result == vec128s(0x7FFE, 0x3FFF, 0x007F, 0x0000, 0x0001,
|
||||
0x00FF, 0x0000, 0x1234));
|
||||
});
|
||||
}
|
||||
|
||||
TEST_CASE("VECTOR_SHR_I32", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3, b.VectorShr(LoadVR(b, 4), LoadVR(b, 5), INT32_TYPE));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[4] =
|
||||
vec128i(0x7FFFFFFE, 0x7FFFFFFE, 0x7FFFFFFE, 0x7FFFFFFF);
|
||||
ctx->v[5] = vec128i(0, 1, 16, 31);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result ==
|
||||
vec128i(0x7FFFFFFE, 0x3FFFFFFF, 0x00007FFF, 0x00000000));
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[4] =
|
||||
vec128i(0x80000000, 0xFFFFFFFF, 0x00000001, 0x12345678);
|
||||
ctx->v[5] = vec128i(31, 16, 1, 32);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result = ctx->v[3];
|
||||
REQUIRE(result ==
|
||||
vec128i(0x00000001, 0x0000FFFF, 0x00000000, 0x12345678));
|
||||
});
|
||||
}
|
||||
|
||||
TEST_CASE("VECTOR_SHR_I32_CONSTANT", "[instr]") {
|
||||
TestFunction test([](hir::HIRBuilder& b) {
|
||||
StoreVR(b, 3,
|
||||
b.VectorShr(LoadVR(b, 4), b.LoadConstant(vec128i(0, 1, 16, 31)),
|
||||
INT32_TYPE));
|
||||
StoreVR(b, 4,
|
||||
b.VectorShr(LoadVR(b, 5), b.LoadConstant(vec128i(31, 16, 1, 32)),
|
||||
INT32_TYPE));
|
||||
b.Return();
|
||||
});
|
||||
test.Run([](PPCContext* ctx) {
|
||||
ctx->v[4] =
|
||||
vec128i(0x7FFFFFFE, 0x7FFFFFFE, 0x7FFFFFFE, 0x7FFFFFFF);
|
||||
ctx->v[5] =
|
||||
vec128i(0x80000000, 0xFFFFFFFF, 0x00000001, 0x12345678);
|
||||
},
|
||||
[](PPCContext* ctx) {
|
||||
auto result1 = ctx->v[3];
|
||||
REQUIRE(result1 ==
|
||||
vec128i(0x7FFFFFFE, 0x3FFFFFFF, 0x00007FFF, 0x00000000));
|
||||
auto result2 = ctx->v[4];
|
||||
REQUIRE(result2 ==
|
||||
vec128i(0x00000001, 0x0000FFFF, 0x00000000, 0x12345678));
|
||||
});
|
||||
}
|
||||
@@ -23,7 +23,7 @@
|
||||
#include <third_party/catch/single_include/catch.hpp>
|
||||
|
||||
#define ALLOY_TEST_IVM 1
|
||||
//#define ALLOY_TEST_X64 1
|
||||
#define ALLOY_TEST_X64 1
|
||||
|
||||
namespace alloy {
|
||||
namespace test {
|
||||
|
||||
Reference in New Issue
Block a user