diff options
Diffstat (limited to 'compiler/utils/x86/assembler_x86.cc')
-rw-r--r-- | compiler/utils/x86/assembler_x86.cc | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/compiler/utils/x86/assembler_x86.cc b/compiler/utils/x86/assembler_x86.cc index b6708de81c..4b64e92136 100644 --- a/compiler/utils/x86/assembler_x86.cc +++ b/compiler/utils/x86/assembler_x86.cc @@ -783,6 +783,43 @@ void X86Assembler::vdivps(XmmRegister dst, XmmRegister src1, XmmRegister src2) { EmitXmmRegisterOperand(dst, src2); } +void X86Assembler::vfmadd213ss(XmmRegister acc, XmmRegister left, XmmRegister right) { + DCHECK(CpuHasAVXorAVX2FeatureFlag()); + AssemblerBuffer::EnsureCapacity ensured(&buffer_); + uint8_t ByteZero = 0x00, ByteOne = 0x00, ByteTwo = 0x00; + ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ false); + X86ManagedRegister vvvv_reg = X86ManagedRegister::FromXmmRegister(left); + ByteOne = EmitVexPrefixByteOne(/*R=*/ false, + /*X=*/ false, + /*B=*/ false, + SET_VEX_M_0F_38); + ByteTwo = EmitVexPrefixByteTwo(/*W=*/ false, vvvv_reg, SET_VEX_L_128, SET_VEX_PP_66); + + EmitUint8(ByteZero); + EmitUint8(ByteOne); + EmitUint8(ByteTwo); + EmitUint8(0xA9); + EmitXmmRegisterOperand(acc, right); +} + +void X86Assembler::vfmadd213sd(XmmRegister acc, XmmRegister left, XmmRegister right) { + DCHECK(CpuHasAVXorAVX2FeatureFlag()); + AssemblerBuffer::EnsureCapacity ensured(&buffer_); + uint8_t ByteZero = 0x00, ByteOne = 0x00, ByteTwo = 0x00; + ByteZero = EmitVexPrefixByteZero(/*is_twobyte_form=*/ false); + X86ManagedRegister vvvv_reg = X86ManagedRegister::FromXmmRegister(left); + ByteOne = EmitVexPrefixByteOne(/*R=*/ false, + /*X=*/ false, + /*B=*/ false, + SET_VEX_M_0F_38); + ByteTwo = EmitVexPrefixByteTwo(/*W=*/ true, vvvv_reg, SET_VEX_L_128, SET_VEX_PP_66); + + EmitUint8(ByteZero); + EmitUint8(ByteOne); + EmitUint8(ByteTwo); + EmitUint8(0xA9); + EmitXmmRegisterOperand(acc, right); +} void X86Assembler::movapd(XmmRegister dst, XmmRegister src) { if (CpuHasAVXorAVX2FeatureFlag()) { |