@@ -720,6 +720,104 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
720
720
}
721
721
}
722
722
723
+ "llvm.x86.sse42.pcmpestri128" => {
724
+ // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpestri&ig_expand=939
725
+ intrinsic_args ! ( fx, args => ( a, la, b, lb, _imm8) ; intrinsic) ;
726
+
727
+ let a = a. load_scalar ( fx) ;
728
+ let la = la. load_scalar ( fx) ;
729
+ let b = b. load_scalar ( fx) ;
730
+ let lb = lb. load_scalar ( fx) ;
731
+
732
+ let imm8 = if let Some ( imm8) = crate :: constant:: mir_operand_get_const_val ( fx, & args[ 4 ] )
733
+ {
734
+ imm8
735
+ } else {
736
+ fx. tcx . sess . span_fatal ( span, "Index argument for `_mm_cmpestri` is not a constant" ) ;
737
+ } ;
738
+
739
+ let imm8 = imm8. try_to_u8 ( ) . unwrap_or_else ( |_| panic ! ( "kind not scalar: {:?}" , imm8) ) ;
740
+
741
+ codegen_inline_asm_inner (
742
+ fx,
743
+ & [ InlineAsmTemplatePiece :: String ( format ! ( "pcmpestri xmm0, xmm1, {imm8}" ) ) ] ,
744
+ & [
745
+ CInlineAsmOperand :: In {
746
+ reg : InlineAsmRegOrRegClass :: Reg ( InlineAsmReg :: X86 ( X86InlineAsmReg :: xmm0) ) ,
747
+ value : a,
748
+ } ,
749
+ CInlineAsmOperand :: In {
750
+ reg : InlineAsmRegOrRegClass :: Reg ( InlineAsmReg :: X86 ( X86InlineAsmReg :: xmm1) ) ,
751
+ value : b,
752
+ } ,
753
+ // Implicit argument to the pcmpestri intrinsic
754
+ CInlineAsmOperand :: In {
755
+ reg : InlineAsmRegOrRegClass :: Reg ( InlineAsmReg :: X86 ( X86InlineAsmReg :: ax) ) ,
756
+ value : la,
757
+ } ,
758
+ // Implicit argument to the pcmpestri intrinsic
759
+ CInlineAsmOperand :: In {
760
+ reg : InlineAsmRegOrRegClass :: Reg ( InlineAsmReg :: X86 ( X86InlineAsmReg :: dx) ) ,
761
+ value : lb,
762
+ } ,
763
+ // Implicit result of the pcmpestri intrinsic
764
+ CInlineAsmOperand :: Out {
765
+ reg : InlineAsmRegOrRegClass :: Reg ( InlineAsmReg :: X86 ( X86InlineAsmReg :: cx) ) ,
766
+ late : true ,
767
+ place : Some ( ret) ,
768
+ } ,
769
+ ] ,
770
+ InlineAsmOptions :: NOSTACK | InlineAsmOptions :: PURE | InlineAsmOptions :: NOMEM ,
771
+ ) ;
772
+ }
773
+
774
+ "llvm.x86.sse42.pcmpestrm128" => {
775
+ // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_cmpestrm&ig_expand=940
776
+ intrinsic_args ! ( fx, args => ( a, la, b, lb, _imm8) ; intrinsic) ;
777
+
778
+ let a = a. load_scalar ( fx) ;
779
+ let la = la. load_scalar ( fx) ;
780
+ let b = b. load_scalar ( fx) ;
781
+ let lb = lb. load_scalar ( fx) ;
782
+
783
+ let imm8 = if let Some ( imm8) = crate :: constant:: mir_operand_get_const_val ( fx, & args[ 4 ] )
784
+ {
785
+ imm8
786
+ } else {
787
+ fx. tcx . sess . span_fatal ( span, "Index argument for `_mm_cmpestrm` is not a constant" ) ;
788
+ } ;
789
+
790
+ let imm8 = imm8. try_to_u8 ( ) . unwrap_or_else ( |_| panic ! ( "kind not scalar: {:?}" , imm8) ) ;
791
+
792
+ codegen_inline_asm_inner (
793
+ fx,
794
+ & [ InlineAsmTemplatePiece :: String ( format ! ( "pcmpestrm xmm0, xmm1, {imm8}" ) ) ] ,
795
+ & [
796
+ CInlineAsmOperand :: InOut {
797
+ reg : InlineAsmRegOrRegClass :: Reg ( InlineAsmReg :: X86 ( X86InlineAsmReg :: xmm0) ) ,
798
+ _late : true ,
799
+ in_value : a,
800
+ out_place : Some ( ret) ,
801
+ } ,
802
+ CInlineAsmOperand :: In {
803
+ reg : InlineAsmRegOrRegClass :: Reg ( InlineAsmReg :: X86 ( X86InlineAsmReg :: xmm1) ) ,
804
+ value : b,
805
+ } ,
806
+ // Implicit argument to the pcmpestri intrinsic
807
+ CInlineAsmOperand :: In {
808
+ reg : InlineAsmRegOrRegClass :: Reg ( InlineAsmReg :: X86 ( X86InlineAsmReg :: ax) ) ,
809
+ value : la,
810
+ } ,
811
+ // Implicit argument to the pcmpestri intrinsic
812
+ CInlineAsmOperand :: In {
813
+ reg : InlineAsmRegOrRegClass :: Reg ( InlineAsmReg :: X86 ( X86InlineAsmReg :: dx) ) ,
814
+ value : lb,
815
+ } ,
816
+ ] ,
817
+ InlineAsmOptions :: NOSTACK | InlineAsmOptions :: PURE | InlineAsmOptions :: NOMEM ,
818
+ ) ;
819
+ }
820
+
723
821
"llvm.x86.pclmulqdq" => {
724
822
// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_clmulepi64_si128&ig_expand=772
725
823
intrinsic_args ! ( fx, args => ( a, b, _imm8) ; intrinsic) ;
0 commit comments