|
@@ -624,12 +624,13 @@ define i32 @aext_sllw_zext_zext(i32 zeroext %a, i32 zeroext %b) nounwind {
|
|
|
ret i32 %1
|
|
|
}
|
|
|
|
|
|
-; Select sllw for all cases witha signext result.
|
|
|
+; TODO: Select sllw for all cases witha signext result.
|
|
|
|
|
|
define signext i32 @sext_sllw_aext_aext(i32 %a, i32 %b) nounwind {
|
|
|
; RV64I-LABEL: sext_sllw_aext_aext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: sllw a0, a0, a1
|
|
|
+; RV64I-NEXT: sll a0, a0, a1
|
|
|
+; RV64I-NEXT: sext.w a0, a0
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = shl i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -638,7 +639,8 @@ define signext i32 @sext_sllw_aext_aext(i32 %a, i32 %b) nounwind {
|
|
|
define signext i32 @sext_sllw_aext_sext(i32 %a, i32 signext %b) nounwind {
|
|
|
; RV64I-LABEL: sext_sllw_aext_sext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: sllw a0, a0, a1
|
|
|
+; RV64I-NEXT: sll a0, a0, a1
|
|
|
+; RV64I-NEXT: sext.w a0, a0
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = shl i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -647,7 +649,8 @@ define signext i32 @sext_sllw_aext_sext(i32 %a, i32 signext %b) nounwind {
|
|
|
define signext i32 @sext_sllw_aext_zext(i32 %a, i32 zeroext %b) nounwind {
|
|
|
; RV64I-LABEL: sext_sllw_aext_zext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: sllw a0, a0, a1
|
|
|
+; RV64I-NEXT: sll a0, a0, a1
|
|
|
+; RV64I-NEXT: sext.w a0, a0
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = shl i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -656,7 +659,8 @@ define signext i32 @sext_sllw_aext_zext(i32 %a, i32 zeroext %b) nounwind {
|
|
|
define signext i32 @sext_sllw_sext_aext(i32 signext %a, i32 %b) nounwind {
|
|
|
; RV64I-LABEL: sext_sllw_sext_aext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: sllw a0, a0, a1
|
|
|
+; RV64I-NEXT: sll a0, a0, a1
|
|
|
+; RV64I-NEXT: sext.w a0, a0
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = shl i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -665,7 +669,8 @@ define signext i32 @sext_sllw_sext_aext(i32 signext %a, i32 %b) nounwind {
|
|
|
define signext i32 @sext_sllw_sext_sext(i32 signext %a, i32 signext %b) nounwind {
|
|
|
; RV64I-LABEL: sext_sllw_sext_sext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: sllw a0, a0, a1
|
|
|
+; RV64I-NEXT: sll a0, a0, a1
|
|
|
+; RV64I-NEXT: sext.w a0, a0
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = shl i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -674,7 +679,8 @@ define signext i32 @sext_sllw_sext_sext(i32 signext %a, i32 signext %b) nounwind
|
|
|
define signext i32 @sext_sllw_sext_zext(i32 signext %a, i32 zeroext %b) nounwind {
|
|
|
; RV64I-LABEL: sext_sllw_sext_zext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: sllw a0, a0, a1
|
|
|
+; RV64I-NEXT: sll a0, a0, a1
|
|
|
+; RV64I-NEXT: sext.w a0, a0
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = shl i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -683,7 +689,8 @@ define signext i32 @sext_sllw_sext_zext(i32 signext %a, i32 zeroext %b) nounwind
|
|
|
define signext i32 @sext_sllw_zext_aext(i32 zeroext %a, i32 %b) nounwind {
|
|
|
; RV64I-LABEL: sext_sllw_zext_aext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: sllw a0, a0, a1
|
|
|
+; RV64I-NEXT: sll a0, a0, a1
|
|
|
+; RV64I-NEXT: sext.w a0, a0
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = shl i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -692,7 +699,8 @@ define signext i32 @sext_sllw_zext_aext(i32 zeroext %a, i32 %b) nounwind {
|
|
|
define signext i32 @sext_sllw_zext_sext(i32 zeroext %a, i32 signext %b) nounwind {
|
|
|
; RV64I-LABEL: sext_sllw_zext_sext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: sllw a0, a0, a1
|
|
|
+; RV64I-NEXT: sll a0, a0, a1
|
|
|
+; RV64I-NEXT: sext.w a0, a0
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = shl i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -701,7 +709,8 @@ define signext i32 @sext_sllw_zext_sext(i32 zeroext %a, i32 signext %b) nounwind
|
|
|
define signext i32 @sext_sllw_zext_zext(i32 zeroext %a, i32 zeroext %b) nounwind {
|
|
|
; RV64I-LABEL: sext_sllw_zext_zext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: sllw a0, a0, a1
|
|
|
+; RV64I-NEXT: sll a0, a0, a1
|
|
|
+; RV64I-NEXT: sext.w a0, a0
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = shl i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -808,12 +817,14 @@ define zeroext i32 @zext_sllw_zext_zext(i32 zeroext %a, i32 zeroext %b) nounwind
|
|
|
ret i32 %1
|
|
|
}
|
|
|
|
|
|
-; srlw must always be selected for 32-bit lshr with variable arguments.
|
|
|
+; TODO: srlw should be selected for 32-bit lshr with variable arguments.
|
|
|
|
|
|
define i32 @aext_srlw_aext_aext(i32 %a, i32 %b) nounwind {
|
|
|
; RV64I-LABEL: aext_srlw_aext_aext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: srlw a0, a0, a1
|
|
|
+; RV64I-NEXT: slli a0, a0, 32
|
|
|
+; RV64I-NEXT: srli a0, a0, 32
|
|
|
+; RV64I-NEXT: srl a0, a0, a1
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = lshr i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -822,7 +833,9 @@ define i32 @aext_srlw_aext_aext(i32 %a, i32 %b) nounwind {
|
|
|
define i32 @aext_srlw_aext_sext(i32 %a, i32 signext %b) nounwind {
|
|
|
; RV64I-LABEL: aext_srlw_aext_sext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: srlw a0, a0, a1
|
|
|
+; RV64I-NEXT: slli a0, a0, 32
|
|
|
+; RV64I-NEXT: srli a0, a0, 32
|
|
|
+; RV64I-NEXT: srl a0, a0, a1
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = lshr i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -831,7 +844,9 @@ define i32 @aext_srlw_aext_sext(i32 %a, i32 signext %b) nounwind {
|
|
|
define i32 @aext_srlw_aext_zext(i32 %a, i32 zeroext %b) nounwind {
|
|
|
; RV64I-LABEL: aext_srlw_aext_zext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: srlw a0, a0, a1
|
|
|
+; RV64I-NEXT: slli a0, a0, 32
|
|
|
+; RV64I-NEXT: srli a0, a0, 32
|
|
|
+; RV64I-NEXT: srl a0, a0, a1
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = lshr i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -840,7 +855,9 @@ define i32 @aext_srlw_aext_zext(i32 %a, i32 zeroext %b) nounwind {
|
|
|
define i32 @aext_srlw_sext_aext(i32 signext %a, i32 %b) nounwind {
|
|
|
; RV64I-LABEL: aext_srlw_sext_aext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: srlw a0, a0, a1
|
|
|
+; RV64I-NEXT: slli a0, a0, 32
|
|
|
+; RV64I-NEXT: srli a0, a0, 32
|
|
|
+; RV64I-NEXT: srl a0, a0, a1
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = lshr i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -849,7 +866,9 @@ define i32 @aext_srlw_sext_aext(i32 signext %a, i32 %b) nounwind {
|
|
|
define i32 @aext_srlw_sext_sext(i32 signext %a, i32 signext %b) nounwind {
|
|
|
; RV64I-LABEL: aext_srlw_sext_sext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: srlw a0, a0, a1
|
|
|
+; RV64I-NEXT: slli a0, a0, 32
|
|
|
+; RV64I-NEXT: srli a0, a0, 32
|
|
|
+; RV64I-NEXT: srl a0, a0, a1
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = lshr i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -858,7 +877,9 @@ define i32 @aext_srlw_sext_sext(i32 signext %a, i32 signext %b) nounwind {
|
|
|
define i32 @aext_srlw_sext_zext(i32 signext %a, i32 zeroext %b) nounwind {
|
|
|
; RV64I-LABEL: aext_srlw_sext_zext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: srlw a0, a0, a1
|
|
|
+; RV64I-NEXT: slli a0, a0, 32
|
|
|
+; RV64I-NEXT: srli a0, a0, 32
|
|
|
+; RV64I-NEXT: srl a0, a0, a1
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = lshr i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -867,7 +888,7 @@ define i32 @aext_srlw_sext_zext(i32 signext %a, i32 zeroext %b) nounwind {
|
|
|
define i32 @aext_srlw_zext_aext(i32 zeroext %a, i32 %b) nounwind {
|
|
|
; RV64I-LABEL: aext_srlw_zext_aext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: srlw a0, a0, a1
|
|
|
+; RV64I-NEXT: srl a0, a0, a1
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = lshr i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -876,7 +897,7 @@ define i32 @aext_srlw_zext_aext(i32 zeroext %a, i32 %b) nounwind {
|
|
|
define i32 @aext_srlw_zext_sext(i32 zeroext %a, i32 signext %b) nounwind {
|
|
|
; RV64I-LABEL: aext_srlw_zext_sext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: srlw a0, a0, a1
|
|
|
+; RV64I-NEXT: srl a0, a0, a1
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = lshr i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -885,7 +906,7 @@ define i32 @aext_srlw_zext_sext(i32 zeroext %a, i32 signext %b) nounwind {
|
|
|
define i32 @aext_srlw_zext_zext(i32 zeroext %a, i32 zeroext %b) nounwind {
|
|
|
; RV64I-LABEL: aext_srlw_zext_zext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: srlw a0, a0, a1
|
|
|
+; RV64I-NEXT: srl a0, a0, a1
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = lshr i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -894,7 +915,10 @@ define i32 @aext_srlw_zext_zext(i32 zeroext %a, i32 zeroext %b) nounwind {
|
|
|
define signext i32 @sext_srlw_aext_aext(i32 %a, i32 %b) nounwind {
|
|
|
; RV64I-LABEL: sext_srlw_aext_aext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: srlw a0, a0, a1
|
|
|
+; RV64I-NEXT: slli a0, a0, 32
|
|
|
+; RV64I-NEXT: srli a0, a0, 32
|
|
|
+; RV64I-NEXT: srl a0, a0, a1
|
|
|
+; RV64I-NEXT: sext.w a0, a0
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = lshr i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -903,7 +927,10 @@ define signext i32 @sext_srlw_aext_aext(i32 %a, i32 %b) nounwind {
|
|
|
define signext i32 @sext_srlw_aext_sext(i32 %a, i32 signext %b) nounwind {
|
|
|
; RV64I-LABEL: sext_srlw_aext_sext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: srlw a0, a0, a1
|
|
|
+; RV64I-NEXT: slli a0, a0, 32
|
|
|
+; RV64I-NEXT: srli a0, a0, 32
|
|
|
+; RV64I-NEXT: srl a0, a0, a1
|
|
|
+; RV64I-NEXT: sext.w a0, a0
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = lshr i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -912,7 +939,10 @@ define signext i32 @sext_srlw_aext_sext(i32 %a, i32 signext %b) nounwind {
|
|
|
define signext i32 @sext_srlw_aext_zext(i32 %a, i32 zeroext %b) nounwind {
|
|
|
; RV64I-LABEL: sext_srlw_aext_zext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: srlw a0, a0, a1
|
|
|
+; RV64I-NEXT: slli a0, a0, 32
|
|
|
+; RV64I-NEXT: srli a0, a0, 32
|
|
|
+; RV64I-NEXT: srl a0, a0, a1
|
|
|
+; RV64I-NEXT: sext.w a0, a0
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = lshr i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -921,7 +951,10 @@ define signext i32 @sext_srlw_aext_zext(i32 %a, i32 zeroext %b) nounwind {
|
|
|
define signext i32 @sext_srlw_sext_aext(i32 signext %a, i32 %b) nounwind {
|
|
|
; RV64I-LABEL: sext_srlw_sext_aext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: srlw a0, a0, a1
|
|
|
+; RV64I-NEXT: slli a0, a0, 32
|
|
|
+; RV64I-NEXT: srli a0, a0, 32
|
|
|
+; RV64I-NEXT: srl a0, a0, a1
|
|
|
+; RV64I-NEXT: sext.w a0, a0
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = lshr i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -930,7 +963,10 @@ define signext i32 @sext_srlw_sext_aext(i32 signext %a, i32 %b) nounwind {
|
|
|
define signext i32 @sext_srlw_sext_sext(i32 signext %a, i32 signext %b) nounwind {
|
|
|
; RV64I-LABEL: sext_srlw_sext_sext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: srlw a0, a0, a1
|
|
|
+; RV64I-NEXT: slli a0, a0, 32
|
|
|
+; RV64I-NEXT: srli a0, a0, 32
|
|
|
+; RV64I-NEXT: srl a0, a0, a1
|
|
|
+; RV64I-NEXT: sext.w a0, a0
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = lshr i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -939,7 +975,10 @@ define signext i32 @sext_srlw_sext_sext(i32 signext %a, i32 signext %b) nounwind
|
|
|
define signext i32 @sext_srlw_sext_zext(i32 signext %a, i32 zeroext %b) nounwind {
|
|
|
; RV64I-LABEL: sext_srlw_sext_zext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: srlw a0, a0, a1
|
|
|
+; RV64I-NEXT: slli a0, a0, 32
|
|
|
+; RV64I-NEXT: srli a0, a0, 32
|
|
|
+; RV64I-NEXT: srl a0, a0, a1
|
|
|
+; RV64I-NEXT: sext.w a0, a0
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = lshr i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -948,7 +987,8 @@ define signext i32 @sext_srlw_sext_zext(i32 signext %a, i32 zeroext %b) nounwind
|
|
|
define signext i32 @sext_srlw_zext_aext(i32 zeroext %a, i32 %b) nounwind {
|
|
|
; RV64I-LABEL: sext_srlw_zext_aext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: srlw a0, a0, a1
|
|
|
+; RV64I-NEXT: srl a0, a0, a1
|
|
|
+; RV64I-NEXT: sext.w a0, a0
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = lshr i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -957,7 +997,8 @@ define signext i32 @sext_srlw_zext_aext(i32 zeroext %a, i32 %b) nounwind {
|
|
|
define signext i32 @sext_srlw_zext_sext(i32 zeroext %a, i32 signext %b) nounwind {
|
|
|
; RV64I-LABEL: sext_srlw_zext_sext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: srlw a0, a0, a1
|
|
|
+; RV64I-NEXT: srl a0, a0, a1
|
|
|
+; RV64I-NEXT: sext.w a0, a0
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = lshr i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -966,7 +1007,8 @@ define signext i32 @sext_srlw_zext_sext(i32 zeroext %a, i32 signext %b) nounwind
|
|
|
define signext i32 @sext_srlw_zext_zext(i32 zeroext %a, i32 zeroext %b) nounwind {
|
|
|
; RV64I-LABEL: sext_srlw_zext_zext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: srlw a0, a0, a1
|
|
|
+; RV64I-NEXT: srl a0, a0, a1
|
|
|
+; RV64I-NEXT: sext.w a0, a0
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = lshr i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -975,7 +1017,9 @@ define signext i32 @sext_srlw_zext_zext(i32 zeroext %a, i32 zeroext %b) nounwind
|
|
|
define zeroext i32 @zext_srlw_aext_aext(i32 %a, i32 %b) nounwind {
|
|
|
; RV64I-LABEL: zext_srlw_aext_aext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: srlw a0, a0, a1
|
|
|
+; RV64I-NEXT: slli a0, a0, 32
|
|
|
+; RV64I-NEXT: srli a0, a0, 32
|
|
|
+; RV64I-NEXT: srl a0, a0, a1
|
|
|
; RV64I-NEXT: slli a0, a0, 32
|
|
|
; RV64I-NEXT: srli a0, a0, 32
|
|
|
; RV64I-NEXT: ret
|
|
@@ -986,7 +1030,9 @@ define zeroext i32 @zext_srlw_aext_aext(i32 %a, i32 %b) nounwind {
|
|
|
define zeroext i32 @zext_srlw_aext_sext(i32 %a, i32 signext %b) nounwind {
|
|
|
; RV64I-LABEL: zext_srlw_aext_sext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: srlw a0, a0, a1
|
|
|
+; RV64I-NEXT: slli a0, a0, 32
|
|
|
+; RV64I-NEXT: srli a0, a0, 32
|
|
|
+; RV64I-NEXT: srl a0, a0, a1
|
|
|
; RV64I-NEXT: slli a0, a0, 32
|
|
|
; RV64I-NEXT: srli a0, a0, 32
|
|
|
; RV64I-NEXT: ret
|
|
@@ -997,7 +1043,9 @@ define zeroext i32 @zext_srlw_aext_sext(i32 %a, i32 signext %b) nounwind {
|
|
|
define zeroext i32 @zext_srlw_aext_zext(i32 %a, i32 zeroext %b) nounwind {
|
|
|
; RV64I-LABEL: zext_srlw_aext_zext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: srlw a0, a0, a1
|
|
|
+; RV64I-NEXT: slli a0, a0, 32
|
|
|
+; RV64I-NEXT: srli a0, a0, 32
|
|
|
+; RV64I-NEXT: srl a0, a0, a1
|
|
|
; RV64I-NEXT: slli a0, a0, 32
|
|
|
; RV64I-NEXT: srli a0, a0, 32
|
|
|
; RV64I-NEXT: ret
|
|
@@ -1008,7 +1056,9 @@ define zeroext i32 @zext_srlw_aext_zext(i32 %a, i32 zeroext %b) nounwind {
|
|
|
define zeroext i32 @zext_srlw_sext_aext(i32 signext %a, i32 %b) nounwind {
|
|
|
; RV64I-LABEL: zext_srlw_sext_aext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: srlw a0, a0, a1
|
|
|
+; RV64I-NEXT: slli a0, a0, 32
|
|
|
+; RV64I-NEXT: srli a0, a0, 32
|
|
|
+; RV64I-NEXT: srl a0, a0, a1
|
|
|
; RV64I-NEXT: slli a0, a0, 32
|
|
|
; RV64I-NEXT: srli a0, a0, 32
|
|
|
; RV64I-NEXT: ret
|
|
@@ -1019,7 +1069,9 @@ define zeroext i32 @zext_srlw_sext_aext(i32 signext %a, i32 %b) nounwind {
|
|
|
define zeroext i32 @zext_srlw_sext_sext(i32 signext %a, i32 signext %b) nounwind {
|
|
|
; RV64I-LABEL: zext_srlw_sext_sext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: srlw a0, a0, a1
|
|
|
+; RV64I-NEXT: slli a0, a0, 32
|
|
|
+; RV64I-NEXT: srli a0, a0, 32
|
|
|
+; RV64I-NEXT: srl a0, a0, a1
|
|
|
; RV64I-NEXT: slli a0, a0, 32
|
|
|
; RV64I-NEXT: srli a0, a0, 32
|
|
|
; RV64I-NEXT: ret
|
|
@@ -1030,7 +1082,9 @@ define zeroext i32 @zext_srlw_sext_sext(i32 signext %a, i32 signext %b) nounwind
|
|
|
define zeroext i32 @zext_srlw_sext_zext(i32 signext %a, i32 zeroext %b) nounwind {
|
|
|
; RV64I-LABEL: zext_srlw_sext_zext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: srlw a0, a0, a1
|
|
|
+; RV64I-NEXT: slli a0, a0, 32
|
|
|
+; RV64I-NEXT: srli a0, a0, 32
|
|
|
+; RV64I-NEXT: srl a0, a0, a1
|
|
|
; RV64I-NEXT: slli a0, a0, 32
|
|
|
; RV64I-NEXT: srli a0, a0, 32
|
|
|
; RV64I-NEXT: ret
|
|
@@ -1041,7 +1095,7 @@ define zeroext i32 @zext_srlw_sext_zext(i32 signext %a, i32 zeroext %b) nounwind
|
|
|
define zeroext i32 @zext_srlw_zext_aext(i32 zeroext %a, i32 %b) nounwind {
|
|
|
; RV64I-LABEL: zext_srlw_zext_aext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: srlw a0, a0, a1
|
|
|
+; RV64I-NEXT: srl a0, a0, a1
|
|
|
; RV64I-NEXT: slli a0, a0, 32
|
|
|
; RV64I-NEXT: srli a0, a0, 32
|
|
|
; RV64I-NEXT: ret
|
|
@@ -1052,7 +1106,7 @@ define zeroext i32 @zext_srlw_zext_aext(i32 zeroext %a, i32 %b) nounwind {
|
|
|
define zeroext i32 @zext_srlw_zext_sext(i32 zeroext %a, i32 signext %b) nounwind {
|
|
|
; RV64I-LABEL: zext_srlw_zext_sext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: srlw a0, a0, a1
|
|
|
+; RV64I-NEXT: srl a0, a0, a1
|
|
|
; RV64I-NEXT: slli a0, a0, 32
|
|
|
; RV64I-NEXT: srli a0, a0, 32
|
|
|
; RV64I-NEXT: ret
|
|
@@ -1063,7 +1117,7 @@ define zeroext i32 @zext_srlw_zext_sext(i32 zeroext %a, i32 signext %b) nounwind
|
|
|
define zeroext i32 @zext_srlw_zext_zext(i32 zeroext %a, i32 zeroext %b) nounwind {
|
|
|
; RV64I-LABEL: zext_srlw_zext_zext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: srlw a0, a0, a1
|
|
|
+; RV64I-NEXT: srl a0, a0, a1
|
|
|
; RV64I-NEXT: slli a0, a0, 32
|
|
|
; RV64I-NEXT: srli a0, a0, 32
|
|
|
; RV64I-NEXT: ret
|
|
@@ -1071,12 +1125,14 @@ define zeroext i32 @zext_srlw_zext_zext(i32 zeroext %a, i32 zeroext %b) nounwind
|
|
|
ret i32 %1
|
|
|
}
|
|
|
|
|
|
-; sraw must be selected if the first operand is not sign-extended.
|
|
|
+; TODO: sraw should be selected if the first operand is not sign-extended. If the
|
|
|
+; first operand is sign-extended, sra is equivalent for the test cases below.
|
|
|
|
|
|
define i32 @aext_sraw_aext_aext(i32 %a, i32 %b) nounwind {
|
|
|
; RV64I-LABEL: aext_sraw_aext_aext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: sraw a0, a0, a1
|
|
|
+; RV64I-NEXT: sext.w a0, a0
|
|
|
+; RV64I-NEXT: sra a0, a0, a1
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = ashr i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -1085,7 +1141,8 @@ define i32 @aext_sraw_aext_aext(i32 %a, i32 %b) nounwind {
|
|
|
define i32 @aext_sraw_aext_sext(i32 %a, i32 signext %b) nounwind {
|
|
|
; RV64I-LABEL: aext_sraw_aext_sext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: sraw a0, a0, a1
|
|
|
+; RV64I-NEXT: sext.w a0, a0
|
|
|
+; RV64I-NEXT: sra a0, a0, a1
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = ashr i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -1094,7 +1151,8 @@ define i32 @aext_sraw_aext_sext(i32 %a, i32 signext %b) nounwind {
|
|
|
define i32 @aext_sraw_aext_zext(i32 %a, i32 zeroext %b) nounwind {
|
|
|
; RV64I-LABEL: aext_sraw_aext_zext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: sraw a0, a0, a1
|
|
|
+; RV64I-NEXT: sext.w a0, a0
|
|
|
+; RV64I-NEXT: sra a0, a0, a1
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = ashr i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -1130,7 +1188,8 @@ define i32 @aext_sraw_sext_zext(i32 signext %a, i32 zeroext %b) nounwind {
|
|
|
define i32 @aext_sraw_zext_aext(i32 zeroext %a, i32 %b) nounwind {
|
|
|
; RV64I-LABEL: aext_sraw_zext_aext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: sraw a0, a0, a1
|
|
|
+; RV64I-NEXT: sext.w a0, a0
|
|
|
+; RV64I-NEXT: sra a0, a0, a1
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = ashr i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -1139,7 +1198,8 @@ define i32 @aext_sraw_zext_aext(i32 zeroext %a, i32 %b) nounwind {
|
|
|
define i32 @aext_sraw_zext_sext(i32 zeroext %a, i32 signext %b) nounwind {
|
|
|
; RV64I-LABEL: aext_sraw_zext_sext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: sraw a0, a0, a1
|
|
|
+; RV64I-NEXT: sext.w a0, a0
|
|
|
+; RV64I-NEXT: sra a0, a0, a1
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = ashr i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -1148,7 +1208,8 @@ define i32 @aext_sraw_zext_sext(i32 zeroext %a, i32 signext %b) nounwind {
|
|
|
define i32 @aext_sraw_zext_zext(i32 zeroext %a, i32 zeroext %b) nounwind {
|
|
|
; RV64I-LABEL: aext_sraw_zext_zext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: sraw a0, a0, a1
|
|
|
+; RV64I-NEXT: sext.w a0, a0
|
|
|
+; RV64I-NEXT: sra a0, a0, a1
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = ashr i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -1157,7 +1218,8 @@ define i32 @aext_sraw_zext_zext(i32 zeroext %a, i32 zeroext %b) nounwind {
|
|
|
define signext i32 @sext_sraw_aext_aext(i32 %a, i32 %b) nounwind {
|
|
|
; RV64I-LABEL: sext_sraw_aext_aext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: sraw a0, a0, a1
|
|
|
+; RV64I-NEXT: sext.w a0, a0
|
|
|
+; RV64I-NEXT: sra a0, a0, a1
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = ashr i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -1166,7 +1228,8 @@ define signext i32 @sext_sraw_aext_aext(i32 %a, i32 %b) nounwind {
|
|
|
define signext i32 @sext_sraw_aext_sext(i32 %a, i32 signext %b) nounwind {
|
|
|
; RV64I-LABEL: sext_sraw_aext_sext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: sraw a0, a0, a1
|
|
|
+; RV64I-NEXT: sext.w a0, a0
|
|
|
+; RV64I-NEXT: sra a0, a0, a1
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = ashr i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -1175,7 +1238,8 @@ define signext i32 @sext_sraw_aext_sext(i32 %a, i32 signext %b) nounwind {
|
|
|
define signext i32 @sext_sraw_aext_zext(i32 %a, i32 zeroext %b) nounwind {
|
|
|
; RV64I-LABEL: sext_sraw_aext_zext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: sraw a0, a0, a1
|
|
|
+; RV64I-NEXT: sext.w a0, a0
|
|
|
+; RV64I-NEXT: sra a0, a0, a1
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = ashr i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -1211,7 +1275,8 @@ define signext i32 @sext_sraw_sext_zext(i32 signext %a, i32 zeroext %b) nounwind
|
|
|
define signext i32 @sext_sraw_zext_aext(i32 zeroext %a, i32 %b) nounwind {
|
|
|
; RV64I-LABEL: sext_sraw_zext_aext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: sraw a0, a0, a1
|
|
|
+; RV64I-NEXT: sext.w a0, a0
|
|
|
+; RV64I-NEXT: sra a0, a0, a1
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = ashr i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -1220,7 +1285,8 @@ define signext i32 @sext_sraw_zext_aext(i32 zeroext %a, i32 %b) nounwind {
|
|
|
define signext i32 @sext_sraw_zext_sext(i32 zeroext %a, i32 signext %b) nounwind {
|
|
|
; RV64I-LABEL: sext_sraw_zext_sext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: sraw a0, a0, a1
|
|
|
+; RV64I-NEXT: sext.w a0, a0
|
|
|
+; RV64I-NEXT: sra a0, a0, a1
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = ashr i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -1229,7 +1295,8 @@ define signext i32 @sext_sraw_zext_sext(i32 zeroext %a, i32 signext %b) nounwind
|
|
|
define signext i32 @sext_sraw_zext_zext(i32 zeroext %a, i32 zeroext %b) nounwind {
|
|
|
; RV64I-LABEL: sext_sraw_zext_zext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: sraw a0, a0, a1
|
|
|
+; RV64I-NEXT: sext.w a0, a0
|
|
|
+; RV64I-NEXT: sra a0, a0, a1
|
|
|
; RV64I-NEXT: ret
|
|
|
%1 = ashr i32 %a, %b
|
|
|
ret i32 %1
|
|
@@ -1238,7 +1305,8 @@ define signext i32 @sext_sraw_zext_zext(i32 zeroext %a, i32 zeroext %b) nounwind
|
|
|
define zeroext i32 @zext_sraw_aext_aext(i32 %a, i32 %b) nounwind {
|
|
|
; RV64I-LABEL: zext_sraw_aext_aext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: sraw a0, a0, a1
|
|
|
+; RV64I-NEXT: sext.w a0, a0
|
|
|
+; RV64I-NEXT: sra a0, a0, a1
|
|
|
; RV64I-NEXT: slli a0, a0, 32
|
|
|
; RV64I-NEXT: srli a0, a0, 32
|
|
|
; RV64I-NEXT: ret
|
|
@@ -1249,7 +1317,8 @@ define zeroext i32 @zext_sraw_aext_aext(i32 %a, i32 %b) nounwind {
|
|
|
define zeroext i32 @zext_sraw_aext_sext(i32 %a, i32 signext %b) nounwind {
|
|
|
; RV64I-LABEL: zext_sraw_aext_sext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: sraw a0, a0, a1
|
|
|
+; RV64I-NEXT: sext.w a0, a0
|
|
|
+; RV64I-NEXT: sra a0, a0, a1
|
|
|
; RV64I-NEXT: slli a0, a0, 32
|
|
|
; RV64I-NEXT: srli a0, a0, 32
|
|
|
; RV64I-NEXT: ret
|
|
@@ -1260,7 +1329,8 @@ define zeroext i32 @zext_sraw_aext_sext(i32 %a, i32 signext %b) nounwind {
|
|
|
define zeroext i32 @zext_sraw_aext_zext(i32 %a, i32 zeroext %b) nounwind {
|
|
|
; RV64I-LABEL: zext_sraw_aext_zext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: sraw a0, a0, a1
|
|
|
+; RV64I-NEXT: sext.w a0, a0
|
|
|
+; RV64I-NEXT: sra a0, a0, a1
|
|
|
; RV64I-NEXT: slli a0, a0, 32
|
|
|
; RV64I-NEXT: srli a0, a0, 32
|
|
|
; RV64I-NEXT: ret
|
|
@@ -1304,7 +1374,8 @@ define zeroext i32 @zext_sraw_sext_zext(i32 signext %a, i32 zeroext %b) nounwind
|
|
|
define zeroext i32 @zext_sraw_zext_aext(i32 zeroext %a, i32 %b) nounwind {
|
|
|
; RV64I-LABEL: zext_sraw_zext_aext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: sraw a0, a0, a1
|
|
|
+; RV64I-NEXT: sext.w a0, a0
|
|
|
+; RV64I-NEXT: sra a0, a0, a1
|
|
|
; RV64I-NEXT: slli a0, a0, 32
|
|
|
; RV64I-NEXT: srli a0, a0, 32
|
|
|
; RV64I-NEXT: ret
|
|
@@ -1315,7 +1386,8 @@ define zeroext i32 @zext_sraw_zext_aext(i32 zeroext %a, i32 %b) nounwind {
|
|
|
define zeroext i32 @zext_sraw_zext_sext(i32 zeroext %a, i32 signext %b) nounwind {
|
|
|
; RV64I-LABEL: zext_sraw_zext_sext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: sraw a0, a0, a1
|
|
|
+; RV64I-NEXT: sext.w a0, a0
|
|
|
+; RV64I-NEXT: sra a0, a0, a1
|
|
|
; RV64I-NEXT: slli a0, a0, 32
|
|
|
; RV64I-NEXT: srli a0, a0, 32
|
|
|
; RV64I-NEXT: ret
|
|
@@ -1326,7 +1398,8 @@ define zeroext i32 @zext_sraw_zext_sext(i32 zeroext %a, i32 signext %b) nounwind
|
|
|
define zeroext i32 @zext_sraw_zext_zext(i32 zeroext %a, i32 zeroext %b) nounwind {
|
|
|
; RV64I-LABEL: zext_sraw_zext_zext:
|
|
|
; RV64I: # %bb.0:
|
|
|
-; RV64I-NEXT: sraw a0, a0, a1
|
|
|
+; RV64I-NEXT: sext.w a0, a0
|
|
|
+; RV64I-NEXT: sra a0, a0, a1
|
|
|
; RV64I-NEXT: slli a0, a0, 32
|
|
|
; RV64I-NEXT: srli a0, a0, 32
|
|
|
; RV64I-NEXT: ret
|