@@ -648,6 +648,12 @@ pub fn adjust_intrinsic_arguments<'a, 'b, 'gcc, 'tcx>(
648648 new_args. push ( handle) ;
649649 args = new_args. into ( ) ;
650650 }
651+ "__builtin_ia32_rdtscp" => {
652+ let ptr_type = builder. u32_type . make_pointer ( ) ;
653+ let result = builder. current_func ( ) . new_local ( None , ptr_type, "result" ) ;
654+ let new_args = vec ! [ result. to_rvalue( ) ] ;
655+ args = new_args. into ( ) ;
656+ }
651657 _ => ( ) ,
652658 }
653659 } else {
@@ -764,6 +770,14 @@ pub fn adjust_intrinsic_arguments<'a, 'b, 'gcc, 'tcx>(
764770 new_args. swap ( 0 , 1 ) ;
765771 args = new_args. into ( ) ;
766772 }
773+ "__builtin_ia32_dpps256" => {
774+ let mut new_args = args. to_vec ( ) ;
775+ // NOTE: without this cast to u8 (and it needs to be a u8 to fix the issue), we
776+ // would get the following error:
777+ // the last argument must be an 8-bit immediate
778+ new_args[ 2 ] = builder. context . new_cast ( None , new_args[ 2 ] , builder. cx . type_u8 ( ) ) ;
779+ args = new_args. into ( ) ;
780+ }
767781 _ => ( ) ,
768782 }
769783 }
@@ -935,6 +949,19 @@ pub fn adjust_intrinsic_return_value<'a, 'gcc, 'tcx>(
935949 ) ;
936950 return_value = result. to_rvalue ( ) ;
937951 }
952+ "__builtin_ia32_rdtscp" => {
953+ let field1 = builder. context . new_field ( None , return_value. get_type ( ) , "rdtscpField1" ) ;
954+ let return2 = args[ 0 ] . dereference ( None ) . to_rvalue ( ) ;
955+ let field2 = builder. context . new_field ( None , return2. get_type ( ) , "rdtscpField2" ) ;
956+ let struct_type =
957+ builder. context . new_struct_type ( None , "rdtscpResult" , & [ field1, field2] ) ;
958+ return_value = builder. context . new_struct_constructor (
959+ None ,
960+ struct_type. as_type ( ) ,
961+ None ,
962+ & [ return_value, return2] ,
963+ ) ;
964+ }
938965 _ => ( ) ,
939966 }
940967
@@ -1529,6 +1556,17 @@ pub fn intrinsic<'gcc, 'tcx>(name: &str, cx: &CodegenCx<'gcc, 'tcx>) -> Function
15291556 "llvm.x86.aesdecwide128kl" => "__builtin_ia32_aesdecwide128kl_u8" ,
15301557 "llvm.x86.aesencwide256kl" => "__builtin_ia32_aesencwide256kl_u8" ,
15311558 "llvm.x86.aesdecwide256kl" => "__builtin_ia32_aesdecwide256kl_u8" ,
1559+ "llvm.x86.avx512.uitofp.round.v8f16.v8i16" => "__builtin_ia32_vcvtuw2ph128_mask" ,
1560+ "llvm.x86.avx512.uitofp.round.v16f16.v16i16" => "__builtin_ia32_vcvtuw2ph256_mask" ,
1561+ "llvm.x86.avx512.uitofp.round.v32f16.v32i16" => "__builtin_ia32_vcvtuw2ph512_mask_round" ,
1562+ "llvm.x86.avx512.uitofp.round.v8f16.v8i32" => "__builtin_ia32_vcvtudq2ph256_mask" ,
1563+ "llvm.x86.avx512.uitofp.round.v16f16.v16i32" => "__builtin_ia32_vcvtudq2ph512_mask_round" ,
1564+ "llvm.x86.avx512.uitofp.round.v8f16.v8i64" => "__builtin_ia32_vcvtuqq2ph512_mask_round" ,
1565+ "llvm.x86.avx512.uitofp.round.v8f64.v8i64" => "__builtin_ia32_cvtuqq2pd512_mask" ,
1566+ "llvm.x86.avx512.uitofp.round.v2f64.v2i64" => "__builtin_ia32_cvtuqq2pd128_mask" ,
1567+ "llvm.x86.avx512.uitofp.round.v4f64.v4i64" => "__builtin_ia32_cvtuqq2pd256_mask" ,
1568+ "llvm.x86.avx512.uitofp.round.v8f32.v8i64" => "__builtin_ia32_cvtuqq2ps512_mask" ,
1569+ "llvm.x86.avx512.uitofp.round.v4f32.v4i64" => "__builtin_ia32_cvtuqq2ps256_mask" ,
15321570
15331571 // TODO: support the tile builtins:
15341572 "llvm.x86.ldtilecfg" => "__builtin_trap" ,
0 commit comments