Skip to content

Commit 8182cfe

Browse files
committed
[LoongArch] Select {DIV,MOD}.{W,WU} instruction to eliminate explicit sign extension
1 parent 71fbbb6 commit 8182cfe

File tree

2 files changed

+16
-24
lines changed

2 files changed

+16
-24
lines changed

llvm/lib/Target/LoongArch/LoongArchInstrInfo.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1110,9 +1110,13 @@ def : PatGprImm_32<add, ADDI_W, simm12>;
11101110
def : PatGprGpr<sub, SUB_D>;
11111111
def : PatGprGpr_32<sub, SUB_W>;
11121112
def : PatGprGpr<sdiv, DIV_D>;
1113+
def : PatGprGpr_32<sdiv, DIV_W>;
11131114
def : PatGprGpr<udiv, DIV_DU>;
1115+
def : PatGprGpr_32<udiv, DIV_WU>;
11141116
def : PatGprGpr<srem, MOD_D>;
1117+
def : PatGprGpr_32<srem, MOD_W>;
11151118
def : PatGprGpr<urem, MOD_DU>;
1119+
def : PatGprGpr_32<urem, MOD_WU>;
11161120
def : PatGprGpr<rotr, ROTR_D>;
11171121
def : PatGprGpr<loongarch_rotr_w, ROTR_W>;
11181122
def : PatGprGpr_32<rotr, ROTR_W>;

