1; RUN: llc --mtriple=loongarch32 < %s | FileCheck %s --check-prefix=LA32
2; RUN: llc --mtriple=loongarch64 < %s | FileCheck %s --check-prefix=LA64
3
4;; Exercise the 'sub' LLVM IR: https://llvm.org/docs/LangRef.html#sub-instruction
5
6define i1 @sub_i1(i1 %x, i1 %y) {
7; LA32-LABEL: sub_i1:
8; LA32:       # %bb.0:
9; LA32-NEXT:    sub.w $a0, $a0, $a1
10; LA32-NEXT:    jirl $zero, $ra, 0
11;
12; LA64-LABEL: sub_i1:
13; LA64:       # %bb.0:
14; LA64-NEXT:    sub.d $a0, $a0, $a1
15; LA64-NEXT:    jirl $zero, $ra, 0
16  %sub = sub i1 %x, %y
17  ret i1 %sub
18}
19
20define i8 @sub_i8(i8 %x, i8 %y) {
21; LA32-LABEL: sub_i8:
22; LA32:       # %bb.0:
23; LA32-NEXT:    sub.w $a0, $a0, $a1
24; LA32-NEXT:    jirl $zero, $ra, 0
25;
26; LA64-LABEL: sub_i8:
27; LA64:       # %bb.0:
28; LA64-NEXT:    sub.d $a0, $a0, $a1
29; LA64-NEXT:    jirl $zero, $ra, 0
30  %sub = sub i8 %x, %y
31  ret i8 %sub
32}
33
34define i16 @sub_i16(i16 %x, i16 %y) {
35; LA32-LABEL: sub_i16:
36; LA32:       # %bb.0:
37; LA32-NEXT:    sub.w $a0, $a0, $a1
38; LA32-NEXT:    jirl $zero, $ra, 0
39;
40; LA64-LABEL: sub_i16:
41; LA64:       # %bb.0:
42; LA64-NEXT:    sub.d $a0, $a0, $a1
43; LA64-NEXT:    jirl $zero, $ra, 0
44  %sub = sub i16 %x, %y
45  ret i16 %sub
46}
47
48define i32 @sub_i32(i32 %x, i32 %y) {
49; LA32-LABEL: sub_i32:
50; LA32:       # %bb.0:
51; LA32-NEXT:    sub.w $a0, $a0, $a1
52; LA32-NEXT:    jirl $zero, $ra, 0
53;
54; LA64-LABEL: sub_i32:
55; LA64:       # %bb.0:
56; LA64-NEXT:    sub.d $a0, $a0, $a1
57; LA64-NEXT:    jirl $zero, $ra, 0
58  %sub = sub i32 %x, %y
59  ret i32 %sub
60}
61
62;; Match the pattern:
63;; def : PatGprGpr_32<sub, SUB_W>;
64define signext i32 @sub_i32_sext(i32 %x, i32 %y) {
65; LA32-LABEL: sub_i32_sext:
66; LA32:       # %bb.0:
67; LA32-NEXT:    sub.w $a0, $a0, $a1
68; LA32-NEXT:    jirl $zero, $ra, 0
69;
70; LA64-LABEL: sub_i32_sext:
71; LA64:       # %bb.0:
72; LA64-NEXT:    sub.w $a0, $a0, $a1
73; LA64-NEXT:    jirl $zero, $ra, 0
74  %sub = sub i32 %x, %y
75  ret i32 %sub
76}
77
78define i64 @sub_i64(i64 %x, i64 %y) {
79; LA32-LABEL: sub_i64:
80; LA32:       # %bb.0:
81; LA32-NEXT:    sub.w $a1, $a1, $a3
82; LA32-NEXT:    sltu $a3, $a0, $a2
83; LA32-NEXT:    sub.w $a1, $a1, $a3
84; LA32-NEXT:    sub.w $a0, $a0, $a2
85; LA32-NEXT:    jirl $zero, $ra, 0
86;
87; LA64-LABEL: sub_i64:
88; LA64:       # %bb.0:
89; LA64-NEXT:    sub.d $a0, $a0, $a1
90; LA64-NEXT:    jirl $zero, $ra, 0
91  %sub = sub i64 %x, %y
92  ret i64 %sub
93}
94