@@ -637,3 +637,112 @@ define void @test_psslai_h(ptr %ret_ptr, ptr %a_ptr) {
637637 store <2 x i16 > %res , ptr %ret_ptr
638638 ret void
639639}
640+
641+ ; Test logical shift left(scalar shamt)
642+ define void @test_psll_hs (ptr %ret_ptr , ptr %a_ptr , i16 %shamt ) {
643+ ; CHECK-LABEL: test_psll_hs:
644+ ; CHECK: # %bb.0:
645+ ; CHECK-NEXT: lw a1, 0(a1)
646+ ; CHECK-NEXT: psll.hs a1, a1, a2
647+ ; CHECK-NEXT: sw a1, 0(a0)
648+ ; CHECK-NEXT: ret
649+ %a = load <2 x i16 >, ptr %a_ptr
650+ %insert = insertelement <2 x i16 > poison, i16 %shamt , i32 0
651+ %b = shufflevector <2 x i16 > %insert , <2 x i16 > poison, <2 x i32 > zeroinitializer
652+ %res = shl <2 x i16 > %a , %b
653+ store <2 x i16 > %res , ptr %ret_ptr
654+ ret void
655+ }
656+
657+ define void @test_psll_bs (ptr %ret_ptr , ptr %a_ptr , i8 %shamt ) {
658+ ; CHECK-LABEL: test_psll_bs:
659+ ; CHECK: # %bb.0:
660+ ; CHECK-NEXT: lw a1, 0(a1)
661+ ; CHECK-NEXT: psll.bs a1, a1, a2
662+ ; CHECK-NEXT: sw a1, 0(a0)
663+ ; CHECK-NEXT: ret
664+ %a = load <4 x i8 >, ptr %a_ptr
665+ %insert = insertelement <4 x i8 > poison, i8 %shamt , i32 0
666+ %b = shufflevector <4 x i8 > %insert , <4 x i8 > poison, <4 x i32 > zeroinitializer
667+ %res = shl <4 x i8 > %a , %b
668+ store <4 x i8 > %res , ptr %ret_ptr
669+ ret void
670+ }
671+
672+ ; Test logical shift left(vector shamt)
673+ define void @test_psll_hs_vec_shamt (ptr %ret_ptr , ptr %a_ptr , ptr %shamt_ptr ) {
674+ ; CHECK-RV32-LABEL: test_psll_hs_vec_shamt:
675+ ; CHECK-RV32: # %bb.0:
676+ ; CHECK-RV32-NEXT: lw a1, 0(a1)
677+ ; CHECK-RV32-NEXT: lw a2, 0(a2)
678+ ; CHECK-RV32-NEXT: sll a3, a1, a2
679+ ; CHECK-RV32-NEXT: srli a2, a2, 16
680+ ; CHECK-RV32-NEXT: srli a1, a1, 16
681+ ; CHECK-RV32-NEXT: sll a1, a1, a2
682+ ; CHECK-RV32-NEXT: pack a1, a3, a1
683+ ; CHECK-RV32-NEXT: sw a1, 0(a0)
684+ ; CHECK-RV32-NEXT: ret
685+ ;
686+ ; CHECK-RV64-LABEL: test_psll_hs_vec_shamt:
687+ ; CHECK-RV64: # %bb.0:
688+ ; CHECK-RV64-NEXT: lw a1, 0(a1)
689+ ; CHECK-RV64-NEXT: lw a2, 0(a2)
690+ ; CHECK-RV64-NEXT: sll a3, a1, a2
691+ ; CHECK-RV64-NEXT: srli a2, a2, 16
692+ ; CHECK-RV64-NEXT: srli a1, a1, 16
693+ ; CHECK-RV64-NEXT: sll a1, a1, a2
694+ ; CHECK-RV64-NEXT: ppack.w a1, a3, a1
695+ ; CHECK-RV64-NEXT: sw a1, 0(a0)
696+ ; CHECK-RV64-NEXT: ret
697+ %a = load <2 x i16 >, ptr %a_ptr
698+ %b = load <2 x i16 >, ptr %shamt_ptr
699+ %res = shl <2 x i16 > %a , %b
700+ store <2 x i16 > %res , ptr %ret_ptr
701+ ret void
702+ }
703+
704+ define void @test_psll_bs_vec_shamt (ptr %ret_ptr , ptr %a_ptr , ptr %shamt_ptr ) {
705+ ; CHECK-RV32-LABEL: test_psll_bs_vec_shamt:
706+ ; CHECK-RV32: # %bb.0:
707+ ; CHECK-RV32-NEXT: lw a2, 0(a2)
708+ ; CHECK-RV32-NEXT: lw a1, 0(a1)
709+ ; CHECK-RV32-NEXT: srli a3, a2, 24
710+ ; CHECK-RV32-NEXT: srli a4, a1, 24
711+ ; CHECK-RV32-NEXT: srli a5, a2, 8
712+ ; CHECK-RV32-NEXT: srli a6, a1, 8
713+ ; CHECK-RV32-NEXT: sll a7, a4, a3
714+ ; CHECK-RV32-NEXT: sll a6, a6, a5
715+ ; CHECK-RV32-NEXT: sll a4, a1, a2
716+ ; CHECK-RV32-NEXT: srli a2, a2, 16
717+ ; CHECK-RV32-NEXT: srli a1, a1, 16
718+ ; CHECK-RV32-NEXT: sll a5, a1, a2
719+ ; CHECK-RV32-NEXT: ppack.dh a2, a4, a6
720+ ; CHECK-RV32-NEXT: pack a1, a2, a3
721+ ; CHECK-RV32-NEXT: sw a1, 0(a0)
722+ ; CHECK-RV32-NEXT: ret
723+ ;
724+ ; CHECK-RV64-LABEL: test_psll_bs_vec_shamt:
725+ ; CHECK-RV64: # %bb.0:
726+ ; CHECK-RV64-NEXT: lw a2, 0(a2)
727+ ; CHECK-RV64-NEXT: lw a1, 0(a1)
728+ ; CHECK-RV64-NEXT: srli a3, a2, 24
729+ ; CHECK-RV64-NEXT: srli a4, a1, 24
730+ ; CHECK-RV64-NEXT: srli a5, a2, 16
731+ ; CHECK-RV64-NEXT: sll a3, a4, a3
732+ ; CHECK-RV64-NEXT: srli a4, a1, 16
733+ ; CHECK-RV64-NEXT: sll a4, a4, a5
734+ ; CHECK-RV64-NEXT: sll a5, a1, a2
735+ ; CHECK-RV64-NEXT: srli a2, a2, 8
736+ ; CHECK-RV64-NEXT: srli a1, a1, 8
737+ ; CHECK-RV64-NEXT: sll a1, a1, a2
738+ ; CHECK-RV64-NEXT: ppack.h a2, a4, a3
739+ ; CHECK-RV64-NEXT: ppack.h a1, a5, a1
740+ ; CHECK-RV64-NEXT: ppack.w a1, a1, a2
741+ ; CHECK-RV64-NEXT: sw a1, 0(a0)
742+ ; CHECK-RV64-NEXT: ret
743+ %a = load <4 x i8 >, ptr %a_ptr
744+ %b = load <4 x i8 >, ptr %shamt_ptr
745+ %res = shl <4 x i8 > %a , %b
746+ store <4 x i8 > %res , ptr %ret_ptr
747+ ret void
748+ }
0 commit comments