Skip to content

Commit 6118ee4

Browse files
authored
Merge pull request #335 from rust-lang/feature/rdrand64
Implement llvm.x86.rdrand.64
2 parents f3b82df + 5ab4e2b commit 6118ee4

File tree

1 file changed

+19
-0
lines changed

1 file changed

+19
-0
lines changed

src/intrinsic/llvm.rs

+19
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)