@@ -648,6 +648,12 @@ pub fn adjust_intrinsic_arguments<'a, 'b, 'gcc, 'tcx>(
648
648
new_args. push ( handle) ;
649
649
args = new_args. into ( ) ;
650
650
}
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
+ }
651
657
_ => ( ) ,
652
658
}
653
659
} else {
@@ -764,6 +770,14 @@ pub fn adjust_intrinsic_arguments<'a, 'b, 'gcc, 'tcx>(
764
770
new_args. swap ( 0 , 1 ) ;
765
771
args = new_args. into ( ) ;
766
772
}
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
+ }
767
781
_ => ( ) ,
768
782
}
769
783
}
@@ -935,6 +949,19 @@ pub fn adjust_intrinsic_return_value<'a, 'gcc, 'tcx>(
935
949
) ;
936
950
return_value = result. to_rvalue ( ) ;
937
951
}
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
+ }
938
965
_ => ( ) ,
939
966
}
940
967
@@ -1529,6 +1556,17 @@ pub fn intrinsic<'gcc, 'tcx>(name: &str, cx: &CodegenCx<'gcc, 'tcx>) -> Function
1529
1556
"llvm.x86.aesdecwide128kl" => "__builtin_ia32_aesdecwide128kl_u8" ,
1530
1557
"llvm.x86.aesencwide256kl" => "__builtin_ia32_aesencwide256kl_u8" ,
1531
1558
"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" ,
1532
1570
1533
1571
// TODO: support the tile builtins:
1534
1572
"llvm.x86.ldtilecfg" => "__builtin_trap" ,
0 commit comments