@@ -242,6 +242,11 @@ pub fn adjust_intrinsic_arguments<'a, 'b, 'gcc, 'tcx>(builder: &Builder<'a, 'gcc
242242 new_args. pop ( ) ;
243243 args = new_args. into ( ) ;
244244 } ,
245+ // The GCC version returns one value of the tuple through a pointer.
246+ "__builtin_ia32_rdrand64_step" => {
247+ let arg = builder. current_func ( ) . new_local ( None , builder. ulonglong_type , "return_rdrand_arg" ) ;
248+ args = vec ! [ arg. get_address( None ) ] . into ( ) ;
249+ } ,
245250 _ => ( ) ,
246251 }
247252 }
@@ -362,6 +367,19 @@ pub fn adjust_intrinsic_return_value<'a, 'gcc, 'tcx>(builder: &Builder<'a, 'gcc,
362367 // builtin twice, we overwrite the return value with a dummy value.
363368 return_value = builder. context . new_rvalue_zero ( builder. int_type ) ;
364369 } ,
370+ "__builtin_ia32_rdrand64_step" => {
371+ let random_number = args[ 0 ] . dereference ( None ) . to_rvalue ( ) ;
372+ let success_variable = builder. current_func ( ) . new_local ( None , return_value. get_type ( ) , "success" ) ;
373+ builder. llbb ( ) . add_assignment ( None , success_variable, return_value) ;
374+
375+ let field1 = builder. context . new_field ( None , random_number. get_type ( ) , "random_number" ) ;
376+ let field2 = builder. context . new_field ( None , return_value. get_type ( ) , "success" ) ;
377+ let struct_type = builder. context . new_struct_type ( None , "rdrand_result" , & [ field1, field2] ) ;
378+ return_value = builder. context . new_struct_constructor ( None , struct_type. as_type ( ) , None , & [
379+ random_number,
380+ success_variable. to_rvalue ( ) ,
381+ ] ) ;
382+ } ,
365383 _ => ( ) ,
366384 }
367385
@@ -614,6 +632,7 @@ pub fn intrinsic<'gcc, 'tcx>(name: &str, cx: &CodegenCx<'gcc, 'tcx>) -> Function
614632 "llvm.fshr.v8i16" => "__builtin_ia32_vpshrdv_v8hi" ,
615633 "llvm.x86.fma.vfmadd.sd" => "__builtin_ia32_vfmaddsd3" ,
616634 "llvm.x86.fma.vfmadd.ss" => "__builtin_ia32_vfmaddss3" ,
635+ "llvm.x86.rdrand.64" => "__builtin_ia32_rdrand64_step" ,
617636
618637 // The above doc points to unknown builtins for the following, so override them:
619638 "llvm.x86.avx2.gather.d.d" => "__builtin_ia32_gathersiv4si" ,
0 commit comments