1; RUN: llc < %s -mtriple=ve-unknown-unknown | FileCheck %s
2
3define signext i8 @func1(i8 signext %0, i8 signext %1) {
4; CHECK-LABEL: func1:
5; CHECK:       .LBB{{[0-9]+}}_2:
6; CHECK-NEXT:    subs.w.sx %s0, %s0, %s1
7; CHECK-NEXT:    sla.w.sx %s0, %s0, 24
8; CHECK-NEXT:    sra.w.sx %s0, %s0, 24
9; CHECK-NEXT:    or %s11, 0, %s9
10  %3 = sub i8 %0, %1
11  ret i8 %3
12}
13
14define signext i16 @func2(i16 signext %0, i16 signext %1) {
15; CHECK-LABEL: func2:
16; CHECK:       .LBB{{[0-9]+}}_2:
17; CHECK-NEXT:    subs.w.sx %s0, %s0, %s1
18; CHECK-NEXT:    sla.w.sx %s0, %s0, 16
19; CHECK-NEXT:    sra.w.sx %s0, %s0, 16
20; CHECK-NEXT:    or %s11, 0, %s9
21  %3 = sub i16 %0, %1
22  ret i16 %3
23}
24
25define i32 @func3(i32 %0, i32 %1) {
26; CHECK-LABEL: func3:
27; CHECK:       .LBB{{[0-9]+}}_2:
28; CHECK-NEXT:    subs.w.sx %s0, %s0, %s1
29; CHECK-NEXT:    or %s11, 0, %s9
30  %3 = sub nsw i32 %0, %1
31  ret i32 %3
32}
33
34define i64 @func4(i64 %0, i64 %1) {
35; CHECK-LABEL: func4:
36; CHECK:       .LBB{{[0-9]+}}_2:
37; CHECK-NEXT:    subs.l %s0, %s0, %s1
38; CHECK-NEXT:    or %s11, 0, %s9
39  %3 = sub nsw i64 %0, %1
40  ret i64 %3
41}
42
43define zeroext i8 @func6(i8 zeroext %0, i8 zeroext %1) {
44; CHECK-LABEL: func6:
45; CHECK:       .LBB{{[0-9]+}}_2:
46; CHECK-NEXT:    subs.w.sx %s0, %s0, %s1
47; CHECK-NEXT:    and %s0, %s0, (56)0
48; CHECK-NEXT:    or %s11, 0, %s9
49  %3 = sub i8 %0, %1
50  ret i8 %3
51}
52
53define zeroext i16 @func7(i16 zeroext %0, i16 zeroext %1) {
54; CHECK-LABEL: func7:
55; CHECK:       .LBB{{[0-9]+}}_2:
56; CHECK-NEXT:    subs.w.sx %s0, %s0, %s1
57; CHECK-NEXT:    and %s0, %s0, (48)0
58; CHECK-NEXT:    or %s11, 0, %s9
59  %3 = sub i16 %0, %1
60  ret i16 %3
61}
62
63define i32 @func8(i32 %0, i32 %1) {
64; CHECK-LABEL: func8:
65; CHECK:       .LBB{{[0-9]+}}_2:
66; CHECK-NEXT:    subs.w.sx %s0, %s0, %s1
67; CHECK-NEXT:    or %s11, 0, %s9
68  %3 = sub i32 %0, %1
69  ret i32 %3
70}
71
72define i64 @func9(i64 %0, i64 %1) {
73; CHECK-LABEL: func9:
74; CHECK:       .LBB{{[0-9]+}}_2:
75; CHECK-NEXT:    subs.l %s0, %s0, %s1
76; CHECK-NEXT:    or %s11, 0, %s9
77  %3 = sub i64 %0, %1
78  ret i64 %3
79}
80
81define signext i8 @func13(i8 signext %0, i8 signext %1) {
82; CHECK-LABEL: func13:
83; CHECK:       .LBB{{[0-9]+}}_2:
84; CHECK-NEXT:    adds.w.sx %s0, -5, %s0
85; CHECK-NEXT:    sla.w.sx %s0, %s0, 24
86; CHECK-NEXT:    sra.w.sx %s0, %s0, 24
87; CHECK-NEXT:    or %s11, 0, %s9
88  %3 = add i8 %0, -5
89  ret i8 %3
90}
91
92define signext i16 @func14(i16 signext %0, i16 signext %1) {
93; CHECK-LABEL: func14:
94; CHECK:       .LBB{{[0-9]+}}_2:
95; CHECK-NEXT:    adds.w.sx %s0, -5, %s0
96; CHECK-NEXT:    sla.w.sx %s0, %s0, 16
97; CHECK-NEXT:    sra.w.sx %s0, %s0, 16
98; CHECK-NEXT:    or %s11, 0, %s9
99  %3 = add i16 %0, -5
100  ret i16 %3
101}
102
103define i32 @func15(i32 %0, i32 %1) {
104; CHECK-LABEL: func15:
105; CHECK:       .LBB{{[0-9]+}}_2:
106; CHECK-NEXT:    adds.w.sx %s0, -5, %s0
107; CHECK-NEXT:    or %s11, 0, %s9
108  %3 = add nsw i32 %0, -5
109  ret i32 %3
110}
111
112define i64 @func16(i64 %0, i64 %1) {
113; CHECK-LABEL: func16:
114; CHECK:       .LBB{{[0-9]+}}_2:
115; CHECK-NEXT:    lea %s0, -5(, %s0)
116; CHECK-NEXT:    or %s11, 0, %s9
117  %3 = add nsw i64 %0, -5
118  ret i64 %3
119}
120
121define zeroext i8 @func18(i8 zeroext %0, i8 zeroext %1) {
122; CHECK-LABEL: func18:
123; CHECK:       .LBB{{[0-9]+}}_2:
124; CHECK-NEXT:    adds.w.sx %s0, -5, %s0
125; CHECK-NEXT:    and %s0, %s0, (56)0
126; CHECK-NEXT:    or %s11, 0, %s9
127  %3 = add i8 %0, -5
128  ret i8 %3
129}
130
131define zeroext i16 @func19(i16 zeroext %0, i16 zeroext %1) {
132; CHECK-LABEL: func19:
133; CHECK:       .LBB{{[0-9]+}}_2:
134; CHECK-NEXT:    adds.w.sx %s0, -5, %s0
135; CHECK-NEXT:    and %s0, %s0, (48)0
136; CHECK-NEXT:    or %s11, 0, %s9
137  %3 = add i16 %0, -5
138  ret i16 %3
139}
140
141define i32 @func20(i32 %0, i32 %1) {
142; CHECK-LABEL: func20:
143; CHECK:       .LBB{{[0-9]+}}_2:
144; CHECK-NEXT:    adds.w.sx %s0, -5, %s0
145; CHECK-NEXT:    or %s11, 0, %s9
146  %3 = add i32 %0, -5
147  ret i32 %3
148}
149
150define i64 @func21(i64 %0, i64 %1) {
151; CHECK-LABEL: func21:
152; CHECK:       .LBB{{[0-9]+}}_2:
153; CHECK-NEXT:    lea %s0, -5(, %s0)
154; CHECK-NEXT:    or %s11, 0, %s9
155  %3 = add i64 %0, -5
156  ret i64 %3
157}
158
159define i64 @func26(i64 %0, i64 %1) {
160; CHECK-LABEL: func26:
161; CHECK:       .LBB{{[0-9]+}}_2:
162; CHECK-NEXT:    lea %s0, -2147483648(, %s0)
163; CHECK-NEXT:    or %s11, 0, %s9
164  %3 = add nsw i64 %0, -2147483648
165  ret i64 %3
166}
167
168