llvm/test/CodeGen/LoongArch/ir-instruction/sdiv-udiv-srem-urem.ll

Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,7 @@ define signext i32 @sdiv_si32_ui32_ui32(i32 %a, i32 %b) {
191191
; LA64: # %bb.0: # %entry
192192
; LA64-NEXT: addi.w $a1, $a1, 0
193193
; LA64-NEXT: addi.w $a0, $a0, 0
194-
; LA64-NEXT: div.d $a0, $a0, $a1
195-
; LA64-NEXT: addi.w $a0, $a0, 0
194+
; LA64-NEXT: div.w $a0, $a0, $a1
196195
; LA64-NEXT: ret
197196
;
198197
; LA32-TRAP-LABEL: sdiv_si32_ui32_ui32:
@@ -208,12 +207,11 @@ define signext i32 @sdiv_si32_ui32_ui32(i32 %a, i32 %b) {
208207
; LA64-TRAP: # %bb.0: # %entry
209208
; LA64-TRAP-NEXT: addi.w $a1, $a1, 0
210209
; LA64-TRAP-NEXT: addi.w $a0, $a0, 0
211-
; LA64-TRAP-NEXT: div.d $a0, $a0, $a1
210+
; LA64-TRAP-NEXT: div.w $a0, $a0, $a1
212211
; LA64-TRAP-NEXT: bnez $a1, .LBB5_2
213212
; LA64-TRAP-NEXT: # %bb.1: # %entry
214213
; LA64-TRAP-NEXT: break 7
215214
; LA64-TRAP-NEXT: .LBB5_2: # %entry
216-
; LA64-TRAP-NEXT: addi.w $a0, $a0, 0
217215
; LA64-TRAP-NEXT: ret
218216
entry:
219217
%r = sdiv i32 %a, %b
@@ -228,8 +226,7 @@ define signext i32 @sdiv_si32_si32_si32(i32 signext %a, i32 signext %b) {
228226
;
229227
; LA64-LABEL: sdiv_si32_si32_si32:
230228
; LA64: # %bb.0: # %entry
231-
; LA64-NEXT: div.d $a0, $a0, $a1
232-
; LA64-NEXT: addi.w $a0, $a0, 0
229+
; LA64-NEXT: div.w $a0, $a0, $a1
233230
; LA64-NEXT: ret
234231
;
235232
; LA32-TRAP-LABEL: sdiv_si32_si32_si32:
@@ -243,12 +240,11 @@ define signext i32 @sdiv_si32_si32_si32(i32 signext %a, i32 signext %b) {
243240
;
244241
; LA64-TRAP-LABEL: sdiv_si32_si32_si32:
245242
; LA64-TRAP: # %bb.0: # %entry
246-
; LA64-TRAP-NEXT: div.d $a0, $a0, $a1
243+
; LA64-TRAP-NEXT: div.w $a0, $a0, $a1
247244
; LA64-TRAP-NEXT: bnez $a1, .LBB6_2
248245
; LA64-TRAP-NEXT: # %bb.1: # %entry
249246
; LA64-TRAP-NEXT: break 7
250247
; LA64-TRAP-NEXT: .LBB6_2: # %entry
251-
; LA64-TRAP-NEXT: addi.w $a0, $a0, 0
252248
; LA64-TRAP-NEXT: ret
253249
entry:
254250
%r = sdiv i32 %a, %b
@@ -483,8 +479,7 @@ define signext i32 @udiv_si32_ui32_ui32(i32 %a, i32 %b) {
483479
; LA64: # %bb.0: # %entry
484480
; LA64-NEXT: bstrpick.d $a1, $a1, 31, 0
485481
; LA64-NEXT: bstrpick.d $a0, $a0, 31, 0
486-
; LA64-NEXT: div.du $a0, $a0, $a1
487-
; LA64-NEXT: addi.w $a0, $a0, 0
482+
; LA64-NEXT: div.wu $a0, $a0, $a1
488483
; LA64-NEXT: ret
489484
;
490485
; LA32-TRAP-LABEL: udiv_si32_ui32_ui32:
@@ -500,12 +495,11 @@ define signext i32 @udiv_si32_ui32_ui32(i32 %a, i32 %b) {
500495
; LA64-TRAP: # %bb.0: # %entry
501496
; LA64-TRAP-NEXT: bstrpick.d $a1, $a1, 31, 0
502497
; LA64-TRAP-NEXT: bstrpick.d $a0, $a0, 31, 0
503-
; LA64-TRAP-NEXT: div.du $a0, $a0, $a1
498+
; LA64-TRAP-NEXT: div.wu $a0, $a0, $a1
504499
; LA64-TRAP-NEXT: bnez $a1, .LBB13_2
505500
; LA64-TRAP-NEXT: # %bb.1: # %entry
506501
; LA64-TRAP-NEXT: break 7
507502
; LA64-TRAP-NEXT: .LBB13_2: # %entry
508-
; LA64-TRAP-NEXT: addi.w $a0, $a0, 0
509503
; LA64-TRAP-NEXT: ret
510504
entry:
511505
%r = udiv i32 %a, %b
@@ -522,8 +516,7 @@ define signext i32 @udiv_si32_si32_si32(i32 signext %a, i32 signext %b) {
522516
; LA64: # %bb.0: # %entry
523517
; LA64-NEXT: bstrpick.d $a1, $a1, 31, 0
524518
; LA64-NEXT: bstrpick.d $a0, $a0, 31, 0
525-
; LA64-NEXT: div.du $a0, $a0, $a1
526-
; LA64-NEXT: addi.w $a0, $a0, 0
519+
; LA64-NEXT: div.wu $a0, $a0, $a1
527520
; LA64-NEXT: ret
528521
;
529522
; LA32-TRAP-LABEL: udiv_si32_si32_si32:
@@ -539,12 +532,11 @@ define signext i32 @udiv_si32_si32_si32(i32 signext %a, i32 signext %b) {
539532
; LA64-TRAP: # %bb.0: # %entry
540533
; LA64-TRAP-NEXT: bstrpick.d $a1, $a1, 31, 0
541534
; LA64-TRAP-NEXT: bstrpick.d $a0, $a0, 31, 0
542-
; LA64-TRAP-NEXT: div.du $a0, $a0, $a1
535+
; LA64-TRAP-NEXT: div.wu $a0, $a0, $a1
543536
; LA64-TRAP-NEXT: bnez $a1, .LBB14_2
544537
; LA64-TRAP-NEXT: # %bb.1: # %entry
545538
; LA64-TRAP-NEXT: break 7
546539
; LA64-TRAP-NEXT: .LBB14_2: # %entry
547-
; LA64-TRAP-NEXT: addi.w $a0, $a0, 0
548540
; LA64-TRAP-NEXT: ret
549541
entry:
550542
%r = udiv i32 %a, %b
@@ -1071,8 +1063,7 @@ define signext i32 @urem_si32_ui32_ui32(i32 %a, i32 %b) {
10711063
; LA64: # %bb.0: # %entry
10721064
; LA64-NEXT: bstrpick.d $a1, $a1, 31, 0
10731065
; LA64-NEXT: bstrpick.d $a0, $a0, 31, 0
1074-
; LA64-NEXT: mod.du $a0, $a0, $a1
1075-
; LA64-NEXT: addi.w $a0, $a0, 0
1066+
; LA64-NEXT: mod.wu $a0, $a0, $a1
10761067
; LA64-NEXT: ret
10771068
;
10781069
; LA32-TRAP-LABEL: urem_si32_ui32_ui32:
@@ -1088,12 +1079,11 @@ define signext i32 @urem_si32_ui32_ui32(i32 %a, i32 %b) {
10881079
; LA64-TRAP: # %bb.0: # %entry
10891080
; LA64-TRAP-NEXT: bstrpick.d $a1, $a1, 31, 0
10901081
; LA64-TRAP-NEXT: bstrpick.d $a0, $a0, 31, 0
1091-
; LA64-TRAP-NEXT: mod.du $a0, $a0, $a1
1082+
; LA64-TRAP-NEXT: mod.wu $a0, $a0, $a1
10921083
; LA64-TRAP-NEXT: bnez $a1, .LBB29_2
10931084
; LA64-TRAP-NEXT: # %bb.1: # %entry
10941085
; LA64-TRAP-NEXT: break 7
10951086
; LA64-TRAP-NEXT: .LBB29_2: # %entry
1096-
; LA64-TRAP-NEXT: addi.w $a0, $a0, 0
10971087
; LA64-TRAP-NEXT: ret
10981088
entry:
10991089
%r = urem i32 %a, %b
@@ -1110,8 +1100,7 @@ define signext i32 @urem_si32_si32_si32(i32 signext %a, i32 signext %b) {
11101100
; LA64: # %bb.0: # %entry
11111101
; LA64-NEXT: bstrpick.d $a1, $a1, 31, 0
11121102
; LA64-NEXT: bstrpick.d $a0, $a0, 31, 0
1113-
; LA64-NEXT: mod.du $a0, $a0, $a1
1114-
; LA64-NEXT: addi.w $a0, $a0, 0
1103+
; LA64-NEXT: mod.wu $a0, $a0, $a1
11151104
; LA64-NEXT: ret
11161105
;
11171106
; LA32-TRAP-LABEL: urem_si32_si32_si32:
@@ -1127,12 +1116,11 @@ define signext i32 @urem_si32_si32_si32(i32 signext %a, i32 signext %b) {
11271116
; LA64-TRAP: # %bb.0: # %entry
11281117
; LA64-TRAP-NEXT: bstrpick.d $a1, $a1, 31, 0
11291118
; LA64-TRAP-NEXT: bstrpick.d $a0, $a0, 31, 0
1130-
; LA64-TRAP-NEXT: mod.du $a0, $a0, $a1
1119+
; LA64-TRAP-NEXT: mod.wu $a0, $a0, $a1
11311120
; LA64-TRAP-NEXT: bnez $a1, .LBB30_2
11321121
; LA64-TRAP-NEXT: # %bb.1: # %entry
11331122
; LA64-TRAP-NEXT: break 7
11341123
; LA64-TRAP-NEXT: .LBB30_2: # %entry
1135-
; LA64-TRAP-NEXT: addi.w $a0, $a0, 0
11361124
; LA64-TRAP-NEXT: ret
11371125
entry:
11381126
%r = urem i32 %a, %b

0 commit comments

Comments
 (0)