diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-10-12 14:27:29 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-10-13 09:35:20 +0000 |
commit | c30a6232df03e1efbd9f3b226777b07e087a1122 (patch) | |
tree | e992f45784689f373bcc38d1b79a239ebe17ee23 /chromium/v8/src/codegen/x64 | |
parent | 7b5b123ac58f58ffde0f4f6e488bcd09aa4decd3 (diff) | |
download | qtwebengine-chromium-85-based.tar.gz |
BASELINE: Update Chromium to 85.0.4183.14085-based
Change-Id: Iaa42f4680837c57725b1344f108c0196741f6057
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/v8/src/codegen/x64')
-rw-r--r-- | chromium/v8/src/codegen/x64/assembler-x64.cc | 217 | ||||
-rw-r--r-- | chromium/v8/src/codegen/x64/assembler-x64.h | 110 | ||||
-rw-r--r-- | chromium/v8/src/codegen/x64/interface-descriptors-x64.cc | 49 | ||||
-rw-r--r-- | chromium/v8/src/codegen/x64/macro-assembler-x64.cc | 4 | ||||
-rw-r--r-- | chromium/v8/src/codegen/x64/macro-assembler-x64.h | 9 | ||||
-rw-r--r-- | chromium/v8/src/codegen/x64/sse-instr.h | 1 |
6 files changed, 206 insertions, 184 deletions
diff --git a/chromium/v8/src/codegen/x64/assembler-x64.cc b/chromium/v8/src/codegen/x64/assembler-x64.cc index 287de802be4..c1e2ec9808d 100644 --- a/chromium/v8/src/codegen/x64/assembler-x64.cc +++ b/chromium/v8/src/codegen/x64/assembler-x64.cc @@ -132,168 +132,53 @@ uint32_t RelocInfo::wasm_call_tag() const { // ----------------------------------------------------------------------------- // Implementation of Operand -namespace { -class OperandBuilder { - public: - OperandBuilder(Register base, int32_t disp) { - if (base == rsp || base == r12) { - // SIB byte is needed to encode (rsp + offset) or (r12 + offset). - set_sib(times_1, rsp, base); - } - - if (disp == 0 && base != rbp && base != r13) { - set_modrm(0, base); - } else if (is_int8(disp)) { - set_modrm(1, base); - set_disp8(disp); - } else { - set_modrm(2, base); - set_disp32(disp); - } - } - - OperandBuilder(Register base, Register index, ScaleFactor scale, - int32_t disp) { - DCHECK(index != rsp); - set_sib(scale, index, base); - if (disp == 0 && base != rbp && base != r13) { - // This call to set_modrm doesn't overwrite the REX.B (or REX.X) bits - // possibly set by set_sib. - set_modrm(0, rsp); - } else if (is_int8(disp)) { - set_modrm(1, rsp); - set_disp8(disp); - } else { - set_modrm(2, rsp); - set_disp32(disp); - } - } - - OperandBuilder(Register index, ScaleFactor scale, int32_t disp) { - DCHECK(index != rsp); - set_modrm(0, rsp); - set_sib(scale, index, rbp); - set_disp32(disp); - } - - OperandBuilder(Label* label, int addend) { - data_.addend = addend; - DCHECK_NOT_NULL(label); - DCHECK(addend == 0 || (is_int8(addend) && label->is_bound())); - set_modrm(0, rbp); - set_disp64(reinterpret_cast<intptr_t>(label)); +Operand::Operand(Operand operand, int32_t offset) { + DCHECK_GE(operand.data().len, 1); + // Operand encodes REX ModR/M [SIB] [Disp]. + byte modrm = operand.data().buf[0]; + DCHECK_LT(modrm, 0xC0); // Disallow mode 3 (register target). + bool has_sib = ((modrm & 0x07) == 0x04); + byte mode = modrm & 0xC0; + int disp_offset = has_sib ? 2 : 1; + int base_reg = (has_sib ? operand.data().buf[1] : modrm) & 0x07; + // Mode 0 with rbp/r13 as ModR/M or SIB base register always has a 32-bit + // displacement. + bool is_baseless = (mode == 0) && (base_reg == 0x05); // No base or RIP base. + int32_t disp_value = 0; + if (mode == 0x80 || is_baseless) { + // Mode 2 or mode 0 with rbp/r13 as base: Word displacement. + disp_value = ReadUnalignedValue<int32_t>( + reinterpret_cast<Address>(&operand.data().buf[disp_offset])); + } else if (mode == 0x40) { + // Mode 1: Byte displacement. + disp_value = static_cast<signed char>(operand.data().buf[disp_offset]); } - OperandBuilder(Operand operand, int32_t offset) { - DCHECK_GE(operand.data().len, 1); - // Operand encodes REX ModR/M [SIB] [Disp]. - byte modrm = operand.data().buf[0]; - DCHECK_LT(modrm, 0xC0); // Disallow mode 3 (register target). - bool has_sib = ((modrm & 0x07) == 0x04); - byte mode = modrm & 0xC0; - int disp_offset = has_sib ? 2 : 1; - int base_reg = (has_sib ? operand.data().buf[1] : modrm) & 0x07; - // Mode 0 with rbp/r13 as ModR/M or SIB base register always has a 32-bit - // displacement. - bool is_baseless = - (mode == 0) && (base_reg == 0x05); // No base or RIP base. - int32_t disp_value = 0; - if (mode == 0x80 || is_baseless) { - // Mode 2 or mode 0 with rbp/r13 as base: Word displacement. - disp_value = ReadUnalignedValue<int32_t>( - reinterpret_cast<Address>(&operand.data().buf[disp_offset])); - } else if (mode == 0x40) { - // Mode 1: Byte displacement. - disp_value = static_cast<signed char>(operand.data().buf[disp_offset]); - } - - // Write new operand with same registers, but with modified displacement. - DCHECK(offset >= 0 ? disp_value + offset > disp_value - : disp_value + offset < disp_value); // No overflow. - disp_value += offset; - data_.rex = operand.data().rex; - if (!is_int8(disp_value) || is_baseless) { - // Need 32 bits of displacement, mode 2 or mode 1 with register rbp/r13. - data_.buf[0] = (modrm & 0x3F) | (is_baseless ? 0x00 : 0x80); - data_.len = disp_offset + 4; - WriteUnalignedValue(reinterpret_cast<Address>(&data_.buf[disp_offset]), - disp_value); - } else if (disp_value != 0 || (base_reg == 0x05)) { - // Need 8 bits of displacement. - data_.buf[0] = (modrm & 0x3F) | 0x40; // Mode 1. - data_.len = disp_offset + 1; - data_.buf[disp_offset] = static_cast<byte>(disp_value); - } else { - // Need no displacement. - data_.buf[0] = (modrm & 0x3F); // Mode 0. - data_.len = disp_offset; - } - if (has_sib) { - data_.buf[1] = operand.data().buf[1]; - } - } - - void set_modrm(int mod, Register rm_reg) { - DCHECK(is_uint2(mod)); - data_.buf[0] = mod << 6 | rm_reg.low_bits(); - // Set REX.B to the high bit of rm.code(). - data_.rex |= rm_reg.high_bit(); - } - - void set_sib(ScaleFactor scale, Register index, Register base) { - DCHECK_EQ(data_.len, 1); - DCHECK(is_uint2(scale)); - // Use SIB with no index register only for base rsp or r12. Otherwise we - // would skip the SIB byte entirely. - DCHECK(index != rsp || base == rsp || base == r12); - data_.buf[1] = (scale << 6) | (index.low_bits() << 3) | base.low_bits(); - data_.rex |= index.high_bit() << 1 | base.high_bit(); - data_.len = 2; - } - - void set_disp8(int disp) { - DCHECK(is_int8(disp)); - DCHECK(data_.len == 1 || data_.len == 2); - int8_t* p = reinterpret_cast<int8_t*>(&data_.buf[data_.len]); - *p = disp; - data_.len += sizeof(int8_t); - } - - void set_disp32(int disp) { - DCHECK(data_.len == 1 || data_.len == 2); - Address p = reinterpret_cast<Address>(&data_.buf[data_.len]); - WriteUnalignedValue(p, disp); - data_.len += sizeof(int32_t); + // Write new operand with same registers, but with modified displacement. + DCHECK(offset >= 0 ? disp_value + offset > disp_value + : disp_value + offset < disp_value); // No overflow. + disp_value += offset; + data_.rex = operand.data().rex; + if (!is_int8(disp_value) || is_baseless) { + // Need 32 bits of displacement, mode 2 or mode 1 with register rbp/r13. + data_.buf[0] = (modrm & 0x3F) | (is_baseless ? 0x00 : 0x80); + data_.len = disp_offset + 4; + WriteUnalignedValue(reinterpret_cast<Address>(&data_.buf[disp_offset]), + disp_value); + } else if (disp_value != 0 || (base_reg == 0x05)) { + // Need 8 bits of displacement. + data_.buf[0] = (modrm & 0x3F) | 0x40; // Mode 1. + data_.len = disp_offset + 1; + data_.buf[disp_offset] = static_cast<byte>(disp_value); + } else { + // Need no displacement. + data_.buf[0] = (modrm & 0x3F); // Mode 0. + data_.len = disp_offset; } - - void set_disp64(int64_t disp) { - DCHECK_EQ(1, data_.len); - Address p = reinterpret_cast<Address>(&data_.buf[data_.len]); - WriteUnalignedValue(p, disp); - data_.len += sizeof(disp); + if (has_sib) { + data_.buf[1] = operand.data().buf[1]; } - - const Operand::Data& data() const { return data_; } - - private: - Operand::Data data_; -}; -} // namespace - -Operand::Operand(Register base, int32_t disp) - : data_(OperandBuilder(base, disp).data()) {} - -Operand::Operand(Register base, Register index, ScaleFactor scale, int32_t disp) - : data_(OperandBuilder(base, index, scale, disp).data()) {} - -Operand::Operand(Register index, ScaleFactor scale, int32_t disp) - : data_(OperandBuilder(index, scale, disp).data()) {} - -Operand::Operand(Label* label, int addend) - : data_(OperandBuilder(label, addend).data()) {} - -Operand::Operand(Operand operand, int32_t offset) - : data_(OperandBuilder(operand, offset).data()) {} +} bool Operand::AddressUsesRegister(Register reg) const { int code = reg.code(); @@ -3424,6 +3309,20 @@ void Assembler::roundsd(XMMRegister dst, XMMRegister src, RoundingMode mode) { emit(static_cast<byte>(mode) | 0x8); } +void Assembler::roundps(XMMRegister dst, XMMRegister src, RoundingMode mode) { + DCHECK(!IsEnabled(AVX)); + sse4_instr(dst, src, 0x66, 0x0F, 0x3A, 0x08); + // Mask precision exception. + emit(static_cast<byte>(mode) | 0x8); +} + +void Assembler::roundpd(XMMRegister dst, XMMRegister src, RoundingMode mode) { + DCHECK(!IsEnabled(AVX)); + sse4_instr(dst, src, 0x66, 0x0F, 0x3A, 0x09); + // Mask precision exception. + emit(static_cast<byte>(mode) | 0x8); +} + void Assembler::movmskpd(Register dst, XMMRegister src) { EnsureSpace ensure_space(this); emit(0x66); @@ -3443,8 +3342,8 @@ void Assembler::movmskps(Register dst, XMMRegister src) { void Assembler::pmovmskb(Register dst, XMMRegister src) { EnsureSpace ensure_space(this); - emit_optional_rex_32(dst, src); emit(0x66); + emit_optional_rex_32(dst, src); emit(0x0F); emit(0xD7); emit_sse_operand(dst, src); diff --git a/chromium/v8/src/codegen/x64/assembler-x64.h b/chromium/v8/src/codegen/x64/assembler-x64.h index 24eb9765782..bf876945265 100644 --- a/chromium/v8/src/codegen/x64/assembler-x64.h +++ b/chromium/v8/src/codegen/x64/assembler-x64.h @@ -173,13 +173,48 @@ class V8_EXPORT_PRIVATE Operand { }; // [base + disp/r] - Operand(Register base, int32_t disp); + V8_INLINE Operand(Register base, int32_t disp) { + if (base == rsp || base == r12) { + // SIB byte is needed to encode (rsp + offset) or (r12 + offset). + set_sib(times_1, rsp, base); + } + + if (disp == 0 && base != rbp && base != r13) { + set_modrm(0, base); + } else if (is_int8(disp)) { + set_modrm(1, base); + set_disp8(disp); + } else { + set_modrm(2, base); + set_disp32(disp); + } + } // [base + index*scale + disp/r] - Operand(Register base, Register index, ScaleFactor scale, int32_t disp); + V8_INLINE Operand(Register base, Register index, ScaleFactor scale, + int32_t disp) { + DCHECK(index != rsp); + set_sib(scale, index, base); + if (disp == 0 && base != rbp && base != r13) { + // This call to set_modrm doesn't overwrite the REX.B (or REX.X) bits + // possibly set by set_sib. + set_modrm(0, rsp); + } else if (is_int8(disp)) { + set_modrm(1, rsp); + set_disp8(disp); + } else { + set_modrm(2, rsp); + set_disp32(disp); + } + } // [index*scale + disp/r] - Operand(Register index, ScaleFactor scale, int32_t disp); + V8_INLINE Operand(Register index, ScaleFactor scale, int32_t disp) { + DCHECK(index != rsp); + set_modrm(0, rsp); + set_sib(scale, index, rbp); + set_disp32(disp); + } // Offset from existing memory operand. // Offset is added to existing displacement as 32-bit signed values and @@ -187,25 +222,64 @@ class V8_EXPORT_PRIVATE Operand { Operand(Operand base, int32_t offset); // [rip + disp/r] - explicit Operand(Label* label, int addend = 0); + V8_INLINE explicit Operand(Label* label, int addend = 0) { + data_.addend = addend; + DCHECK_NOT_NULL(label); + DCHECK(addend == 0 || (is_int8(addend) && label->is_bound())); + set_modrm(0, rbp); + set_disp64(reinterpret_cast<intptr_t>(label)); + } Operand(const Operand&) V8_NOEXCEPT = default; + const Data& data() const { return data_; } + // Checks whether either base or index register is the given register. // Does not check the "reg" part of the Operand. bool AddressUsesRegister(Register reg) const; - // Queries related to the size of the generated instruction. - // Whether the generated instruction will have a REX prefix. - bool requires_rex() const { return data_.rex != 0; } - // Size of the ModR/M, SIB and displacement parts of the generated - // instruction. - int operand_size() const { return data_.len; } + private: + V8_INLINE void set_modrm(int mod, Register rm_reg) { + DCHECK(is_uint2(mod)); + data_.buf[0] = mod << 6 | rm_reg.low_bits(); + // Set REX.B to the high bit of rm.code(). + data_.rex |= rm_reg.high_bit(); + } - const Data& data() const { return data_; } + V8_INLINE void set_sib(ScaleFactor scale, Register index, Register base) { + DCHECK_EQ(data_.len, 1); + DCHECK(is_uint2(scale)); + // Use SIB with no index register only for base rsp or r12. Otherwise we + // would skip the SIB byte entirely. + DCHECK(index != rsp || base == rsp || base == r12); + data_.buf[1] = (scale << 6) | (index.low_bits() << 3) | base.low_bits(); + data_.rex |= index.high_bit() << 1 | base.high_bit(); + data_.len = 2; + } - private: - const Data data_; + V8_INLINE void set_disp8(int disp) { + DCHECK(is_int8(disp)); + DCHECK(data_.len == 1 || data_.len == 2); + int8_t* p = reinterpret_cast<int8_t*>(&data_.buf[data_.len]); + *p = disp; + data_.len += sizeof(int8_t); + } + + V8_INLINE void set_disp32(int disp) { + DCHECK(data_.len == 1 || data_.len == 2); + Address p = reinterpret_cast<Address>(&data_.buf[data_.len]); + WriteUnalignedValue(p, disp); + data_.len += sizeof(int32_t); + } + + V8_INLINE void set_disp64(int64_t disp) { + DCHECK_EQ(1, data_.len); + Address p = reinterpret_cast<Address>(&data_.buf[data_.len]); + WriteUnalignedValue(p, disp); + data_.len += sizeof(disp); + } + + Data data_; }; ASSERT_TRIVIALLY_COPYABLE(Operand); static_assert(sizeof(Operand) <= 2 * kSystemPointerSize, @@ -1141,6 +1215,8 @@ class V8_EXPORT_PRIVATE Assembler : public AssemblerBase { void roundss(XMMRegister dst, XMMRegister src, RoundingMode mode); void roundsd(XMMRegister dst, XMMRegister src, RoundingMode mode); + void roundps(XMMRegister dst, XMMRegister src, RoundingMode mode); + void roundpd(XMMRegister dst, XMMRegister src, RoundingMode mode); void cmpps(XMMRegister dst, XMMRegister src, int8_t cmp); void cmpps(XMMRegister dst, Operand src, int8_t cmp); @@ -1358,6 +1434,14 @@ 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 src, RoundingMode mode) { + vinstr(0x08, dst, xmm0, src, k66, k0F3A, kWIG); + emit(static_cast<byte>(mode) | 0x8); // Mask precision exception. + } + void vroundpd(XMMRegister dst, XMMRegister src, RoundingMode mode) { + vinstr(0x09, dst, xmm0, src, k66, k0F3A, kWIG); + emit(static_cast<byte>(mode) | 0x8); // Mask precision exception. + } void vsd(byte op, XMMRegister dst, XMMRegister src1, XMMRegister src2) { vinstr(op, dst, src1, src2, kF2, k0F, kWIG); diff --git a/chromium/v8/src/codegen/x64/interface-descriptors-x64.cc b/chromium/v8/src/codegen/x64/interface-descriptors-x64.cc index 6b9754efca1..31b2b67a4fb 100644 --- a/chromium/v8/src/codegen/x64/interface-descriptors-x64.cc +++ b/chromium/v8/src/codegen/x64/interface-descriptors-x64.cc @@ -129,6 +129,16 @@ void CallWithSpreadDescriptor::InitializePlatformSpecific( data->InitializePlatformSpecific(arraysize(registers), registers); } +void CallWithSpread_WithFeedbackDescriptor::InitializePlatformSpecific( + CallInterfaceDescriptorData* data) { + // rax : number of arguments (on the stack, not including receiver) + // rdi : the target to call + // rbx : the object to spread + // rdx : the feedback slot + Register registers[] = {rdi, rax, rbx, rdx}; + data->InitializePlatformSpecific(arraysize(registers), registers); +} + void CallWithArrayLikeDescriptor::InitializePlatformSpecific( CallInterfaceDescriptorData* data) { // rdi : the target to call @@ -137,6 +147,16 @@ void CallWithArrayLikeDescriptor::InitializePlatformSpecific( data->InitializePlatformSpecific(arraysize(registers), registers); } +void CallWithArrayLike_WithFeedbackDescriptor::InitializePlatformSpecific( + CallInterfaceDescriptorData* data) { + // rdi : the target to call + // rbx : the arguments list + // rdx : the feedback slot + // rax : the feedback vector + Register registers[] = {rdi, rbx, rdx, rax}; + data->InitializePlatformSpecific(arraysize(registers), registers); +} + void ConstructVarargsDescriptor::InitializePlatformSpecific( CallInterfaceDescriptorData* data) { // rax : number of arguments (on the stack, not including receiver) @@ -168,6 +188,16 @@ void ConstructWithSpreadDescriptor::InitializePlatformSpecific( data->InitializePlatformSpecific(arraysize(registers), registers); } +void ConstructWithSpread_WithFeedbackDescriptor::InitializePlatformSpecific( + CallInterfaceDescriptorData* data) { + // rax : number of arguments (on the stack, not including receiver) + // rdi : the target to call + // rdx : the new target + // rbx : the feedback slot + Register registers[] = {rdi, rdx, rax, rbx}; + data->InitializePlatformSpecific(arraysize(registers), registers); +} + void ConstructWithArrayLikeDescriptor::InitializePlatformSpecific( CallInterfaceDescriptorData* data) { // rdi : the target to call @@ -177,6 +207,16 @@ void ConstructWithArrayLikeDescriptor::InitializePlatformSpecific( data->InitializePlatformSpecific(arraysize(registers), registers); } +void ConstructWithArrayLike_WithFeedbackDescriptor::InitializePlatformSpecific( + CallInterfaceDescriptorData* data) { + // rdi : the target to call + // rdx : the new target + // rbx : the arguments list + // rax : the feedback slot + Register registers[] = {rdi, rdx, rbx, rax}; + data->InitializePlatformSpecific(arraysize(registers), registers); +} + void ConstructStubDescriptor::InitializePlatformSpecific( CallInterfaceDescriptorData* data) { // rax : number of arguments @@ -193,11 +233,6 @@ void AbortDescriptor::InitializePlatformSpecific( data->InitializePlatformSpecific(arraysize(registers), registers); } -void AllocateHeapNumberDescriptor::InitializePlatformSpecific( - CallInterfaceDescriptorData* data) { - data->InitializePlatformSpecific(0, nullptr); -} - void CompareDescriptor::InitializePlatformSpecific( CallInterfaceDescriptorData* data) { Register registers[] = {rdx, rax}; @@ -289,7 +324,7 @@ void BinaryOp_WithFeedbackDescriptor::InitializePlatformSpecific( CallInterfaceDescriptorData* data) { Register registers[] = {rdx, // kLeft rax, // kRight - rdi, // Slot + rdi, // kSlot rbx}; // kMaybeFeedbackVector data->InitializePlatformSpecific(arraysize(registers), registers); } @@ -307,7 +342,7 @@ void Compare_WithFeedbackDescriptor::InitializePlatformSpecific( CallInterfaceDescriptorData* data) { Register registers[] = {rdx, // kLeft rax, // kRight - rdi, // Slot + rdi, // kSlot rbx}; // kMaybeFeedbackVector data->InitializePlatformSpecific(arraysize(registers), registers); } diff --git a/chromium/v8/src/codegen/x64/macro-assembler-x64.cc b/chromium/v8/src/codegen/x64/macro-assembler-x64.cc index 7d6fdc5eb3d..fabf70bb036 100644 --- a/chromium/v8/src/codegen/x64/macro-assembler-x64.cc +++ b/chromium/v8/src/codegen/x64/macro-assembler-x64.cc @@ -2756,10 +2756,10 @@ void TurboAssembler::CheckPageFlag(Register object, Register scratch, int mask, andq(scratch, object); } if (mask < (1 << kBitsPerByte)) { - testb(Operand(scratch, MemoryChunk::kFlagsOffset), + testb(Operand(scratch, BasicMemoryChunk::kFlagsOffset), Immediate(static_cast<uint8_t>(mask))); } else { - testl(Operand(scratch, MemoryChunk::kFlagsOffset), Immediate(mask)); + testl(Operand(scratch, BasicMemoryChunk::kFlagsOffset), Immediate(mask)); } j(cc, condition_met, condition_met_distance); } diff --git a/chromium/v8/src/codegen/x64/macro-assembler-x64.h b/chromium/v8/src/codegen/x64/macro-assembler-x64.h index 8382bf5a287..8c4fd898064 100644 --- a/chromium/v8/src/codegen/x64/macro-assembler-x64.h +++ b/chromium/v8/src/codegen/x64/macro-assembler-x64.h @@ -174,8 +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(Sqrtss, sqrtss) AVX_OP(Sqrtsd, sqrtsd) AVX_OP(Sqrtps, sqrtps) @@ -204,6 +202,7 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase { AVX_OP(Psrlw, psrlw) AVX_OP(Psrld, psrld) AVX_OP(Psrlq, psrlq) + AVX_OP(Pmaddwd, pmaddwd) AVX_OP(Paddb, paddb) AVX_OP(Paddw, paddw) AVX_OP(Paddd, paddd) @@ -283,6 +282,10 @@ 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(Roundpd, roundpd) + AVX_OP_SSE4_1(Roundss, roundss) + AVX_OP_SSE4_1(Roundsd, roundsd) AVX_OP_SSE4_2(Pcmpgtq, pcmpgtq) #undef AVX_OP @@ -442,7 +445,7 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase { void Move(Register dst, Address ptr, RelocInfo::Mode rmode) { // This method must not be used with heap object references. The stored // address is not GC safe. Use the handle version instead. - DCHECK(rmode > RelocInfo::LAST_GCED_ENUM); + DCHECK(rmode == RelocInfo::NONE || rmode > RelocInfo::LAST_GCED_ENUM); movq(dst, Immediate64(ptr, rmode)); } diff --git a/chromium/v8/src/codegen/x64/sse-instr.h b/chromium/v8/src/codegen/x64/sse-instr.h index 74ec16d6a23..52107ed6b93 100644 --- a/chromium/v8/src/codegen/x64/sse-instr.h +++ b/chromium/v8/src/codegen/x64/sse-instr.h @@ -57,6 +57,7 @@ V(packssdw, 66, 0F, 6B) \ V(punpcklqdq, 66, 0F, 6C) \ V(punpckhqdq, 66, 0F, 6D) \ + V(pmaddwd, 66, 0F, F5) \ V(paddb, 66, 0F, FC) \ V(paddw, 66, 0F, FD) \ V(paddd, 66, 0F, FE) \ |