@@ -583,26 +583,66 @@ pub unsafe fn _mm256_cvtepi8_epi32(a: i8x16) -> i32x8 {
583583    simd_cast :: < :: v64:: i8x8 ,  _ > ( simd_shuffle8 ( a,  a,  [ 0 ,  1 ,  2 ,  3 ,  4 ,  5 ,  6 ,  7 ] ) ) 
584584} 
585585
586- /// An i8x4 type is pretty useless, but we need it as an intermediate type in 
587- /// _mm256_cvtepi8_epi64. 
588- #[ repr( simd) ]  
589- #[ allow( non_camel_case_types) ]  
590- struct  i8x4 ( i8 ,  i8 ,  i8 ,  i8 ) ; 
591- 
592586/// Sign-extend 8-bit integers to 64-bit integers. 
593587#[ inline( always) ]  
594588#[ target_feature = "+avx2" ]  
595589#[ cfg_attr( test,  assert_instr( vpmovsxbq) ) ]  
596590pub  unsafe  fn  _mm256_cvtepi8_epi64 ( a :  i8x16 )  -> i64x4  { 
597-     simd_cast :: < i8x4 ,  _ > ( simd_shuffle4 ( a,  a,  [ 0 ,  1 ,  2 ,  3 ] ) ) 
591+     simd_cast :: < :: v32:: i8x4 ,  _ > ( simd_shuffle4 ( a,  a,  [ 0 ,  1 ,  2 ,  3 ] ) ) 
592+ } 
593+ 
594+ /// Zero-extend the lower four unsigned 16-bit integers in `a` to 32-bit 
595+ /// integers. The upper four elements of `a` are unused. 
596+ #[ inline( always) ]  
597+ #[ target_feature = "+avx2" ]  
598+ #[ cfg_attr( test,  assert_instr( vpmovzxwd) ) ]  
599+ pub  unsafe  fn  _mm256_cvtepu16_epi32 ( a :  u16x8 )  -> i32x8  { 
600+     simd_cast ( a) 
601+ } 
602+ 
603+ /// Zero-extend the lower four unsigned 16-bit integers in `a` to 64-bit 
604+ /// integers. The upper four elements of `a` are unused. 
605+ #[ inline( always) ]  
606+ #[ target_feature = "+avx2" ]  
607+ #[ cfg_attr( test,  assert_instr( vpmovzxwq) ) ]  
608+ pub  unsafe  fn  _mm256_cvtepu16_epi64 ( a :  u16x8 )  -> i64x4  { 
609+     simd_cast :: < :: v64:: u16x4 ,  _ > ( simd_shuffle4 ( a,  a,  [ 0 ,  1 ,  2 ,  3 ] ) ) 
610+ } 
611+ 
612+ /// Zero-extend unsigned 32-bit integers in `a` to 64-bit integers. 
613+ #[ inline( always) ]  
614+ #[ target_feature = "+avx2" ]  
615+ #[ cfg_attr( test,  assert_instr( vpmovzxdq) ) ]  
616+ pub  unsafe  fn  _mm256_cvtepu32_epi64 ( a :  u32x4 )  -> i64x4  { 
617+     simd_cast ( a) 
618+ } 
619+ 
620+ /// Zero-extend unsigned 8-bit integers in `a` to 16-bit integers. 
621+ #[ inline( always) ]  
622+ #[ target_feature = "+avx2" ]  
623+ #[ cfg_attr( test,  assert_instr( vpmovzxbw) ) ]  
624+ pub  unsafe  fn  _mm256_cvtepu8_epi16 ( a :  u8x16 )  -> i16x16  { 
625+     simd_cast ( a) 
626+ } 
627+ 
628+ /// Zero-extend the lower eight unsigned 8-bit integers in `a` to 32-bit 
629+ /// integers. The upper eight elements of `a` are unused. 
630+ #[ inline( always) ]  
631+ #[ target_feature = "+avx2" ]  
632+ #[ cfg_attr( test,  assert_instr( vpmovzxbd) ) ]  
633+ pub  unsafe  fn  _mm256_cvtepu8_epi32 ( a :  u8x16 )  -> i32x8  { 
634+     simd_cast :: < :: v64:: u8x8 ,  _ > ( simd_shuffle8 ( a,  a,  [ 0 ,  1 ,  2 ,  3 ,  4 ,  5 ,  6 ,  7 ] ) ) 
635+ } 
636+ 
637+ /// Zero-extend the lower four unsigned 8-bit integers in `a` to 64-bit 
638+ /// integers. The upper twelve elements of `a` are unused. 
639+ #[ inline( always) ]  
640+ #[ target_feature = "+avx2" ]  
641+ #[ cfg_attr( test,  assert_instr( vpmovzxbq) ) ]  
642+ pub  unsafe  fn  _mm256_cvtepu8_epi64 ( a :  u8x16 )  -> i64x4  { 
643+     simd_cast :: < :: v32:: u8x4 ,  _ > ( simd_shuffle4 ( a,  a,  [ 0 ,  1 ,  2 ,  3 ] ) ) 
598644} 
599645
600- // TODO _mm256_cvtepu16_epi32 
601- // TODO _mm256_cvtepu16_epi64 
602- // TODO _mm256_cvtepu32_epi64 
603- // TODO _mm256_cvtepu8_epi16 
604- // TODO _mm256_cvtepu8_epi32 
605- // TODO _mm256_cvtepu8_epi64 
606646// TODO _m128i _mm256_extracti128_si256 
607647
608648/// Horizontally add adjacent pairs of 16-bit integers in `a` and `b`. 
@@ -2738,6 +2778,52 @@ mod tests {
27382778        assert_eq ! ( r,  avx2:: _mm256_cvtepi32_epi64( a) ) ; 
27392779    } 
27402780
2781+     #[ simd_test = "avx2" ]  
2782+     unsafe  fn  _mm256_cvtepu16_epi32 ( )  { 
2783+         let  a = u16x8:: new ( 0 ,  1 ,  2 ,  3 ,  4 ,  5 ,  6 ,  7 ) ; 
2784+         let  r = i32x8:: new ( 0 ,  1 ,  2 ,  3 ,  4 ,  5 ,  6 ,  7 ) ; 
2785+         assert_eq ! ( r,  avx2:: _mm256_cvtepu16_epi32( a) ) ; 
2786+     } 
2787+ 
2788+     #[ simd_test = "avx2" ]  
2789+     unsafe  fn  _mm256_cvtepu16_epi64 ( )  { 
2790+         let  a = u16x8:: new ( 0 ,  1 ,  2 ,  3 ,  4 ,  5 ,  6 ,  7 ) ; 
2791+         let  r = i64x4:: new ( 0 ,  1 ,  2 ,  3 ) ; 
2792+         assert_eq ! ( r,  avx2:: _mm256_cvtepu16_epi64( a) ) ; 
2793+     } 
2794+ 
2795+     #[ simd_test = "avx2" ]  
2796+     unsafe  fn  _mm256_cvtepu32_epi64 ( )  { 
2797+         let  a = u32x4:: new ( 0 ,  1 ,  2 ,  3 ) ; 
2798+         let  r = i64x4:: new ( 0 ,  1 ,  2 ,  3 ) ; 
2799+         assert_eq ! ( r,  avx2:: _mm256_cvtepu32_epi64( a) ) ; 
2800+     } 
2801+ 
2802+     #[ simd_test = "avx2" ]  
2803+     unsafe  fn  _mm256_cvtepu8_epi16 ( )  { 
2804+         let  a =
2805+             u8x16:: new ( 0 ,  1 ,  2 ,  3 ,  4 ,  5 ,  6 ,  7 ,  8 ,  9 ,  10 ,  11 ,  12 ,  13 ,  14 ,  15 ) ; 
2806+         let  r =
2807+             i16x16:: new ( 0 ,  1 ,  2 ,  3 ,  4 ,  5 ,  6 ,  7 ,  8 ,  9 ,  10 ,  11 ,  12 ,  13 ,  14 ,  15 ) ; 
2808+         assert_eq ! ( r,  avx2:: _mm256_cvtepu8_epi16( a) ) ; 
2809+     } 
2810+ 
2811+     #[ simd_test = "avx2" ]  
2812+     unsafe  fn  _mm256_cvtepu8_epi32 ( )  { 
2813+         let  a =
2814+             u8x16:: new ( 0 ,  1 ,  2 ,  3 ,  4 ,  5 ,  6 ,  7 ,  8 ,  9 ,  10 ,  11 ,  12 ,  13 ,  14 ,  15 ) ; 
2815+         let  r = i32x8:: new ( 0 ,  1 ,  2 ,  3 ,  4 ,  5 ,  6 ,  7 ) ; 
2816+         assert_eq ! ( r,  avx2:: _mm256_cvtepu8_epi32( a) ) ; 
2817+     } 
2818+ 
2819+     #[ simd_test = "avx2" ]  
2820+     unsafe  fn  _mm256_cvtepu8_epi64 ( )  { 
2821+         let  a =
2822+             u8x16:: new ( 0 ,  1 ,  2 ,  3 ,  4 ,  5 ,  6 ,  7 ,  8 ,  9 ,  10 ,  11 ,  12 ,  13 ,  14 ,  15 ) ; 
2823+         let  r = i64x4:: new ( 0 ,  1 ,  2 ,  3 ) ; 
2824+         assert_eq ! ( r,  avx2:: _mm256_cvtepu8_epi64( a) ) ; 
2825+     } 
2826+ 
27412827    #[ simd_test = "avx2" ]  
27422828    unsafe  fn  _mm256_hadd_epi16 ( )  { 
27432829        let  a = i16x16:: splat ( 2 ) ; 
0 commit comments