@@ -82,3 +82,43 @@ extern "C" fn test_sllv_srlv(win: __m512i, x: __m512i, v: __m512i) -> __m512i {
8282 let w = _mm512_or_si512 ( win, _mm512_sllv_epi16 ( x, v) ) ;
8383 _mm512_srlv_epi16 ( w, _mm512_and_si512 ( w, _mm512_set1_epi16 ( 7 ) ) )
8484}
85+
86+ // See <https://github.com/rust-lang/rust/issues/159474> for context.
87+ // CHECK-LABEL: test_mulhi_loop:
88+ #[ no_mangle]
89+ #[ target_feature( enable = "sse2" ) ]
90+ extern "C" fn test_mulhi_loop ( buf : & mut [ __m128i ] , factor : i16 ) {
91+ // CHECK: .cfi_startproc
92+ let factor = _mm_set1_epi16 ( factor) ;
93+ // CHECK-NOT: pmuludq
94+ // CHECK: pmulhuw
95+ // CHECK-NOT: pmuludq
96+ for i in 0 ..buf. len ( ) {
97+ buf[ i] = _mm_mulhi_epu16 ( buf[ i] , factor) ;
98+ }
99+ // CHECK: ret
100+ }
101+
102+ // CHECK-LABEL: mul_and_shift:
103+ #[ no_mangle]
104+ #[ target_feature( enable = "sse2" ) ]
105+ extern "C" fn mul_and_shift ( a : __m128i , b : __m128i ) -> __m128i {
106+ // CHECK: .cfi_startproc
107+ // CHECK-NEXT: pmulhuw
108+ // CHECK-NEXT: psrlw
109+ // CHECK-NEXT: ret
110+ unsafe { _mm_srli_epi16 ( _mm_mulhi_epu16 ( a, b) , 1 ) }
111+ }
112+
113+ // See <https://github.com/rust-lang/rust/issues/130782> for context.
114+ // CHECK-LABEL: test_mulhi:
115+ #[ no_mangle]
116+ #[ target_feature( enable = "avx2" ) ]
117+ extern "C" fn test_mulhi ( a : __m256i ) -> __m256i {
118+ // CHECK: .cfi_startproc
119+ // CHECK-NEXT: vpand
120+ // CHECK-NEXT: vpmulhw
121+ // CHECK-NEXT: ret
122+ let a = _mm256_and_si256 ( a, _mm256_set1_epi16 ( 0x7FFF ) ) ;
123+ _mm256_mulhi_epi16 ( a, _mm256_set1_epi16 ( 1000 ) )
124+ }
0 commit comments