@@ -697,3 +697,194 @@ define i32 @add_nosignbit_select_ashr(i32 %x, i1 %cond, ptr %dst) {
697
697
store i32 %r , ptr %dst
698
698
ret i32 %r
699
699
}
700
+
701
+ define i32 @shl_signbit_select_add (i32 %x , i1 %cond , ptr %dst ) {
702
+ ; X64-LABEL: shl_signbit_select_add:
703
+ ; X64: # %bb.0:
704
+ ; X64-NEXT: movl %edi, %eax
705
+ ; X64-NEXT: shll $4, %eax
706
+ ; X64-NEXT: testb $1, %sil
707
+ ; X64-NEXT: cmovel %edi, %eax
708
+ ; X64-NEXT: addl $123456, %eax # imm = 0x1E240
709
+ ; X64-NEXT: movl %eax, (%rdx)
710
+ ; X64-NEXT: retq
711
+ ;
712
+ ; X86-LABEL: shl_signbit_select_add:
713
+ ; X86: # %bb.0:
714
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
715
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
716
+ ; X86-NEXT: testb $1, {{[0-9]+}}(%esp)
717
+ ; X86-NEXT: je .LBB24_2
718
+ ; X86-NEXT: # %bb.1:
719
+ ; X86-NEXT: shll $4, %eax
720
+ ; X86-NEXT: .LBB24_2:
721
+ ; X86-NEXT: addl $123456, %eax # imm = 0x1E240
722
+ ; X86-NEXT: movl %eax, (%ecx)
723
+ ; X86-NEXT: retl
724
+ %t0 = shl i32 %x , 4
725
+ %t1 = select i1 %cond , i32 %t0 , i32 %x
726
+ %r = add i32 %t1 , 123456
727
+ store i32 %r , ptr %dst
728
+ ret i32 %r
729
+ }
730
+
731
+ define i32 @shl_signbit_select_add_fail (i32 %x , i1 %cond , ptr %dst ) {
732
+ ; X64-LABEL: shl_signbit_select_add_fail:
733
+ ; X64: # %bb.0:
734
+ ; X64-NEXT: movl %edi, %eax
735
+ ; X64-NEXT: shll $4, %eax
736
+ ; X64-NEXT: testb $1, %sil
737
+ ; X64-NEXT: cmovnel %edi, %eax
738
+ ; X64-NEXT: addl $123456, %eax # imm = 0x1E240
739
+ ; X64-NEXT: movl %eax, (%rdx)
740
+ ; X64-NEXT: retq
741
+ ;
742
+ ; X86-LABEL: shl_signbit_select_add_fail:
743
+ ; X86: # %bb.0:
744
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
745
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
746
+ ; X86-NEXT: testb $1, {{[0-9]+}}(%esp)
747
+ ; X86-NEXT: jne .LBB25_2
748
+ ; X86-NEXT: # %bb.1:
749
+ ; X86-NEXT: shll $4, %eax
750
+ ; X86-NEXT: .LBB25_2:
751
+ ; X86-NEXT: addl $123456, %eax # imm = 0x1E240
752
+ ; X86-NEXT: movl %eax, (%ecx)
753
+ ; X86-NEXT: retl
754
+ %t0 = shl i32 %x , 4
755
+ %t1 = select i1 %cond , i32 %x , i32 %t0
756
+ %r = add i32 %t1 , 123456
757
+ store i32 %r , ptr %dst
758
+ ret i32 %r
759
+ }
760
+
761
+ define i32 @lshr_signbit_select_add (i32 %x , i1 %cond , ptr %dst , i32 %y ) {
762
+ ; X64-LABEL: lshr_signbit_select_add:
763
+ ; X64: # %bb.0:
764
+ ; X64-NEXT: movl %edi, %eax
765
+ ; X64-NEXT: # kill: def $cl killed $cl killed $ecx
766
+ ; X64-NEXT: shrl %cl, %eax
767
+ ; X64-NEXT: testb $1, %sil
768
+ ; X64-NEXT: cmovel %edi, %eax
769
+ ; X64-NEXT: addl $123456, %eax # imm = 0x1E240
770
+ ; X64-NEXT: movl %eax, (%rdx)
771
+ ; X64-NEXT: retq
772
+ ;
773
+ ; X86-LABEL: lshr_signbit_select_add:
774
+ ; X86: # %bb.0:
775
+ ; X86-NEXT: pushl %esi
776
+ ; X86-NEXT: .cfi_def_cfa_offset 8
777
+ ; X86-NEXT: .cfi_offset %esi, -8
778
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
779
+ ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
780
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
781
+ ; X86-NEXT: movl %esi, %eax
782
+ ; X86-NEXT: shrl %cl, %eax
783
+ ; X86-NEXT: testb $1, {{[0-9]+}}(%esp)
784
+ ; X86-NEXT: jne .LBB26_2
785
+ ; X86-NEXT: # %bb.1:
786
+ ; X86-NEXT: movl %esi, %eax
787
+ ; X86-NEXT: .LBB26_2:
788
+ ; X86-NEXT: addl $123456, %eax # imm = 0x1E240
789
+ ; X86-NEXT: movl %eax, (%edx)
790
+ ; X86-NEXT: popl %esi
791
+ ; X86-NEXT: .cfi_def_cfa_offset 4
792
+ ; X86-NEXT: retl
793
+ %t0 = lshr i32 %x , %y
794
+ %t1 = select i1 %cond , i32 %t0 , i32 %x
795
+ %r = add i32 %t1 , 123456
796
+ store i32 %r , ptr %dst
797
+ ret i32 %r
798
+ }
799
+
800
+ define i32 @ashr_signbit_select_add (i32 %x , i1 %cond , ptr %dst ) {
801
+ ; X64-LABEL: ashr_signbit_select_add:
802
+ ; X64: # %bb.0:
803
+ ; X64-NEXT: movl %edi, %eax
804
+ ; X64-NEXT: sarl $4, %eax
805
+ ; X64-NEXT: testb $1, %sil
806
+ ; X64-NEXT: cmovel %edi, %eax
807
+ ; X64-NEXT: addl $123456, %eax # imm = 0x1E240
808
+ ; X64-NEXT: movl %eax, (%rdx)
809
+ ; X64-NEXT: retq
810
+ ;
811
+ ; X86-LABEL: ashr_signbit_select_add:
812
+ ; X86: # %bb.0:
813
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
814
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
815
+ ; X86-NEXT: testb $1, {{[0-9]+}}(%esp)
816
+ ; X86-NEXT: je .LBB27_2
817
+ ; X86-NEXT: # %bb.1:
818
+ ; X86-NEXT: sarl $4, %eax
819
+ ; X86-NEXT: .LBB27_2:
820
+ ; X86-NEXT: addl $123456, %eax # imm = 0x1E240
821
+ ; X86-NEXT: movl %eax, (%ecx)
822
+ ; X86-NEXT: retl
823
+ %t0 = ashr i32 %x , 4
824
+ %t1 = select i1 %cond , i32 %t0 , i32 %x
825
+ %r = add i32 %t1 , 123456
826
+ store i32 %r , ptr %dst
827
+ ret i32 %r
828
+ }
829
+
830
+ define i32 @and_signbit_select_add (i32 %x , i1 %cond , ptr %dst , i32 %y ) {
831
+ ; X64-LABEL: and_signbit_select_add:
832
+ ; X64: # %bb.0:
833
+ ; X64-NEXT: # kill: def $ecx killed $ecx def $rcx
834
+ ; X64-NEXT: andl %edi, %ecx
835
+ ; X64-NEXT: testb $1, %sil
836
+ ; X64-NEXT: cmovnel %edi, %ecx
837
+ ; X64-NEXT: leal 123456(%rcx), %eax
838
+ ; X64-NEXT: movl %eax, (%rdx)
839
+ ; X64-NEXT: retq
840
+ ;
841
+ ; X86-LABEL: and_signbit_select_add:
842
+ ; X86: # %bb.0:
843
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
844
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
845
+ ; X86-NEXT: testb $1, {{[0-9]+}}(%esp)
846
+ ; X86-NEXT: jne .LBB28_2
847
+ ; X86-NEXT: # %bb.1:
848
+ ; X86-NEXT: andl {{[0-9]+}}(%esp), %eax
849
+ ; X86-NEXT: .LBB28_2:
850
+ ; X86-NEXT: addl $123456, %eax # imm = 0x1E240
851
+ ; X86-NEXT: movl %eax, (%ecx)
852
+ ; X86-NEXT: retl
853
+ %t0 = and i32 %x , %y
854
+ %t1 = select i1 %cond , i32 %x , i32 %t0
855
+ %r = add i32 %t1 , 123456
856
+ store i32 %r , ptr %dst
857
+ ret i32 %r
858
+ }
859
+
860
+
861
+ define i32 @and_signbit_select_add_fail (i32 %x , i1 %cond , ptr %dst , i32 %y ) {
862
+ ; X64-LABEL: and_signbit_select_add_fail:
863
+ ; X64: # %bb.0:
864
+ ; X64-NEXT: # kill: def $ecx killed $ecx def $rcx
865
+ ; X64-NEXT: andl %edi, %ecx
866
+ ; X64-NEXT: testb $1, %sil
867
+ ; X64-NEXT: cmovel %edi, %ecx
868
+ ; X64-NEXT: leal 123456(%rcx), %eax
869
+ ; X64-NEXT: movl %eax, (%rdx)
870
+ ; X64-NEXT: retq
871
+ ;
872
+ ; X86-LABEL: and_signbit_select_add_fail:
873
+ ; X86: # %bb.0:
874
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
875
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
876
+ ; X86-NEXT: testb $1, {{[0-9]+}}(%esp)
877
+ ; X86-NEXT: je .LBB29_2
878
+ ; X86-NEXT: # %bb.1:
879
+ ; X86-NEXT: andl {{[0-9]+}}(%esp), %eax
880
+ ; X86-NEXT: .LBB29_2:
881
+ ; X86-NEXT: addl $123456, %eax # imm = 0x1E240
882
+ ; X86-NEXT: movl %eax, (%ecx)
883
+ ; X86-NEXT: retl
884
+ %t0 = and i32 %x , %y
885
+ %t1 = select i1 %cond , i32 %t0 , i32 %x
886
+ %r = add i32 %t1 , 123456
887
+ store i32 %r , ptr %dst
888
+ ret i32 %r
889
+ }
890
+
0 commit comments