@@ -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