xref: /llvm-project/llvm/test/CodeGen/PowerPC/saddo-ssubo.ll (revision 68e75eebec4cf5fc7eef7d9525b276c4ff5e1b17)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64le-unknown-linux-gnu | FileCheck %s
3
4declare { i8, i1 } @llvm.sadd.with.overflow.i8(i8, i8) nounwind readnone
5declare { i16, i1 } @llvm.sadd.with.overflow.i16(i16, i16) nounwind readnone
6declare { i32, i1 } @llvm.sadd.with.overflow.i32(i32, i32) nounwind readnone
7declare { i64, i1 } @llvm.sadd.with.overflow.i64(i64, i64) nounwind readnone
8declare { <4 x i32>, <4 x i1> } @llvm.sadd.with.overflow.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
9declare { i8, i1 } @llvm.ssub.with.overflow.i8(i8, i8) nounwind readnone
10declare { i16, i1 } @llvm.ssub.with.overflow.i16(i16, i16) nounwind readnone
11declare { i32, i1 } @llvm.ssub.with.overflow.i32(i32, i32) nounwind readnone
12declare { i64, i1 } @llvm.ssub.with.overflow.i64(i64, i64) nounwind readnone
13declare { <4 x i32>, <4 x i1> } @llvm.ssub.with.overflow.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
14
15define i1 @test_saddo_i8(i8 %a, i8 %b) nounwind {
16; CHECK-LABEL: test_saddo_i8:
17; CHECK:       # %bb.0: # %entry
18; CHECK-NEXT:    extsb 4, 4
19; CHECK-NEXT:    extsb 3, 3
20; CHECK-NEXT:    add 3, 3, 4
21; CHECK-NEXT:    extsb 4, 3
22; CHECK-NEXT:    cmpw 4, 3
23; CHECK-NEXT:    li 3, 1
24; CHECK-NEXT:    iseleq 3, 0, 3
25; CHECK-NEXT:    blr
26entry:
27  %res = call { i8, i1 } @llvm.sadd.with.overflow.i8(i8 %a, i8 %b) nounwind
28  %overflow = extractvalue { i8, i1 } %res, 1
29  ret i1 %overflow
30}
31
32define i1 @test_saddo_i16(i16 %a, i16 %b) nounwind {
33; CHECK-LABEL: test_saddo_i16:
34; CHECK:       # %bb.0: # %entry
35; CHECK-NEXT:    extsh 4, 4
36; CHECK-NEXT:    extsh 3, 3
37; CHECK-NEXT:    add 3, 3, 4
38; CHECK-NEXT:    extsh 4, 3
39; CHECK-NEXT:    cmpw 4, 3
40; CHECK-NEXT:    li 3, 1
41; CHECK-NEXT:    iseleq 3, 0, 3
42; CHECK-NEXT:    blr
43entry:
44  %res = call { i16, i1 } @llvm.sadd.with.overflow.i16(i16 %a, i16 %b) nounwind
45  %overflow = extractvalue { i16, i1 } %res, 1
46  ret i1 %overflow
47}
48
49define i1 @test_saddo_i32(i32 %a, i32 %b) nounwind {
50; CHECK-LABEL: test_saddo_i32:
51; CHECK:       # %bb.0: # %entry
52; CHECK-NEXT:    add 5, 3, 4
53; CHECK-NEXT:    cmpwi 1, 4, 0
54; CHECK-NEXT:    cmpw 5, 3
55; CHECK-NEXT:    li 3, 1
56; CHECK-NEXT:    creqv 20, 4, 0
57; CHECK-NEXT:    isel 3, 0, 3, 20
58; CHECK-NEXT:    blr
59entry:
60  %res = call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %a, i32 %b) nounwind
61  %overflow = extractvalue { i32, i1 } %res, 1
62  ret i1 %overflow
63}
64
65define i1 @test_saddo_i64(i64 %a, i64 %b) nounwind {
66; CHECK-LABEL: test_saddo_i64:
67; CHECK:       # %bb.0: # %entry
68; CHECK-NEXT:    add 5, 3, 4
69; CHECK-NEXT:    cmpdi 1, 4, 0
70; CHECK-NEXT:    cmpd 5, 3
71; CHECK-NEXT:    li 3, 1
72; CHECK-NEXT:    creqv 20, 4, 0
73; CHECK-NEXT:    isel 3, 0, 3, 20
74; CHECK-NEXT:    blr
75entry:
76  %res = call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %a, i64 %b) nounwind
77  %overflow = extractvalue { i64, i1 } %res, 1
78  ret i1 %overflow
79}
80
81define <4 x i1> @test_saddo_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
82; CHECK-LABEL: test_saddo_v4i32:
83; CHECK:       # %bb.0: # %entry
84; CHECK-NEXT:    vaddsws 4, 2, 3
85; CHECK-NEXT:    vadduwm 2, 2, 3
86; CHECK-NEXT:    vcmpequw 2, 2, 4
87; CHECK-NEXT:    xxlnor 34, 34, 34
88; CHECK-NEXT:    blr
89entry:
90  %res = call { <4 x i32>, <4 x i1> } @llvm.sadd.with.overflow.v4i32(<4 x i32> %a, <4 x i32> %b) nounwind
91  %overflow = extractvalue { <4 x i32>, <4 x i1> } %res, 1
92  ret <4 x i1> %overflow
93}
94
95define i1 @test_ssubo_i8(i8 %a, i8 %b) nounwind {
96; CHECK-LABEL: test_ssubo_i8:
97; CHECK:       # %bb.0: # %entry
98; CHECK-NEXT:    extsb 3, 3
99; CHECK-NEXT:    extsb 4, 4
100; CHECK-NEXT:    sub 3, 3, 4
101; CHECK-NEXT:    extsb 4, 3
102; CHECK-NEXT:    cmpw 4, 3
103; CHECK-NEXT:    li 3, 1
104; CHECK-NEXT:    iseleq 3, 0, 3
105; CHECK-NEXT:    blr
106entry:
107  %res = call { i8, i1 } @llvm.ssub.with.overflow.i8(i8 %a, i8 %b) nounwind
108  %overflow = extractvalue { i8, i1 } %res, 1
109  ret i1 %overflow
110}
111
112define i1 @test_ssubo_i16(i16 %a, i16 %b) nounwind {
113; CHECK-LABEL: test_ssubo_i16:
114; CHECK:       # %bb.0: # %entry
115; CHECK-NEXT:    extsh 3, 3
116; CHECK-NEXT:    extsh 4, 4
117; CHECK-NEXT:    sub 3, 3, 4
118; CHECK-NEXT:    extsh 4, 3
119; CHECK-NEXT:    cmpw 4, 3
120; CHECK-NEXT:    li 3, 1
121; CHECK-NEXT:    iseleq 3, 0, 3
122; CHECK-NEXT:    blr
123entry:
124  %res = call { i16, i1 } @llvm.ssub.with.overflow.i16(i16 %a, i16 %b) nounwind
125  %overflow = extractvalue { i16, i1 } %res, 1
126  ret i1 %overflow
127}
128
129define i1 @test_ssubo_i32(i32 %a, i32 %b) nounwind {
130; CHECK-LABEL: test_ssubo_i32:
131; CHECK:       # %bb.0: # %entry
132; CHECK-NEXT:    xor 5, 4, 3
133; CHECK-NEXT:    sub 4, 3, 4
134; CHECK-NEXT:    xor 3, 4, 3
135; CHECK-NEXT:    and 3, 5, 3
136; CHECK-NEXT:    srwi 3, 3, 31
137; CHECK-NEXT:    blr
138entry:
139  %res = call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 %a, i32 %b) nounwind
140  %overflow = extractvalue { i32, i1 } %res, 1
141  ret i1 %overflow
142}
143
144define i1 @test_ssubo_i64(i64 %a, i64 %b) nounwind {
145; CHECK-LABEL: test_ssubo_i64:
146; CHECK:       # %bb.0: # %entry
147; CHECK-NEXT:    xor 5, 4, 3
148; CHECK-NEXT:    sub 4, 3, 4
149; CHECK-NEXT:    xor 3, 4, 3
150; CHECK-NEXT:    and 3, 5, 3
151; CHECK-NEXT:    rldicl 3, 3, 1, 63
152; CHECK-NEXT:    blr
153entry:
154  %res = call { i64, i1 } @llvm.ssub.with.overflow.i64(i64 %a, i64 %b) nounwind
155  %overflow = extractvalue { i64, i1 } %res, 1
156  ret i1 %overflow
157}
158
159define <4 x i1> @test_ssubo_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
160; CHECK-LABEL: test_ssubo_v4i32:
161; CHECK:       # %bb.0: # %entry
162; CHECK-NEXT:    vsubsws 4, 2, 3
163; CHECK-NEXT:    vsubuwm 2, 2, 3
164; CHECK-NEXT:    vcmpequw 2, 2, 4
165; CHECK-NEXT:    xxlnor 34, 34, 34
166; CHECK-NEXT:    blr
167entry:
168  %res = call { <4 x i32>, <4 x i1> } @llvm.ssub.with.overflow.v4i32(<4 x i32> %a, <4 x i32> %b) nounwind
169  %overflow = extractvalue { <4 x i32>, <4 x i1> } %res, 1
170  ret <4 x i1> %overflow
171}
172