@@ -407,13 +407,18 @@ fn define_simd(
407
407
let umax = insts. by_name ( "umax" ) ;
408
408
let umin = insts. by_name ( "umin" ) ;
409
409
let snarrow = insts. by_name ( "snarrow" ) ;
410
+ let swiden_high = insts. by_name ( "swiden_high" ) ;
411
+ let swiden_low = insts. by_name ( "swiden_low" ) ;
410
412
let ushr_imm = insts. by_name ( "ushr_imm" ) ;
411
413
let ushr = insts. by_name ( "ushr" ) ;
414
+ let uwiden_high = insts. by_name ( "uwiden_high" ) ;
415
+ let uwiden_low = insts. by_name ( "uwiden_low" ) ;
412
416
let vconst = insts. by_name ( "vconst" ) ;
413
417
let vall_true = insts. by_name ( "vall_true" ) ;
414
418
let vany_true = insts. by_name ( "vany_true" ) ;
415
419
let vselect = insts. by_name ( "vselect" ) ;
416
420
421
+ let x86_palignr = x86_instructions. by_name ( "x86_palignr" ) ;
417
422
let x86_pmaxs = x86_instructions. by_name ( "x86_pmaxs" ) ;
418
423
let x86_pmaxu = x86_instructions. by_name ( "x86_pmaxu" ) ;
419
424
let x86_pmins = x86_instructions. by_name ( "x86_pmins" ) ;
@@ -786,6 +791,26 @@ fn define_simd(
786
791
) ;
787
792
}
788
793
794
+ // SIMD widen
795
+ for ty in & [ I8 , I16 ] {
796
+ let swiden_high = swiden_high. bind ( vector ( * ty, sse_vector_size) ) ;
797
+ narrow. legalize (
798
+ def ! ( b = swiden_high( a) ) ,
799
+ vec ! [
800
+ def!( c = x86_palignr( a, a, uimm8_eight) ) ,
801
+ def!( b = swiden_low( c) ) ,
802
+ ] ,
803
+ ) ;
804
+ let uwiden_high = uwiden_high. bind ( vector ( * ty, sse_vector_size) ) ;
805
+ narrow. legalize (
806
+ def ! ( b = uwiden_high( a) ) ,
807
+ vec ! [
808
+ def!( c = x86_palignr( a, a, uimm8_eight) ) ,
809
+ def!( b = uwiden_low( c) ) ,
810
+ ] ,
811
+ ) ;
812
+ }
813
+
789
814
narrow. custom_legalize ( shuffle, "convert_shuffle" ) ;
790
815
narrow. custom_legalize ( extractlane, "convert_extractlane" ) ;
791
816
narrow. custom_legalize ( insertlane, "convert_insertlane" ) ;
0 commit comments