Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit 9cb787f

Browse files
committed
Implement and test simd_shuffle*
1 parent 76b8947 commit 9cb787f

File tree

2 files changed

+59
-6
lines changed

2 files changed

+59
-6
lines changed

example/std_example.rs

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,60 @@ unsafe fn test_simd() {
5959
let or = _mm_or_si128(x, y);
6060
let cmp_eq = _mm_cmpeq_epi8(y, y);
6161
let cmp_lt = _mm_cmplt_epi8(y, y);
62-
let shl = _mm_slli_si128(y, 1);
6362

6463
assert_eq!(std::mem::transmute::<_, [u16; 8]>(or), [7, 7, 7, 7, 7, 7, 7, 7]);
6564
assert_eq!(std::mem::transmute::<_, [u16; 8]>(cmp_eq), [0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff]);
6665
assert_eq!(std::mem::transmute::<_, [u16; 8]>(cmp_lt), [0, 0, 0, 0, 0, 0, 0, 0]);
67-
assert_eq!(std::mem::transmute::<_, [u16; 8]>(or), [7, 7, 7, 7, 7, 7, 7, 0]);
66+
67+
test_mm_slli_si128();
68+
}
69+
70+
#[target_feature(enable = "sse2")]
71+
unsafe fn test_mm_slli_si128() {
72+
use std::arch::x86_64::*;
73+
74+
#[rustfmt::skip]
75+
let a = _mm_setr_epi8(
76+
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
77+
);
78+
let r = _mm_slli_si128(a, 1);
79+
let e = _mm_setr_epi8(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
80+
assert_eq_m128i(r, e);
81+
82+
#[rustfmt::skip]
83+
let a = _mm_setr_epi8(
84+
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
85+
);
86+
let r = _mm_slli_si128(a, 15);
87+
let e = _mm_setr_epi8(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1);
88+
assert_eq_m128i(r, e);
89+
90+
#[rustfmt::skip]
91+
let a = _mm_setr_epi8(
92+
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
93+
);
94+
let r = _mm_slli_si128(a, 16);
95+
assert_eq_m128i(r, _mm_set1_epi8(0));
96+
97+
#[rustfmt::skip]
98+
let a = _mm_setr_epi8(
99+
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
100+
);
101+
let r = _mm_slli_si128(a, -1);
102+
assert_eq_m128i(_mm_set1_epi8(0), r);
103+
104+
#[rustfmt::skip]
105+
let a = _mm_setr_epi8(
106+
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
107+
);
108+
let r = _mm_slli_si128(a, -0x80000000);
109+
assert_eq_m128i(r, _mm_set1_epi8(0));
110+
}
111+
112+
fn assert_eq_m128i(x: std::arch::x86_64::__m128i, y: std::arch::x86_64::__m128i) {
113+
unsafe {
114+
assert_eq!(std::mem::transmute::<_, [u8; 16]>(x), std::mem::transmute::<_, [u8; 16]>(x));
115+
}
68116
}
69117

70118
#[derive(PartialEq)]

src/intrinsics.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -877,10 +877,15 @@ pub fn codegen_intrinsic_call<'a, 'tcx: 'a>(
877877
assert!(idx < total_len, "idx {} out of range 0..{}", idx, total_len);
878878
}
879879

880-
881-
882-
println!("{:?}", indexes);
883-
unimplemented!();
880+
for (out_idx, in_idx) in indexes.into_iter().enumerate() {
881+
let in_lane = if in_idx < lane_count {
882+
x.value_field(fx, mir::Field::new(in_idx.try_into().unwrap()))
883+
} else {
884+
y.value_field(fx, mir::Field::new((in_idx - lane_count).try_into().unwrap()))
885+
};
886+
let out_lane = ret.place_field(fx, mir::Field::new(out_idx));
887+
out_lane.write_cvalue(fx, in_lane);
888+
}
884889
};
885890

886891
simd_add, (c x, c y) {

0 commit comments

Comments
 (0)