Skip to content

Commit 67d8469

Browse files
committed
Add support for a few missing LLVM intrinsics
1 parent 769fb75 commit 67d8469

File tree

1 file changed

+38
-0
lines changed

1 file changed

+38
-0
lines changed

src/intrinsic/llvm.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -648,6 +648,12 @@ pub fn adjust_intrinsic_arguments<'a, 'b, 'gcc, 'tcx>(
648648
new_args.push(handle);
649649
args = new_args.into();
650650
}
651+
"__builtin_ia32_rdtscp" => {
652+
let ptr_type = builder.u32_type.make_pointer();
653+
let result = builder.current_func().new_local(None, ptr_type, "result");
654+
let new_args = vec![result.to_rvalue()];
655+
args = new_args.into();
656+
}
651657
_ => (),
652658
}
653659
} else {
@@ -764,6 +770,14 @@ pub fn adjust_intrinsic_arguments<'a, 'b, 'gcc, 'tcx>(
764770
new_args.swap(0, 1);
765771
args = new_args.into();
766772
}
773+
"__builtin_ia32_dpps256" => {
774+
let mut new_args = args.to_vec();
775+
// NOTE: without this cast to u8 (and it needs to be a u8 to fix the issue), we
776+
// would get the following error:
777+
// the last argument must be an 8-bit immediate
778+
new_args[2] = builder.context.new_cast(None, new_args[2], builder.cx.type_u8());
779+
args = new_args.into();
780+
}
767781
_ => (),
768782
}
769783
}
@@ -935,6 +949,19 @@ pub fn adjust_intrinsic_return_value<'a, 'gcc, 'tcx>(
935949
);
936950
return_value = result.to_rvalue();
937951
}
952+
"__builtin_ia32_rdtscp" => {
953+
let field1 = builder.context.new_field(None, return_value.get_type(), "rdtscpField1");
954+
let return2 = args[0].dereference(None).to_rvalue();
955+
let field2 = builder.context.new_field(None, return2.get_type(), "rdtscpField2");
956+
let struct_type =
957+
builder.context.new_struct_type(None, "rdtscpResult", &[field1, field2]);
958+
return_value = builder.context.new_struct_constructor(
959+
None,
960+
struct_type.as_type(),
961+
None,
962+
&[return_value, return2],
963+
);
964+
}
938965
_ => (),
939966
}
940967

@@ -1529,6 +1556,17 @@ pub fn intrinsic<'gcc, 'tcx>(name: &str, cx: &CodegenCx<'gcc, 'tcx>) -> Function
15291556
"llvm.x86.aesdecwide128kl" => "__builtin_ia32_aesdecwide128kl_u8",
15301557
"llvm.x86.aesencwide256kl" => "__builtin_ia32_aesencwide256kl_u8",
15311558
"llvm.x86.aesdecwide256kl" => "__builtin_ia32_aesdecwide256kl_u8",
1559+
"llvm.x86.avx512.uitofp.round.v8f16.v8i16" => "__builtin_ia32_vcvtuw2ph128_mask",
1560+
"llvm.x86.avx512.uitofp.round.v16f16.v16i16" => "__builtin_ia32_vcvtuw2ph256_mask",
1561+
"llvm.x86.avx512.uitofp.round.v32f16.v32i16" => "__builtin_ia32_vcvtuw2ph512_mask_round",
1562+
"llvm.x86.avx512.uitofp.round.v8f16.v8i32" => "__builtin_ia32_vcvtudq2ph256_mask",
1563+
"llvm.x86.avx512.uitofp.round.v16f16.v16i32" => "__builtin_ia32_vcvtudq2ph512_mask_round",
1564+
"llvm.x86.avx512.uitofp.round.v8f16.v8i64" => "__builtin_ia32_vcvtuqq2ph512_mask_round",
1565+
"llvm.x86.avx512.uitofp.round.v8f64.v8i64" => "__builtin_ia32_cvtuqq2pd512_mask",
1566+
"llvm.x86.avx512.uitofp.round.v2f64.v2i64" => "__builtin_ia32_cvtuqq2pd128_mask",
1567+
"llvm.x86.avx512.uitofp.round.v4f64.v4i64" => "__builtin_ia32_cvtuqq2pd256_mask",
1568+
"llvm.x86.avx512.uitofp.round.v8f32.v8i64" => "__builtin_ia32_cvtuqq2ps512_mask",
1569+
"llvm.x86.avx512.uitofp.round.v4f32.v4i64" => "__builtin_ia32_cvtuqq2ps256_mask",
15321570

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

0 commit comments

Comments
 (0)