Skip to content

Commit c42718b

Browse files
committed
Support new target builtins
1 parent 06af88e commit c42718b

File tree

1 file changed

+83
-0
lines changed

1 file changed

+83
-0
lines changed

src/intrinsic/llvm.rs

+83
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ pub fn adjust_intrinsic_arguments<'a, 'b, 'gcc, 'tcx>(
4949
return vec![].into();
5050
}
5151

52+
let void_ptr = builder.context.new_type::<*mut ()>();
5253
// Some LLVM intrinsics do not map 1-to-1 to GCC intrinsics, so we add the missing
5354
// arguments here.
5455
if gcc_func.get_param_count() != args.len() {
@@ -503,6 +504,60 @@ pub fn adjust_intrinsic_arguments<'a, 'b, 'gcc, 'tcx>(
503504
let arg4 = builder.context.new_rvalue_from_int(arg4_type, -1);
504505
args = vec![a, b, c, arg4, new_args[3]].into();
505506
}
507+
"__builtin_ia32_encodekey128_u32" | "__builtin_ia32_encodekey256_u32" => {
508+
let mut new_args = args.to_vec();
509+
let result = builder.current_func().new_local(None, void_ptr, "result");
510+
new_args.push(result.to_rvalue());
511+
args = new_args.into();
512+
}
513+
"__builtin_ia32_aesenc128kl_u8"
514+
| "__builtin_ia32_aesdec128kl_u8"
515+
| "__builtin_ia32_aesenc256kl_u8"
516+
| "__builtin_ia32_aesdec256kl_u8" => {
517+
let mut new_args = vec![];
518+
let result = builder.current_func().new_local(None, void_ptr, "result");
519+
new_args.push(result.to_rvalue());
520+
new_args.extend(args.to_vec());
521+
args = new_args.into();
522+
}
523+
"__builtin_ia32_aesencwide128kl_u8"
524+
| "__builtin_ia32_aesdecwide128kl_u8"
525+
| "__builtin_ia32_aesencwide256kl_u8"
526+
| "__builtin_ia32_aesdecwide256kl_u8" => {
527+
let mut new_args = vec![];
528+
let result = builder.current_func().new_local(None, void_ptr, "result");
529+
new_args.push(result.to_rvalue());
530+
531+
let mut old_args = args.to_vec();
532+
let handle = old_args.swap_remove(0); // Called __P in GCC.
533+
534+
let arg2_type = gcc_func.get_param_type(1);
535+
let first_value = old_args.swap_remove(0);
536+
let element_type = first_value.get_type();
537+
let array_type = builder.context.new_array_type(None, element_type, 8);
538+
let array = builder.current_func().new_local(None, array_type, "array");
539+
let input = builder.context.new_array_constructor(
540+
None,
541+
array_type,
542+
&[
543+
first_value,
544+
old_args.swap_remove(0),
545+
old_args.swap_remove(0),
546+
old_args.swap_remove(0),
547+
old_args.swap_remove(0),
548+
old_args.swap_remove(0),
549+
old_args.swap_remove(0),
550+
old_args.swap_remove(0),
551+
],
552+
);
553+
builder.llbb().add_assignment(None, array, input);
554+
let input_ptr = array.get_address(None);
555+
let input_ptr = builder.context.new_cast(None, input_ptr, arg2_type);
556+
new_args.push(input_ptr);
557+
558+
new_args.push(handle);
559+
args = new_args.into();
560+
}
506561
_ => (),
507562
}
508563
} else {
@@ -700,6 +755,24 @@ pub fn adjust_intrinsic_return_value<'a, 'gcc, 'tcx>(
700755
let f16_type = builder.context.new_c_type(CType::Float16);
701756
return_value = builder.context.new_cast(None, return_value, f16_type);
702757
}
758+
"__builtin_ia32_encodekey128_u32" => {
759+
// The builtin __builtin_ia32_encodekey128_u32 writes the result in its pointer argument while
760+
// llvm.x86.encodekey128 returns a value.
761+
// We added a result pointerargument since and now need to assign its value to the result_value expected by
762+
// the LLVM intrinsic.
763+
let ptr =
764+
builder.context.new_cast(None, args[2], return_value.get_type().make_pointer());
765+
return_value = ptr.dereference(None).to_rvalue();
766+
}
767+
"__builtin_ia32_encodekey256_u32" => {
768+
// The builtin __builtin_ia32_encodekey256_u32 writes the result in its pointer argument while
769+
// llvm.x86.encodekey128 returns a value.
770+
// We added a result pointerargument since and now need to assign its value to the result_value expected by
771+
// the LLVM intrinsic.
772+
let ptr =
773+
builder.context.new_cast(None, args[3], return_value.get_type().make_pointer());
774+
return_value = ptr.dereference(None).to_rvalue();
775+
}
703776
_ => (),
704777
}
705778

@@ -1284,6 +1357,16 @@ pub fn intrinsic<'gcc, 'tcx>(name: &str, cx: &CodegenCx<'gcc, 'tcx>) -> Function
12841357
"llvm.x86.avx512fp16.mask.vfmadd.cph.256" => "__builtin_ia32_vfmaddcph256_mask3",
12851358
"llvm.x86.avx512fp16.mask.vfcmadd.cph.128" => "__builtin_ia32_vfcmaddcph128_mask3",
12861359
"llvm.x86.avx512fp16.mask.vfmadd.cph.128" => "__builtin_ia32_vfmaddcph128_mask3",
1360+
"llvm.x86.encodekey128" => "__builtin_ia32_encodekey128_u32",
1361+
"llvm.x86.encodekey256" => "__builtin_ia32_encodekey256_u32",
1362+
"llvm.x86.aesenc128kl" => "__builtin_ia32_aesenc128kl_u8",
1363+
"llvm.x86.aesdec128kl" => "__builtin_ia32_aesdec128kl_u8",
1364+
"llvm.x86.aesenc256kl" => "__builtin_ia32_aesenc256kl_u8",
1365+
"llvm.x86.aesdec256kl" => "__builtin_ia32_aesdec256kl_u8",
1366+
"llvm.x86.aesencwide128kl" => "__builtin_ia32_aesencwide128kl_u8",
1367+
"llvm.x86.aesdecwide128kl" => "__builtin_ia32_aesdecwide128kl_u8",
1368+
"llvm.x86.aesencwide256kl" => "__builtin_ia32_aesencwide256kl_u8",
1369+
"llvm.x86.aesdecwide256kl" => "__builtin_ia32_aesdecwide256kl_u8",
12871370

12881371
// TODO: support the tile builtins:
12891372
"llvm.x86.ldtilecfg" => "__builtin_trap",

0 commit comments

Comments
 (0)