@@ -242,6 +242,11 @@ pub fn adjust_intrinsic_arguments<'a, 'b, 'gcc, 'tcx>(builder: &Builder<'a, 'gcc
242
242
new_args. pop ( ) ;
243
243
args = new_args. into ( ) ;
244
244
} ,
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
+ } ,
245
250
_ => ( ) ,
246
251
}
247
252
}
@@ -362,6 +367,19 @@ pub fn adjust_intrinsic_return_value<'a, 'gcc, 'tcx>(builder: &Builder<'a, 'gcc,
362
367
// builtin twice, we overwrite the return value with a dummy value.
363
368
return_value = builder. context . new_rvalue_zero ( builder. int_type ) ;
364
369
} ,
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
+ } ,
365
383
_ => ( ) ,
366
384
}
367
385
@@ -614,6 +632,7 @@ pub fn intrinsic<'gcc, 'tcx>(name: &str, cx: &CodegenCx<'gcc, 'tcx>) -> Function
614
632
"llvm.fshr.v8i16" => "__builtin_ia32_vpshrdv_v8hi" ,
615
633
"llvm.x86.fma.vfmadd.sd" => "__builtin_ia32_vfmaddsd3" ,
616
634
"llvm.x86.fma.vfmadd.ss" => "__builtin_ia32_vfmaddss3" ,
635
+ "llvm.x86.rdrand.64" => "__builtin_ia32_rdrand64_step" ,
617
636
618
637
// The above doc points to unknown builtins for the following, so override them:
619
638
"llvm.x86.avx2.gather.d.d" => "__builtin_ia32_gathersiv4si" ,
0 commit comments