summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_codegen_gcc/src/intrinsic/llvm.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-07 05:48:48 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-07 05:48:48 +0000
commitef24de24a82fe681581cc130f342363c47c0969a (patch)
tree0d494f7e1a38b95c92426f58fe6eaa877303a86c /compiler/rustc_codegen_gcc/src/intrinsic/llvm.rs
parentReleasing progress-linux version 1.74.1+dfsg1-1~progress7.99u1. (diff)
downloadrustc-ef24de24a82fe681581cc130f342363c47c0969a.tar.xz
rustc-ef24de24a82fe681581cc130f342363c47c0969a.zip
Merging upstream version 1.75.0+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'compiler/rustc_codegen_gcc/src/intrinsic/llvm.rs')
-rw-r--r--compiler/rustc_codegen_gcc/src/intrinsic/llvm.rs44
1 files changed, 35 insertions, 9 deletions
diff --git a/compiler/rustc_codegen_gcc/src/intrinsic/llvm.rs b/compiler/rustc_codegen_gcc/src/intrinsic/llvm.rs
index f28348380..35eb4a110 100644
--- a/compiler/rustc_codegen_gcc/src/intrinsic/llvm.rs
+++ b/compiler/rustc_codegen_gcc/src/intrinsic/llvm.rs
@@ -236,11 +236,17 @@ pub fn adjust_intrinsic_arguments<'a, 'b, 'gcc, 'tcx>(builder: &Builder<'a, 'gcc
let arg2 = builder.context.new_cast(None, arg2, arg2_type);
args = vec![new_args[0], arg2].into();
},
+ // These builtins are sent one more argument than needed.
"__builtin_prefetch" => {
let mut new_args = args.to_vec();
new_args.pop();
args = new_args.into();
},
+ // The GCC version returns one value of the tuple through a pointer.
+ "__builtin_ia32_rdrand64_step" => {
+ let arg = builder.current_func().new_local(None, builder.ulonglong_type, "return_rdrand_arg");
+ args = vec![arg.get_address(None)].into();
+ },
_ => (),
}
}
@@ -361,6 +367,19 @@ pub fn adjust_intrinsic_return_value<'a, 'gcc, 'tcx>(builder: &Builder<'a, 'gcc,
// builtin twice, we overwrite the return value with a dummy value.
return_value = builder.context.new_rvalue_zero(builder.int_type);
},
+ "__builtin_ia32_rdrand64_step" => {
+ let random_number = args[0].dereference(None).to_rvalue();
+ let success_variable = builder.current_func().new_local(None, return_value.get_type(), "success");
+ builder.llbb().add_assignment(None, success_variable, return_value);
+
+ let field1 = builder.context.new_field(None, random_number.get_type(), "random_number");
+ let field2 = builder.context.new_field(None, return_value.get_type(), "success");
+ let struct_type = builder.context.new_struct_type(None, "rdrand_result", &[field1, field2]);
+ return_value = builder.context.new_struct_constructor(None, struct_type.as_type(), None, &[
+ random_number,
+ success_variable.to_rvalue(),
+ ]);
+ },
_ => (),
}
@@ -413,15 +432,21 @@ pub fn ignore_arg_cast(func_name: &str, index: usize, args_len: usize) -> bool {
#[cfg(not(feature="master"))]
pub fn intrinsic<'gcc, 'tcx>(name: &str, cx: &CodegenCx<'gcc, 'tcx>) -> Function<'gcc> {
- match name {
- "llvm.x86.xgetbv" | "llvm.x86.sse2.pause" => {
- let gcc_name = "__builtin_trap";
- let func = cx.context.get_builtin_function(gcc_name);
- cx.functions.borrow_mut().insert(gcc_name.to_string(), func);
- return func;
- },
- _ => unimplemented!("unsupported LLVM intrinsic {}", name),
- }
+ let gcc_name =
+ match name {
+ "llvm.x86.sse2.pause" => {
+ // NOTE: pause is only a hint, so we use a dummy built-in because target built-ins
+ // are not supported in libgccjit 12.
+ "__builtin_inff"
+ },
+ "llvm.x86.xgetbv" => {
+ "__builtin_trap"
+ },
+ _ => unimplemented!("unsupported LLVM intrinsic {}", name),
+ };
+ let func = cx.context.get_builtin_function(gcc_name);
+ cx.functions.borrow_mut().insert(gcc_name.to_string(), func);
+ return func;
}
#[cfg(feature="master")]
@@ -613,6 +638,7 @@ pub fn intrinsic<'gcc, 'tcx>(name: &str, cx: &CodegenCx<'gcc, 'tcx>) -> Function
"llvm.fshr.v8i16" => "__builtin_ia32_vpshrdv_v8hi",
"llvm.x86.fma.vfmadd.sd" => "__builtin_ia32_vfmaddsd3",
"llvm.x86.fma.vfmadd.ss" => "__builtin_ia32_vfmaddss3",
+ "llvm.x86.rdrand.64" => "__builtin_ia32_rdrand64_step",
// The above doc points to unknown builtins for the following, so override them:
"llvm.x86.avx2.gather.d.d" => "__builtin_ia32_gathersiv4si",