[x64] Fix vroundps assembly, add disassembly
vroundps assembly is incorrect: - the signature was wrong, vroundps takes 2 operands and 1 immediate - when calling vinstr, should always pass xmm0, this wasn't causing issues because our test cases were restricted enough that it was always xmm0 anyway - the macro assembler should use AVX_OP_SSE4_1, since roundps requires SSE4_1 - drive-by fix for roundss and roundsd to be AVX_OP_SSE4_1 - add disasm for roundps and vroundps, and test them Bug: v8:10553 Change-Id: I4046eb81a9f18d5af7137bbd46bfa0478e5a9ab2 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2227252 Reviewed-by: Deepti Gandluri <gdeepti@chromium.org> Commit-Queue: Zhi An Ng <zhin@chromium.org> Cr-Commit-Position: refs/heads/master@{#68157}
This commit is contained in:
parent
d529da0128
commit
02ee6904f4
@ -1433,9 +1433,8 @@ class V8_EXPORT_PRIVATE Assembler : public AssemblerBase {
|
||||
vinstr(0x0b, dst, src1, src2, k66, k0F3A, kWIG);
|
||||
emit(static_cast<byte>(mode) | 0x8); // Mask precision exception.
|
||||
}
|
||||
void vroundps(XMMRegister dst, XMMRegister src1, XMMRegister src2,
|
||||
RoundingMode mode) {
|
||||
vinstr(0x08, dst, src1, src2, k66, k0F3A, kWIG);
|
||||
void vroundps(XMMRegister dst, XMMRegister src, RoundingMode mode) {
|
||||
vinstr(0x08, dst, xmm0, src, k66, k0F3A, kWIG);
|
||||
emit(static_cast<byte>(mode) | 0x8); // Mask precision exception.
|
||||
}
|
||||
|
||||
|
@ -174,9 +174,6 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
|
||||
AVX_OP(Cmpneqpd, cmpneqpd)
|
||||
AVX_OP(Cmpnltpd, cmpnltpd)
|
||||
AVX_OP(Cmpnlepd, cmpnlepd)
|
||||
AVX_OP(Roundss, roundss)
|
||||
AVX_OP(Roundsd, roundsd)
|
||||
AVX_OP(Roundps, roundps)
|
||||
AVX_OP(Sqrtss, sqrtss)
|
||||
AVX_OP(Sqrtsd, sqrtsd)
|
||||
AVX_OP(Sqrtps, sqrtps)
|
||||
@ -284,6 +281,9 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase {
|
||||
AVX_OP_SSE4_1(Pmovzxwd, pmovzxwd)
|
||||
AVX_OP_SSE4_1(Pmovzxdq, pmovzxdq)
|
||||
AVX_OP_SSE4_1(Pextrq, pextrq)
|
||||
AVX_OP_SSE4_1(Roundps, roundps)
|
||||
AVX_OP_SSE4_1(Roundss, roundss)
|
||||
AVX_OP_SSE4_1(Roundsd, roundsd)
|
||||
AVX_OP_SSE4_2(Pcmpgtq, pcmpgtq)
|
||||
|
||||
#undef AVX_OP
|
||||
|
@ -947,6 +947,11 @@ int DisassemblerX64::AVXInstruction(byte* data) {
|
||||
int mod, regop, rm, vvvv = vex_vreg();
|
||||
get_modrm(*current, &mod, ®op, &rm);
|
||||
switch (opcode) {
|
||||
case 0x08:
|
||||
AppendToBuffer("vroundps %s,", NameOfXMMRegister(regop));
|
||||
current += PrintRightXMMOperand(current);
|
||||
AppendToBuffer(",0x%x", *current++);
|
||||
break;
|
||||
case 0x0A:
|
||||
AppendToBuffer("vroundss %s,%s,", NameOfXMMRegister(regop),
|
||||
NameOfXMMRegister(vvvv));
|
||||
@ -1840,6 +1845,12 @@ int DisassemblerX64::TwoByteOpcodeInstruction(byte* data) {
|
||||
current += PrintRightOperand(current);
|
||||
AppendToBuffer(",%s,%d", NameOfXMMRegister(regop), (*current) & 3);
|
||||
current += 1;
|
||||
} else if (third_byte == 0x08) {
|
||||
get_modrm(*current, &mod, ®op, &rm);
|
||||
AppendToBuffer("roundps %s,", NameOfXMMRegister(regop));
|
||||
current += PrintRightXMMOperand(current);
|
||||
AppendToBuffer(",0x%x", (*current) & 3);
|
||||
current += 1;
|
||||
} else if (third_byte == 0x0A) {
|
||||
get_modrm(*current, &mod, ®op, &rm);
|
||||
AppendToBuffer("roundss %s,", NameOfXMMRegister(regop));
|
||||
|
@ -588,6 +588,7 @@ TEST(DisasmX64) {
|
||||
__ blendvpd(xmm5, xmm1);
|
||||
__ blendvpd(xmm5, Operand(rdx, 4));
|
||||
|
||||
__ roundps(xmm8, xmm3, kRoundUp);
|
||||
__ roundss(xmm8, xmm3, kRoundDown);
|
||||
__ roundsd(xmm8, xmm3, kRoundDown);
|
||||
|
||||
@ -648,6 +649,7 @@ TEST(DisasmX64) {
|
||||
__ vmovdqu(xmm9, Operand(rbx, rcx, times_4, 10000));
|
||||
__ vmovdqu(Operand(rbx, rcx, times_4, 10000), xmm0);
|
||||
|
||||
__ vroundps(xmm9, xmm2, kRoundUp);
|
||||
__ vroundss(xmm9, xmm1, xmm2, kRoundDown);
|
||||
__ vroundsd(xmm8, xmm3, xmm0, kRoundDown);
|
||||
__ vucomisd(xmm9, xmm1);
|
||||
|
Loading…
Reference in New Issue
Block a user