@@ -357,6 +357,7 @@ impl_sv!("lasx", lasx_xvrepli_b, simd_ext_splat, m256i, i8x32, 10);
357357impl_sv ! ( "lasx" , lasx_xvrepli_h, simd_ext_splat, m256i, i16x16, 10 ) ;
358358impl_sv ! ( "lasx" , lasx_xvrepli_w, simd_ext_splat, m256i, i32x8, 10 ) ;
359359impl_sv ! ( "lasx" , lasx_xvrepli_d, simd_ext_splat, m256i, i64x4, 10 ) ;
360+ impl_sv ! ( "lasx" , lasx_xvldi, simd_ext_ldi, m256i, i64x4, 13 , const ) ;
360361
361362impl_vvv ! ( "lasx" , lasx_xvadd_b, simd_add, m256i, i8x32) ;
362363impl_vvv ! ( "lasx" , lasx_xvadd_h, simd_add, m256i, i16x16) ;
@@ -618,3 +619,186 @@ impl_vvvv!("lasx", lasx_xvfnmsub_d, simd_ext_fnmsub, m256d, f64x4);
618619
619620impl_vugv ! ( "lasx" , lasx_xvinsgr2vr_w, simd_insert, m256i, i32x8, i32 , 3 ) ;
620621impl_vugv ! ( "lasx" , lasx_xvinsgr2vr_d, simd_insert, m256i, i64x4, i64 , 2 ) ;
622+
623+ #[ cfg( test) ]
624+ mod tests {
625+ use crate :: {
626+ core_arch:: { loongarch64:: * , simd:: * } ,
627+ mem:: transmute,
628+ } ;
629+ use stdarch_test:: simd_test;
630+
631+ #[ simd_test( enable = "lasx" ) ]
632+ unsafe fn xvldi ( ) {
633+ let r = i8x32:: new (
634+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
635+ 0 , 0 , 0 ,
636+ ) ;
637+ assert_eq ! ( r, transmute( lasx_xvldi:: <0 >( ) ) ) ;
638+ let r = i8x32:: new (
639+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
640+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
641+ ) ;
642+ assert_eq ! ( r, transmute( lasx_xvldi:: <255 >( ) ) ) ;
643+ let r = i8x32:: new (
644+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
645+ 0 , 0 , 0 ,
646+ ) ;
647+ assert_eq ! ( r, transmute( lasx_xvldi:: <1024 >( ) ) ) ;
648+ let r = i8x32:: new (
649+ 0 , -2 , 0 , -2 , 0 , -2 , 0 , -2 , 0 , -2 , 0 , -2 , 0 , -2 , 0 , -2 , 0 , -2 , 0 , -2 , 0 , -2 , 0 , -2 , 0 ,
650+ -2 , 0 , -2 , 0 , -2 , 0 , -2 ,
651+ ) ;
652+ assert_eq ! ( r, transmute( lasx_xvldi:: <1536 >( ) ) ) ;
653+ let r = i8x32:: new (
654+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
655+ 0 , 0 , 0 ,
656+ ) ;
657+ assert_eq ! ( r, transmute( lasx_xvldi:: <2048 >( ) ) ) ;
658+ let r = i8x32:: new (
659+ 0 , -2 , -1 , -1 , 0 , -2 , -1 , -1 , 0 , -2 , -1 , -1 , 0 , -2 , -1 , -1 , 0 , -2 , -1 , -1 , 0 , -2 , -1 ,
660+ -1 , 0 , -2 , -1 , -1 , 0 , -2 , -1 , -1 ,
661+ ) ;
662+ assert_eq ! ( r, transmute( lasx_xvldi:: <2560 >( ) ) ) ;
663+ let r = i8x32:: new (
664+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
665+ 0 , 0 , 0 ,
666+ ) ;
667+ assert_eq ! ( r, transmute( lasx_xvldi:: <3072 >( ) ) ) ;
668+ let r = i8x32:: new (
669+ 0 , -2 , -1 , -1 , -1 , -1 , -1 , -1 , 0 , -2 , -1 , -1 , -1 , -1 , -1 , -1 , 0 , -2 , -1 , -1 , -1 , -1 ,
670+ -1 , -1 , 0 , -2 , -1 , -1 , -1 , -1 , -1 , -1 ,
671+ ) ;
672+ assert_eq ! ( r, transmute( lasx_xvldi:: <3584 >( ) ) ) ;
673+ let r = i8x32:: new (
674+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
675+ 0 , 0 , 0 ,
676+ ) ;
677+ assert_eq ! ( r, transmute( lasx_xvldi:: <-4096 >( ) ) ) ;
678+ let r = i8x32:: new (
679+ -128 , 0 , 0 , 0 , -128 , 0 , 0 , 0 , -128 , 0 , 0 , 0 , -128 , 0 , 0 , 0 , -128 , 0 , 0 , 0 , -128 , 0 , 0 ,
680+ 0 , -128 , 0 , 0 , 0 , -128 , 0 , 0 , 0 ,
681+ ) ;
682+ assert_eq ! ( r, transmute( lasx_xvldi:: <-3968 >( ) ) ) ;
683+ let r = i8x32:: new (
684+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
685+ 0 , 0 , 0 ,
686+ ) ;
687+ assert_eq ! ( r, transmute( lasx_xvldi:: <-3840 >( ) ) ) ;
688+ let r = i8x32:: new (
689+ 0 , -128 , 0 , 0 , 0 , -128 , 0 , 0 , 0 , -128 , 0 , 0 , 0 , -128 , 0 , 0 , 0 , -128 , 0 , 0 , 0 , -128 , 0 ,
690+ 0 , 0 , -128 , 0 , 0 , 0 , -128 , 0 , 0 ,
691+ ) ;
692+ assert_eq ! ( r, transmute( lasx_xvldi:: <-3712 >( ) ) ) ;
693+ let r = i8x32:: new (
694+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
695+ 0 , 0 , 0 ,
696+ ) ;
697+ assert_eq ! ( r, transmute( lasx_xvldi:: <-3584 >( ) ) ) ;
698+ let r = i8x32:: new (
699+ 0 , 0 , -128 , 0 , 0 , 0 , -128 , 0 , 0 , 0 , -128 , 0 , 0 , 0 , -128 , 0 , 0 , 0 , -128 , 0 , 0 , 0 , -128 ,
700+ 0 , 0 , 0 , -128 , 0 , 0 , 0 , -128 , 0 ,
701+ ) ;
702+ assert_eq ! ( r, transmute( lasx_xvldi:: <-3456 >( ) ) ) ;
703+ let r = i8x32:: new (
704+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
705+ 0 , 0 , 0 ,
706+ ) ;
707+ assert_eq ! ( r, transmute( lasx_xvldi:: <-3328 >( ) ) ) ;
708+ let r = i8x32:: new (
709+ 0 , 0 , 0 , -128 , 0 , 0 , 0 , -128 , 0 , 0 , 0 , -128 , 0 , 0 , 0 , -128 , 0 , 0 , 0 , -128 , 0 , 0 , 0 ,
710+ -128 , 0 , 0 , 0 , -128 , 0 , 0 , 0 , -128 ,
711+ ) ;
712+ assert_eq ! ( r, transmute( lasx_xvldi:: <-3200 >( ) ) ) ;
713+ let r = i8x32:: new (
714+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
715+ 0 , 0 , 0 ,
716+ ) ;
717+ assert_eq ! ( r, transmute( lasx_xvldi:: <-3072 >( ) ) ) ;
718+ let r = i8x32:: new (
719+ -128 , 0 , -128 , 0 , -128 , 0 , -128 , 0 , -128 , 0 , -128 , 0 , -128 , 0 , -128 , 0 , -128 , 0 , -128 ,
720+ 0 , -128 , 0 , -128 , 0 , -128 , 0 , -128 , 0 , -128 , 0 , -128 , 0 ,
721+ ) ;
722+ assert_eq ! ( r, transmute( lasx_xvldi:: <-2944 >( ) ) ) ;
723+ let r = i8x32:: new (
724+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
725+ 0 , 0 , 0 ,
726+ ) ;
727+ assert_eq ! ( r, transmute( lasx_xvldi:: <-2816 >( ) ) ) ;
728+ let r = i8x32:: new (
729+ 0 , -128 , 0 , -128 , 0 , -128 , 0 , -128 , 0 , -128 , 0 , -128 , 0 , -128 , 0 , -128 , 0 , -128 , 0 ,
730+ -128 , 0 , -128 , 0 , -128 , 0 , -128 , 0 , -128 , 0 , -128 , 0 , -128 ,
731+ ) ;
732+ assert_eq ! ( r, transmute( lasx_xvldi:: <-2688 >( ) ) ) ;
733+ let r = i8x32:: new (
734+ -1 , 0 , 0 , 0 , -1 , 0 , 0 , 0 , -1 , 0 , 0 , 0 , -1 , 0 , 0 , 0 , -1 , 0 , 0 , 0 , -1 , 0 , 0 , 0 , -1 , 0 , 0 ,
735+ 0 , -1 , 0 , 0 , 0 ,
736+ ) ;
737+ assert_eq ! ( r, transmute( lasx_xvldi:: <-2560 >( ) ) ) ;
738+ let r = i8x32:: new (
739+ -1 , -128 , 0 , 0 , -1 , -128 , 0 , 0 , -1 , -128 , 0 , 0 , -1 , -128 , 0 , 0 , -1 , -128 , 0 , 0 , -1 ,
740+ -128 , 0 , 0 , -1 , -128 , 0 , 0 , -1 , -128 , 0 , 0 ,
741+ ) ;
742+ assert_eq ! ( r, transmute( lasx_xvldi:: <-2432 >( ) ) ) ;
743+ let r = i8x32:: new (
744+ -1 , -1 , 0 , 0 , -1 , -1 , 0 , 0 , -1 , -1 , 0 , 0 , -1 , -1 , 0 , 0 , -1 , -1 , 0 , 0 , -1 , -1 , 0 , 0 , -1 ,
745+ -1 , 0 , 0 , -1 , -1 , 0 , 0 ,
746+ ) ;
747+ assert_eq ! ( r, transmute( lasx_xvldi:: <-2304 >( ) ) ) ;
748+ let r = i8x32:: new (
749+ -1 , -1 , -128 , 0 , -1 , -1 , -128 , 0 , -1 , -1 , -128 , 0 , -1 , -1 , -128 , 0 , -1 , -1 , -128 , 0 ,
750+ -1 , -1 , -128 , 0 , -1 , -1 , -128 , 0 , -1 , -1 , -128 , 0 ,
751+ ) ;
752+ assert_eq ! ( r, transmute( lasx_xvldi:: <-2176 >( ) ) ) ;
753+ let r = i8x32:: new (
754+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
755+ 0 , 0 , 0 ,
756+ ) ;
757+ assert_eq ! ( r, transmute( lasx_xvldi:: <-2048 >( ) ) ) ;
758+ let r = i8x32:: new (
759+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
760+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
761+ ) ;
762+ assert_eq ! ( r, transmute( lasx_xvldi:: <-1793 >( ) ) ) ;
763+ let r = i8x32:: new (
764+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
765+ 0 , 0 , 0 ,
766+ ) ;
767+ assert_eq ! ( r, transmute( lasx_xvldi:: <-1792 >( ) ) ) ;
768+ let r = i8x32:: new (
769+ 0 , -1 , 0 , -1 , 0 , -1 , 0 , -1 , 0 , -1 , 0 , -1 , 0 , -1 , 0 , -1 , 0 , -1 , 0 , -1 , 0 , -1 , 0 , -1 , 0 ,
770+ -1 , 0 , -1 , 0 , -1 , 0 , -1 ,
771+ ) ;
772+ assert_eq ! ( r, transmute( lasx_xvldi:: <-1622 >( ) ) ) ;
773+ let r = i8x32:: new (
774+ 0 , 0 , 0 , 64 , 0 , 0 , 0 , 64 , 0 , 0 , 0 , 64 , 0 , 0 , 0 , 64 , 0 , 0 , 0 , 64 , 0 , 0 , 0 , 64 , 0 , 0 , 0 ,
775+ 64 , 0 , 0 , 0 , 64 ,
776+ ) ;
777+ assert_eq ! ( r, transmute( lasx_xvldi:: <-1536 >( ) ) ) ;
778+ let r = i8x32:: new (
779+ 0 , 0 , 80 , -63 , 0 , 0 , 80 , -63 , 0 , 0 , 80 , -63 , 0 , 0 , 80 , -63 , 0 , 0 , 80 , -63 , 0 , 0 , 80 ,
780+ -63 , 0 , 0 , 80 , -63 , 0 , 0 , 80 , -63 ,
781+ ) ;
782+ assert_eq ! ( r, transmute( lasx_xvldi:: <-1366 >( ) ) ) ;
783+ let r = i8x32:: new (
784+ 0 , 0 , 0 , 64 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 64 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 64 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 64 ,
785+ 0 , 0 , 0 , 0 ,
786+ ) ;
787+ assert_eq ! ( r, transmute( lasx_xvldi:: <-1280 >( ) ) ) ;
788+ let r = i8x32:: new (
789+ 0 , 0 , 80 , -63 , 0 , 0 , 0 , 0 , 0 , 0 , 80 , -63 , 0 , 0 , 0 , 0 , 0 , 0 , 80 , -63 , 0 , 0 , 0 , 0 , 0 , 0 ,
790+ 80 , -63 , 0 , 0 , 0 , 0 ,
791+ ) ;
792+ assert_eq ! ( r, transmute( lasx_xvldi:: <-1110 >( ) ) ) ;
793+ let r = i8x32:: new (
794+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 64 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 64 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 64 , 0 , 0 , 0 , 0 ,
795+ 0 , 0 , 0 , 64 ,
796+ ) ;
797+ assert_eq ! ( r, transmute( lasx_xvldi:: <-1024 >( ) ) ) ;
798+ let r = i8x32:: new (
799+ 0 , 0 , 0 , 0 , 0 , 0 , 42 , -64 , 0 , 0 , 0 , 0 , 0 , 0 , 42 , -64 , 0 , 0 , 0 , 0 , 0 , 0 , 42 , -64 , 0 , 0 ,
800+ 0 , 0 , 0 , 0 , 42 , -64 ,
801+ ) ;
802+ assert_eq ! ( r, transmute( lasx_xvldi:: <-854 >( ) ) ) ;
803+ }
804+ }
0 commit comments