@@ -387,6 +387,27 @@ impl<'ll, 'tcx> IntrinsicCallBuilderMethods<'tcx> for Builder<'_, 'll, 'tcx> {
387387 let pair = self . insert_value ( pair, high, 1 ) ;
388388 pair
389389 }
390+
391+ // FIXME move into the branch below when LLVM 22 is the lowest version we support.
392+ sym:: carryless_mul if crate :: llvm_util:: get_version ( ) >= ( 22 , 0 , 0 ) => {
393+ let ty = args[ 0 ] . layout . ty ;
394+ if !ty. is_integral ( ) {
395+ tcx. dcx ( ) . emit_err ( InvalidMonomorphization :: BasicIntegerType {
396+ span,
397+ name,
398+ ty,
399+ } ) ;
400+ return Ok ( ( ) ) ;
401+ }
402+ let ( size, _) = ty. int_size_and_signed ( self . tcx ) ;
403+ let width = size. bits ( ) ;
404+ let llty = self . type_ix ( width) ;
405+
406+ let lhs = args[ 0 ] . immediate ( ) ;
407+ let rhs = args[ 1 ] . immediate ( ) ;
408+ self . call_intrinsic ( "llvm.clmul" , & [ llty] , & [ lhs, rhs] )
409+ }
410+
390411 sym:: ctlz
391412 | sym:: ctlz_nonzero
392413 | sym:: cttz
@@ -2784,6 +2805,7 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
27842805 | sym:: simd_ctlz
27852806 | sym:: simd_ctpop
27862807 | sym:: simd_cttz
2808+ | sym:: simd_carryless_mul
27872809 | sym:: simd_funnel_shl
27882810 | sym:: simd_funnel_shr
27892811 ) {
@@ -2808,6 +2830,7 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
28082830 sym:: simd_cttz => "llvm.cttz" ,
28092831 sym:: simd_funnel_shl => "llvm.fshl" ,
28102832 sym:: simd_funnel_shr => "llvm.fshr" ,
2833+ sym:: simd_carryless_mul => "llvm.clmul" ,
28112834 _ => unreachable ! ( ) ,
28122835 } ;
28132836 let int_size = in_elem. int_size_and_signed ( bx. tcx ( ) ) . 0 . bits ( ) ;
@@ -2833,6 +2856,17 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
28332856 & [ vec_ty] ,
28342857 & [ args[ 0 ] . immediate ( ) , args[ 1 ] . immediate ( ) , args[ 2 ] . immediate ( ) ] ,
28352858 ) ) ,
2859+ sym:: simd_carryless_mul => {
2860+ if crate :: llvm_util:: get_version ( ) >= ( 22 , 0 , 0 ) {
2861+ Ok ( bx. call_intrinsic (
2862+ llvm_intrinsic,
2863+ & [ vec_ty] ,
2864+ & [ args[ 0 ] . immediate ( ) , args[ 1 ] . immediate ( ) ] ,
2865+ ) )
2866+ } else {
2867+ span_bug ! ( span, "`simd_carryless_mul` needs LLVM 22 or higher" ) ;
2868+ }
2869+ }
28362870 _ => unreachable ! ( ) ,
28372871 } ;
28382872 }
0 commit comments