[JIT] Full vctuxs support
This commit is contained in:
@@ -554,7 +554,7 @@ int InstrEmit_vctsxs_(PPCHIRBuilder& f, uint32_t vd, uint32_t vb,
|
||||
float fuimm = static_cast<float>(std::exp2(uimm));
|
||||
Value* v =
|
||||
f.Mul(f.LoadVR(vb), f.Splat(f.LoadConstantFloat32(fuimm), VEC128_TYPE));
|
||||
v = f.VectorConvertF2I(v, ARITHMETIC_SATURATE);
|
||||
v = f.VectorConvertF2I(v);
|
||||
f.StoreSAT(f.DidSaturate(v));
|
||||
f.StoreVR(vd, v);
|
||||
return 0;
|
||||
@@ -572,7 +572,7 @@ int InstrEmit_vctuxs_(PPCHIRBuilder& f, uint32_t vd, uint32_t vb,
|
||||
float fuimm = static_cast<float>(std::exp2(uimm));
|
||||
Value* v =
|
||||
f.Mul(f.LoadVR(vb), f.Splat(f.LoadConstantFloat32(fuimm), VEC128_TYPE));
|
||||
v = f.VectorConvertF2I(v, ARITHMETIC_UNSIGNED | ARITHMETIC_SATURATE);
|
||||
v = f.VectorConvertF2I(v, ARITHMETIC_UNSIGNED);
|
||||
f.StoreSAT(f.DidSaturate(v));
|
||||
f.StoreVR(vd, v);
|
||||
return 0;
|
||||
|
||||
79
src/xenia/cpu/ppc/testing/instr_vctuxs.s
Normal file
79
src/xenia/cpu/ppc/testing/instr_vctuxs.s
Normal file
@@ -0,0 +1,79 @@
|
||||
# 0 * 2^31
|
||||
test_vctuxs_1:
|
||||
#_ REGISTER_IN v0 [00000000, 00000000, 00000000, 00000000]
|
||||
vctuxs v3, v0, 31
|
||||
blr
|
||||
#_ REGISTER_OUT v0 [00000000, 00000000, 00000000, 00000000]
|
||||
#_ REGISTER_OUT v3 [00000000, 00000000, 00000000, 00000000]
|
||||
|
||||
# -0 ^ 2^31
|
||||
test_vctuxs_2:
|
||||
#_ REGISTER_IN v0 [80000000, 80000000, 80000000, 80000000]
|
||||
vctuxs v3, v0, 31
|
||||
blr
|
||||
#_ REGISTER_OUT v0 [80000000, 80000000, 80000000, 80000000]
|
||||
#_ REGISTER_OUT v3 [00000000, 00000000, 00000000, 00000000]
|
||||
|
||||
# smallest positive subnormal * 2^31
|
||||
test_vctuxs_3:
|
||||
#_ REGISTER_IN v0 [00000001, 00000001, 00000001, 00000001]
|
||||
vctuxs v3, v0, 31
|
||||
blr
|
||||
#_ REGISTER_OUT v0 [00000001, 00000001, 00000001, 00000001]
|
||||
#_ REGISTER_OUT v3 [00000000, 00000000, 00000000, 00000000]
|
||||
|
||||
# largest subnormal * 2^31
|
||||
test_vctuxs_4:
|
||||
#_ REGISTER_IN v0 [007FFFFF, 007FFFFF, 007FFFFF, 007FFFFF]
|
||||
vctuxs v3, v0, 31
|
||||
blr
|
||||
#_ REGISTER_OUT v0 [007FFFFF, 007FFFFF, 007FFFFF, 007FFFFF]
|
||||
#_ REGISTER_OUT v3 [00000000, 00000000, 00000000, 00000000]
|
||||
|
||||
# +1 * 2^0
|
||||
test_vctuxs_5:
|
||||
#_ REGISTER_IN v0 [3F800000, 3F800000, 3F800000, 3F800000]
|
||||
vctuxs v3, v0, 0
|
||||
blr
|
||||
#_ REGISTER_OUT v0 [3F800000, 3F800000, 3F800000, 3F800000]
|
||||
#_ REGISTER_OUT v3 [00000001, 00000001, 00000001, 00000001]
|
||||
|
||||
# -1 * 2^0
|
||||
test_vctuxs_6:
|
||||
#_ REGISTER_IN v0 [BF800000, BF800000, BF800000, BF800000]
|
||||
vctuxs v3, v0, 0
|
||||
blr
|
||||
#_ REGISTER_OUT v0 [BF800000, BF800000, BF800000, BF800000]
|
||||
#_ REGISTER_OUT v3 [00000000, 00000000, 00000000, 00000000]
|
||||
|
||||
# 2^31 * 2^0
|
||||
test_vctuxs_7:
|
||||
#_ REGISTER_IN v0 [4F000000, 4F000000, 4F000000, 4F000000]
|
||||
vctuxs v3, v0, 0
|
||||
blr
|
||||
#_ REGISTER_OUT v0 [4F000000, 4F000000, 4F000000, 4F000000]
|
||||
#_ REGISTER_OUT v3 [80000000, 80000000, 80000000, 80000000]
|
||||
|
||||
# 2^32 * 2^0
|
||||
test_vctuxs_8:
|
||||
#_ REGISTER_IN v0 [4F800000, 4F800000, 4F800000, 4F800000]
|
||||
vctuxs v3, v0, 0
|
||||
blr
|
||||
#_ REGISTER_OUT v0 [4F800000, 4F800000, 4F800000, 4F800000]
|
||||
#_ REGISTER_OUT v3 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]
|
||||
|
||||
# +infinity * 2^0
|
||||
test_vctuxs_9:
|
||||
#_ REGISTER_IN v0 [7F800000, 7F800000, 7F800000, 7F800000]
|
||||
vctuxs v3, v0, 0
|
||||
blr
|
||||
#_ REGISTER_OUT v0 [7F800000, 7F800000, 7F800000, 7F800000]
|
||||
#_ REGISTER_OUT v3 [FFFFFFFF, FFFFFFFF, FFFFFFFF, FFFFFFFF]
|
||||
|
||||
# -infinity * 2^0
|
||||
test_vctuxs_10:
|
||||
#_ REGISTER_IN v0 [FF800000, FF800000, FF800000, FF800000]
|
||||
vctuxs v3, v0, 0
|
||||
blr
|
||||
#_ REGISTER_OUT v0 [FF800000, FF800000, FF800000, FF800000]
|
||||
#_ REGISTER_OUT v3 [00000000, 00000000, 00000000, 00000000]
|
||||
Reference in New Issue
Block a user