add vroundps, impl Op::floor on x86
Change-Id: Iad94adda2da74fefb5657d883120f85ad362327e Reviewed-on: https://skia-review.googlesource.com/c/skia/+/263461 Reviewed-by: Mike Reed <reed@google.com> Commit-Queue: Mike Klein <mtklein@google.com>
This commit is contained in:
parent
064c7f9f1c
commit
f22faaf254
@ -1145,6 +1145,11 @@ namespace skvm {
|
|||||||
this->byte(imm);
|
this->byte(imm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Assembler::vroundps(Ymm dst, Ymm x, int imm) {
|
||||||
|
this->op(0x66,0x3a0f,0x08, dst,x);
|
||||||
|
this->byte(imm);
|
||||||
|
}
|
||||||
|
|
||||||
void Assembler::vmovdqa(Ymm dst, Ymm src) { this->op(0x66,0x0f,0x6f, dst,src); }
|
void Assembler::vmovdqa(Ymm dst, Ymm src) { this->op(0x66,0x0f,0x6f, dst,src); }
|
||||||
|
|
||||||
void Assembler::vcvtdq2ps (Ymm dst, Ymm x) { this->op(0, 0x0f,0x5b, dst,x); }
|
void Assembler::vcvtdq2ps (Ymm dst, Ymm x) { this->op(0, 0x0f,0x5b, dst,x); }
|
||||||
@ -2354,6 +2359,7 @@ namespace skvm {
|
|||||||
a->vpor (dst(), tmp(), r[x]);
|
a->vpor (dst(), tmp(), r[x]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case Op::floor : a->vroundps (dst(), r[x], Assembler::FLOOR); break;
|
||||||
case Op::to_f32: a->vcvtdq2ps (dst(), r[x]); break;
|
case Op::to_f32: a->vcvtdq2ps (dst(), r[x]); break;
|
||||||
case Op::trunc : a->vcvttps2dq(dst(), r[x]); break;
|
case Op::trunc : a->vcvttps2dq(dst(), r[x]); break;
|
||||||
case Op::round : a->vcvtps2dq (dst(), r[x]); break;
|
case Op::round : a->vcvtps2dq (dst(), r[x]); break;
|
||||||
|
@ -105,7 +105,10 @@ namespace skvm {
|
|||||||
using DstEqXOpImm = void(Ymm dst, Ymm x, int imm);
|
using DstEqXOpImm = void(Ymm dst, Ymm x, int imm);
|
||||||
DstEqXOpImm vpslld, vpsrld, vpsrad,
|
DstEqXOpImm vpslld, vpsrld, vpsrad,
|
||||||
vpsrlw,
|
vpsrlw,
|
||||||
vpermq;
|
vpermq,
|
||||||
|
vroundps;
|
||||||
|
|
||||||
|
enum { NEAREST, FLOOR, CEIL, TRUNC }; // vroundps immediates
|
||||||
|
|
||||||
using DstEqOpX = void(Ymm dst, Ymm x);
|
using DstEqOpX = void(Ymm dst, Ymm x);
|
||||||
DstEqOpX vmovdqa, vcvtdq2ps, vcvttps2dq, vcvtps2dq;
|
DstEqOpX vmovdqa, vcvtdq2ps, vcvttps2dq, vcvtps2dq;
|
||||||
|
@ -603,6 +603,28 @@ DEF_TEST(SkVM_madder, r) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEF_TEST(SkVM_floor, r) {
|
||||||
|
skvm::Builder b;
|
||||||
|
{
|
||||||
|
skvm::Arg arg = b.varying<float>();
|
||||||
|
b.store32(arg, b.bit_cast(b.floor(b.bit_cast(b.load32(arg)))));
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(SK_CPU_X86)
|
||||||
|
test_jit_and_interpreter
|
||||||
|
#else
|
||||||
|
test_interpreter_only
|
||||||
|
#endif
|
||||||
|
(r, b.done(), [&](const skvm::Program& program) {
|
||||||
|
float buf[] = { -2.0f, -1.5f, -1.0f, 0.0f, 1.0f, 1.5f, 2.0f };
|
||||||
|
float want[] = { -2.0f, -2.0f, -1.0f, 0.0f, 1.0f, 1.0f, 2.0f };
|
||||||
|
program.eval(SK_ARRAY_COUNT(buf), buf);
|
||||||
|
for (int i = 0; i < (int)SK_ARRAY_COUNT(buf); i++) {
|
||||||
|
REPORTER_ASSERT(r, buf[i] == want[i]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
DEF_TEST(SkVM_hoist, r) {
|
DEF_TEST(SkVM_hoist, r) {
|
||||||
// This program uses enough constants that it will fail to JIT if we hoist them.
|
// This program uses enough constants that it will fail to JIT if we hoist them.
|
||||||
// The JIT will try again without hoisting, and that'll just need 2 registers.
|
// The JIT will try again without hoisting, and that'll just need 2 registers.
|
||||||
@ -877,6 +899,18 @@ DEF_TEST(SkVM_Assembler, r) {
|
|||||||
0xc4,0xe3,0xfd, 0x00,0xca, 0x05,
|
0xc4,0xe3,0xfd, 0x00,0xca, 0x05,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test_asm(r, [&](A& a) {
|
||||||
|
a.vroundps(A::ymm1, A::ymm2, A::NEAREST);
|
||||||
|
a.vroundps(A::ymm1, A::ymm2, A::FLOOR);
|
||||||
|
a.vroundps(A::ymm1, A::ymm2, A::CEIL);
|
||||||
|
a.vroundps(A::ymm1, A::ymm2, A::TRUNC);
|
||||||
|
},{
|
||||||
|
0xc4,0xe3,0x7d,0x08,0xca,0x00,
|
||||||
|
0xc4,0xe3,0x7d,0x08,0xca,0x01,
|
||||||
|
0xc4,0xe3,0x7d,0x08,0xca,0x02,
|
||||||
|
0xc4,0xe3,0x7d,0x08,0xca,0x03,
|
||||||
|
});
|
||||||
|
|
||||||
test_asm(r, [&](A& a) {
|
test_asm(r, [&](A& a) {
|
||||||
A::Label l = a.here();
|
A::Label l = a.here();
|
||||||
a.byte(1);
|
a.byte(1);
|
||||||
|
Loading…
Reference in New Issue
Block a user