Skip to content

Commit f8be297

Browse files
feat: implemented get_lane_function for x86
1 parent ca18490 commit f8be297

File tree

3 files changed

+65
-3
lines changed

3 files changed

+65
-3
lines changed

crates/intrinsic-test/src/x86/config.rs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,46 @@ pub const F16_FORMATTING_DEF: &str = r#"
1414
struct Hex<T>(T);
1515
"#;
1616

17+
pub const LANE_FUNCTION_HELPERS: &str = r#"
18+
int mm512_extract(__m512i m, int vec_len, int bit_len, int index) {
19+
int lane_len = 128;
20+
int max_major_index = vec_len / lane_len;
21+
int max_minor_index = lane_len / bit_len;
22+
23+
int major_index = index / max_major_index;
24+
int minor_index = index % max_minor_index;
25+
26+
__m128i lane = _mm512_extracti64x2_epi64(m, major_index);
27+
28+
switch(bit_len){
29+
case 8:
30+
return _mm_extract_epi8(lane, minor_index);
31+
case 16:
32+
return _mm_extract_epi16(lane, minor_index);
33+
case 32:
34+
return _mm_extract_epi32(lane, minor_index);
35+
case 64:
36+
return _mm_extract_epi64(lane, minor_index);
37+
}
38+
}
39+
40+
int _mm512_extract_intrinsic_test_epi8(__m512i m, int lane) {
41+
return mm512_extract(m, 512, 8, lane)
42+
}
43+
44+
int _mm512_extract_intrinsic_test_epi16(__m512i m, int lane) {
45+
return mm512_extract(m, 512, 16, lane)
46+
}
47+
48+
int mm512_extract_intrinsic_test_epi16(__m512i m, int lane) {
49+
return mm512_extract(m, 512, 16, lane)
50+
}
51+
52+
int mm512_extract_intrinsic_test_epi64(__m512i m, int lane) {
53+
return mm512_extract(m, 512, 64, lane)
54+
}
55+
"#;
56+
1757
pub const X86_CONFIGURATIONS: &str = r#"
1858
#![cfg_attr(target_arch = "x86", feature(stdarch_x86_avx512_bf16))]
1959
#![cfg_attr(target_arch = "x86", feature(stdarch_x86_avx512_f16))]

crates/intrinsic-test/src/x86/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use crate::common::gen_rust::{
1717
use crate::common::intrinsic::{Intrinsic, IntrinsicDefinition};
1818
use crate::common::intrinsic_helpers::TypeKind;
1919
use crate::common::{SupportedArchitectureTest, chunk_info};
20-
use crate::x86::config::{F16_FORMATTING_DEF, X86_CONFIGURATIONS};
20+
use crate::x86::config::{F16_FORMATTING_DEF, LANE_FUNCTION_HELPERS, X86_CONFIGURATIONS};
2121
use config::build_notices;
2222
use intrinsic::X86IntrinsicType;
2323
use xml_parser::get_xml_intrinsics;
@@ -137,7 +137,7 @@ impl SupportedArchitectureTest for X86ArchitectureTest {
137137
&mut main_rs,
138138
chunk_count,
139139
X86_CONFIGURATIONS,
140-
"",
140+
LANE_FUNCTION_HELPERS,
141141
self.intrinsics.iter().map(|i| i.name.as_str()),
142142
)
143143
.unwrap();

crates/intrinsic-test/src/x86/types.rs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,29 @@ impl IntrinsicTypeDefinition for X86IntrinsicType {
121121

122122
/// Determines the get lane function for this type.
123123
fn get_lane_function(&self) -> String {
124-
todo!("get_lane_function for X86IntrinsicType needs to be implemented!");
124+
let total_vector_bits: Option<u32> = self
125+
.vec_len
126+
.zip(self.bit_len)
127+
.and_then(|(vec_len, bit_len)| Some(vec_len * bit_len));
128+
129+
match (self.bit_len, total_vector_bits) {
130+
(Some(8), Some(128)) => String::from("_mm_extract_epi8"),
131+
(Some(16), Some(128)) => String::from("_mm_extract_epi16"),
132+
(Some(32), Some(128)) => String::from("_mm_extract_epi32"),
133+
(Some(64), Some(128)) => String::from("_mm_extract_epi64"),
134+
(Some(8), Some(256)) => String::from("_mm256_extract_epi8"),
135+
(Some(16), Some(256)) => String::from("_mm256_extract_epi16"),
136+
(Some(32), Some(256)) => String::from("_mm256_extract_epi32"),
137+
(Some(64), Some(256)) => String::from("_mm256_extract_epi64"),
138+
(Some(8), Some(512)) => String::from("_mm512_extract_intrinsic_test_epi8"),
139+
(Some(16), Some(512)) => String::from("_mm512_extract_intrinsic_test_epi16"),
140+
(Some(32), Some(512)) => String::from("_mm512_extract_intrinsic_test_epi32"),
141+
(Some(64), Some(512)) => String::from("_mm512_extract_intrinsic_test_epi64"),
142+
_ => unreachable!(
143+
"invalid length for vector argument: {:?}, {:?}",
144+
self.bit_len, self.vec_len
145+
),
146+
}
125147
}
126148
}
127149

0 commit comments

Comments
 (0)