about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbjorn3 <17426603+bjorn3@users.noreply.github.com>2024-05-11 22:11:53 +0200
committerGitHub <noreply@github.com>2024-05-11 22:11:53 +0200
commit893ba536bc929899fb4662ba24d9ed8f82a643cd (patch)
tree8346e0a839c9fd6884c9a7dcc35bfc3444af3c6e /src
parent7b50189dce74cf5b86cd928161138a2bd6c9305f (diff)
parent4a4535a57cef0182d516888f1abb5d4a9ec84fdc (diff)
downloadrust-893ba536bc929899fb4662ba24d9ed8f82a643cd.tar.gz
rust-893ba536bc929899fb4662ba24d9ed8f82a643cd.zip
Merge pull request #1491 from folkertdev/add-llvm-avx2-permd
add `llvm.x86.avx2.permd` intrinsic
Diffstat (limited to 'src')
-rw-r--r--src/intrinsics/llvm_x86.rs15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/intrinsics/llvm_x86.rs b/src/intrinsics/llvm_x86.rs
index 71e06c73a37..75e9e16db55 100644
--- a/src/intrinsics/llvm_x86.rs
+++ b/src/intrinsics/llvm_x86.rs
@@ -374,6 +374,21 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
                 }
             }
         }
+        "llvm.x86.avx2.permd" => {
+            // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_permutevar8x32_epi32
+            intrinsic_args!(fx, args => (a, idx); intrinsic);
+
+            for j in 0..=7 {
+                let index = idx.value_typed_lane(fx, fx.tcx.types.u32, j).load_scalar(fx);
+                let index = fx.bcx.ins().uextend(fx.pointer_type, index);
+                let value = a.value_lane_dyn(fx, index).load_scalar(fx);
+                ret.place_typed_lane(fx, fx.tcx.types.u32, j).to_ptr().store(
+                    fx,
+                    value,
+                    MemFlags::trusted(),
+                );
+            }
+        }
         "llvm.x86.avx2.vperm2i128"
         | "llvm.x86.avx.vperm2f128.ps.256"
         | "llvm.x86.avx.vperm2f128.pd.256" => {