@@ -486,6 +486,10 @@ extern "C++" {
486
486
# define PHP_HAVE_SSE4_2
487
487
# endif
488
488
489
+ # if defined(HAVE_WMMINTRIN_H)
490
+ # define PHP_HAVE_PCLMUL
491
+ # endif
492
+
489
493
/*
490
494
* AVX2 support was added in gcc 4.7, but AVX2 intrinsics don't work in
491
495
* __attribute__((target("avx2"))) functions until gcc 4.9.
@@ -546,6 +550,56 @@ extern "C++" {
546
550
# define ZEND_INTRIN_SSE4_2_FUNC_DECL (func )
547
551
#endif
548
552
553
+ #ifdef __PCLMUL__
554
+ /* Instructions compiled directly. */
555
+ # define ZEND_INTRIN_PCLMUL_NATIVE 1
556
+ #elif (defined(HAVE_FUNC_ATTRIBUTE_TARGET) && defined(PHP_HAVE_PCLMUL)) || defined(ZEND_WIN32)
557
+ /* Function resolved by ifunc or MINIT. */
558
+ # define ZEND_INTRIN_PCLMUL_RESOLVER 1
559
+ #endif
560
+
561
+ /* Do not use for conditional declaration of API functions! */
562
+ #if defined(ZEND_INTRIN_PCLMUL_RESOLVER) && defined(ZEND_INTRIN_HAVE_IFUNC_TARGET)
563
+ # define ZEND_INTRIN_PCLMUL_FUNC_PROTO 1
564
+ #elif defined(ZEND_INTRIN_PCLMUL_RESOLVER)
565
+ # define ZEND_INTRIN_PCLMUL_FUNC_PTR 1
566
+ #endif
567
+
568
+ #ifdef ZEND_INTRIN_PCLMUL_RESOLVER
569
+ # ifdef HAVE_FUNC_ATTRIBUTE_TARGET
570
+ # define ZEND_INTRIN_PCLMUL_FUNC_DECL (func ) ZEND_API func __attribute__ ((target(" pclmul" )))
571
+ # else
572
+ # define ZEND_INTRIN_PCLMUL_FUNC_DECL (func ) func
573
+ # endif
574
+ #else
575
+ # define ZEND_INTRIN_PCLMUL_FUNC_DECL (func )
576
+ #endif
577
+
578
+ #if defined(ZEND_INTRIN_SSE4_2_NATIVE) && defined(ZEND_INTRIN_PCLMUL_NATIVE)
579
+ /* Instructions compiled directly. */
580
+ # define ZEND_INTRIN_SSE4_2_PCLMUL_NATIVE 1
581
+ #elif (defined(HAVE_FUNC_ATTRIBUTE_TARGET) && defined(PHP_HAVE_SSE4_2) && defined(PHP_HAVE_PCLMUL)) || defined(ZEND_WIN32)
582
+ /* Function resolved by ifunc or MINIT. */
583
+ # define ZEND_INTRIN_SSE4_2_PCLMUL_RESOLVER 1
584
+ #endif
585
+
586
+ /* Do not use for conditional declaration of API functions! */
587
+ #if defined(ZEND_INTRIN_SSE4_2_PCLMUL_RESOLVER) && defined(ZEND_INTRIN_HAVE_IFUNC_TARGET)
588
+ # define ZEND_INTRIN_SSE4_2_PCLMUL_FUNC_PROTO 1
589
+ #elif defined(ZEND_INTRIN_SSE4_2_PCLMUL_RESOLVER)
590
+ # define ZEND_INTRIN_SSE4_2_PCLMUL_FUNC_PTR 1
591
+ #endif
592
+
593
+ #ifdef ZEND_INTRIN_SSE4_2_PCLMUL_RESOLVER
594
+ # ifdef HAVE_FUNC_ATTRIBUTE_TARGET
595
+ # define ZEND_INTRIN_SSE4_2_PCLMUL_FUNC_DECL (func ) ZEND_API func __attribute__ ((target(" sse4.2,pclmul" )))
596
+ # else
597
+ # define ZEND_INTRIN_SSE4_2_PCLMUL_FUNC_DECL (func ) func
598
+ # endif
599
+ #else
600
+ # define ZEND_INTRIN_SSE4_2_PCLMUL_FUNC_DECL (func )
601
+ #endif
602
+
549
603
#ifdef __AVX2__
550
604
# define ZEND_INTRIN_AVX2_NATIVE 1
551
605
#elif (defined(HAVE_FUNC_ATTRIBUTE_TARGET) && defined(PHP_HAVE_AVX2)) || defined(ZEND_WIN32)
0 commit comments