Auto merge of #124932 - RalfJung:temporal, r=compiler-errors
codegen: memmove/memset cannot be non-temporal non-temporal memset is not a thing. And for memmove, since the LLVM backend doesn't support this, surely we don't need it in the GCC backend.
This commit is contained in:
commit
66f877007d
@ -1301,19 +1301,13 @@ impl<'a, 'gcc, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'gcc, 'tcx> {
|
|||||||
fn memmove(
|
fn memmove(
|
||||||
&mut self,
|
&mut self,
|
||||||
dst: RValue<'gcc>,
|
dst: RValue<'gcc>,
|
||||||
dst_align: Align,
|
_dst_align: Align,
|
||||||
src: RValue<'gcc>,
|
src: RValue<'gcc>,
|
||||||
src_align: Align,
|
_src_align: Align,
|
||||||
size: RValue<'gcc>,
|
size: RValue<'gcc>,
|
||||||
flags: MemFlags,
|
flags: MemFlags,
|
||||||
) {
|
) {
|
||||||
if flags.contains(MemFlags::NONTEMPORAL) {
|
assert!(!flags.contains(MemFlags::NONTEMPORAL), "non-temporal memmove not supported");
|
||||||
// HACK(nox): This is inefficient but there is no nontemporal memmove.
|
|
||||||
let val = self.load(src.get_type().get_pointee().expect("get_pointee"), src, src_align);
|
|
||||||
let ptr = self.pointercast(dst, self.type_ptr_to(self.val_ty(val)));
|
|
||||||
self.store_with_flags(val, ptr, dst_align, flags);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
let size = self.intcast(size, self.type_size_t(), false);
|
let size = self.intcast(size, self.type_size_t(), false);
|
||||||
let _is_volatile = flags.contains(MemFlags::VOLATILE);
|
let _is_volatile = flags.contains(MemFlags::VOLATILE);
|
||||||
let dst = self.pointercast(dst, self.type_i8p());
|
let dst = self.pointercast(dst, self.type_i8p());
|
||||||
@ -1335,6 +1329,7 @@ impl<'a, 'gcc, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'gcc, 'tcx> {
|
|||||||
_align: Align,
|
_align: Align,
|
||||||
flags: MemFlags,
|
flags: MemFlags,
|
||||||
) {
|
) {
|
||||||
|
assert!(!flags.contains(MemFlags::NONTEMPORAL), "non-temporal memset not supported");
|
||||||
let _is_volatile = flags.contains(MemFlags::VOLATILE);
|
let _is_volatile = flags.contains(MemFlags::VOLATILE);
|
||||||
let ptr = self.pointercast(ptr, self.type_i8p());
|
let ptr = self.pointercast(ptr, self.type_i8p());
|
||||||
let memset = self.context.get_builtin_function("memset");
|
let memset = self.context.get_builtin_function("memset");
|
||||||
|
@ -976,6 +976,7 @@ impl<'a, 'll, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
|
|||||||
align: Align,
|
align: Align,
|
||||||
flags: MemFlags,
|
flags: MemFlags,
|
||||||
) {
|
) {
|
||||||
|
assert!(!flags.contains(MemFlags::NONTEMPORAL), "non-temporal memset not supported");
|
||||||
let is_volatile = flags.contains(MemFlags::VOLATILE);
|
let is_volatile = flags.contains(MemFlags::VOLATILE);
|
||||||
unsafe {
|
unsafe {
|
||||||
llvm::LLVMRustBuildMemSet(
|
llvm::LLVMRustBuildMemSet(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user