mirror of
https://github.com/archlinuxarm/PKGBUILDs.git
synced 2024-11-28 22:57:37 +00:00
56 lines
2 KiB
Diff
56 lines
2 KiB
Diff
|
diff --git a/src/core/simd.d b/src/core/simd.d
|
||
|
index c27dc4c1..7641c8a9 100644
|
||
|
--- a/src/core/simd.d
|
||
|
+++ b/src/core/simd.d
|
||
|
@@ -84,6 +84,20 @@ version (LDC)
|
||
|
enum dataCache = 1;
|
||
|
llvm_prefetch(address, writeFetch, locality, dataCache);
|
||
|
}
|
||
|
+
|
||
|
+ unittest
|
||
|
+ {
|
||
|
+ float[4] data = [ 0.5, 1, 1.5, 2 ];
|
||
|
+ auto ptr = &data[0];
|
||
|
+
|
||
|
+ prefetch!(false, 0)(ptr);
|
||
|
+ auto v = loadUnaligned!float4(ptr);
|
||
|
+ v *= 2;
|
||
|
+ storeUnaligned!float4(v, ptr);
|
||
|
+
|
||
|
+ float[4] expected = [ 1, 2, 3, 4 ];
|
||
|
+ assert(data == expected);
|
||
|
+ }
|
||
|
}
|
||
|
else version (D_SIMD)
|
||
|
{
|
||
|
diff --git a/src/ldc/intrinsics.di b/src/ldc/intrinsics.di
|
||
|
index 914cd5e1..091b2aac 100644
|
||
|
--- a/src/ldc/intrinsics.di
|
||
|
+++ b/src/ldc/intrinsics.di
|
||
|
@@ -129,6 +129,14 @@ pragma(LDC_intrinsic, "llvm.stacksave")
|
||
|
pragma(LDC_intrinsic, "llvm.stackrestore")
|
||
|
void llvm_stackrestore(void* ptr);
|
||
|
|
||
|
+version(INTRINSICS_FROM_1000)
|
||
|
+{
|
||
|
+ private enum llvm_prefetch_fullname = "llvm.prefetch.p0i8";
|
||
|
+}
|
||
|
+else
|
||
|
+{
|
||
|
+ private enum llvm_prefetch_fullname = "llvm.prefetch";
|
||
|
+}
|
||
|
/// The 'llvm.prefetch' intrinsic is a hint to the code generator to insert a
|
||
|
/// prefetch instruction if supported; otherwise, it is a noop. Prefetches have
|
||
|
/// no effect on the behavior of the program but can change its performance
|
||
|
@@ -139,8 +147,8 @@ pragma(LDC_intrinsic, "llvm.stackrestore")
|
||
|
/// keep in cache. The cache type specifies whether the prefetch is performed on
|
||
|
/// the data (1) or instruction (0) cache. The rw, locality and cache type
|
||
|
/// arguments must be constant integers.
|
||
|
-pragma(LDC_intrinsic, "llvm.prefetch")
|
||
|
- void llvm_prefetch(void* ptr, uint rw, uint locality, uint cachetype) pure @safe;
|
||
|
+pragma(LDC_intrinsic, llvm_prefetch_fullname)
|
||
|
+ void llvm_prefetch(const(void)* ptr, uint rw, uint locality, uint cachetype) pure @safe;
|
||
|
|
||
|
/// The 'llvm.pcmarker' intrinsic is a method to export a Program Counter (PC)
|
||
|
/// in a region of code to simulators and other tools. The method is target
|