• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: llc -march=r600 -mcpu=SI -verify-machineinstrs< %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
2; RUN: llc -march=r600 -mcpu=cypress -verify-machineinstrs< %s
3
4declare { i32, i1 } @llvm.uadd.with.overflow.i32(i32, i32) nounwind readnone
5declare { i64, i1 } @llvm.uadd.with.overflow.i64(i64, i64) nounwind readnone
6
7; FUNC-LABEL: @uaddo_i64_zext
8; SI: ADD
9; SI: ADDC
10; SI: ADDC
11define void @uaddo_i64_zext(i64 addrspace(1)* %out, i64 %a, i64 %b) nounwind {
12  %uadd = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 %a, i64 %b) nounwind
13  %val = extractvalue { i64, i1 } %uadd, 0
14  %carry = extractvalue { i64, i1 } %uadd, 1
15  %ext = zext i1 %carry to i64
16  %add2 = add i64 %val, %ext
17  store i64 %add2, i64 addrspace(1)* %out, align 8
18  ret void
19}
20
21; FUNC-LABEL: @s_uaddo_i32
22; SI: S_ADD_I32
23define void @s_uaddo_i32(i32 addrspace(1)* %out, i1 addrspace(1)* %carryout, i32 %a, i32 %b) nounwind {
24  %uadd = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %a, i32 %b) nounwind
25  %val = extractvalue { i32, i1 } %uadd, 0
26  %carry = extractvalue { i32, i1 } %uadd, 1
27  store i32 %val, i32 addrspace(1)* %out, align 4
28  store i1 %carry, i1 addrspace(1)* %carryout
29  ret void
30}
31
32; FUNC-LABEL: @v_uaddo_i32
33; SI: V_ADD_I32
34define void @v_uaddo_i32(i32 addrspace(1)* %out, i1 addrspace(1)* %carryout, i32 addrspace(1)* %aptr, i32 addrspace(1)* %bptr) nounwind {
35  %a = load i32 addrspace(1)* %aptr, align 4
36  %b = load i32 addrspace(1)* %bptr, align 4
37  %uadd = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %a, i32 %b) nounwind
38  %val = extractvalue { i32, i1 } %uadd, 0
39  %carry = extractvalue { i32, i1 } %uadd, 1
40  store i32 %val, i32 addrspace(1)* %out, align 4
41  store i1 %carry, i1 addrspace(1)* %carryout
42  ret void
43}
44
45; FUNC-LABEL: @s_uaddo_i64
46; SI: S_ADD_I32
47; SI: S_ADDC_U32
48define void @s_uaddo_i64(i64 addrspace(1)* %out, i1 addrspace(1)* %carryout, i64 %a, i64 %b) nounwind {
49  %uadd = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 %a, i64 %b) nounwind
50  %val = extractvalue { i64, i1 } %uadd, 0
51  %carry = extractvalue { i64, i1 } %uadd, 1
52  store i64 %val, i64 addrspace(1)* %out, align 8
53  store i1 %carry, i1 addrspace(1)* %carryout
54  ret void
55}
56
57; FUNC-LABEL: @v_uaddo_i64
58; SI: V_ADD_I32
59; SI: V_ADDC_U32
60define void @v_uaddo_i64(i64 addrspace(1)* %out, i1 addrspace(1)* %carryout, i64 addrspace(1)* %aptr, i64 addrspace(1)* %bptr) nounwind {
61  %a = load i64 addrspace(1)* %aptr, align 4
62  %b = load i64 addrspace(1)* %bptr, align 4
63  %uadd = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 %a, i64 %b) nounwind
64  %val = extractvalue { i64, i1 } %uadd, 0
65  %carry = extractvalue { i64, i1 } %uadd, 1
66  store i64 %val, i64 addrspace(1)* %out, align 8
67  store i1 %carry, i1 addrspace(1)* %carryout
68  ret void
69}
70