xref: /llvm-project/llvm/test/CodeGen/M68k/Arith/add-with-overflow.ll (revision c4c9d4f306732c854fa88d2f30c1a22bb025d0c9)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=m68k-linux -verify-machineinstrs | FileCheck %s
3
4declare {i32, i1} @llvm.sadd.with.overflow.i32(i32, i32)
5declare {i32, i1} @llvm.uadd.with.overflow.i32(i32, i32)
6
7define fastcc i32 @test5(i32 %v1, i32 %v2, ptr %X) nounwind {
8; CHECK-LABEL: test5:
9; CHECK:       ; %bb.0: ; %entry
10; CHECK-NEXT:    add.l %d1, %d0
11; CHECK-NEXT:    bvs .LBB0_2
12; CHECK-NEXT:  ; %bb.1: ; %normal
13; CHECK-NEXT:    move.l #0, (%a0)
14; CHECK-NEXT:  .LBB0_2: ; %overflow
15; CHECK-NEXT:    rts
16entry:
17  %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2)
18  %sum = extractvalue {i32, i1} %t, 0
19  %obit = extractvalue {i32, i1} %t, 1
20  br i1 %obit, label %overflow, label %normal
21
22normal:
23  store i32 0, ptr %X
24  br label %overflow
25
26overflow:
27  ret i32 %sum
28}
29
30define fastcc i1 @test6(i32 %v1, i32 %v2, ptr %X) nounwind {
31; CHECK-LABEL: test6:
32; CHECK:       ; %bb.0: ; %entry
33; CHECK-NEXT:    add.l %d1, %d0
34; CHECK-NEXT:    bcs .LBB1_2
35; CHECK-NEXT:  ; %bb.1: ; %normal
36; CHECK-NEXT:    move.l #0, (%a0)
37; CHECK-NEXT:  .LBB1_2: ; %carry
38; CHECK-NEXT:    moveq #0, %d0
39; CHECK-NEXT:    rts
40entry:
41  %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2)
42  %sum = extractvalue {i32, i1} %t, 0
43  %obit = extractvalue {i32, i1} %t, 1
44  br i1 %obit, label %carry, label %normal
45
46normal:
47  store i32 0, ptr %X
48  br label %carry
49
50carry:
51    ret i1 false
52}
53
54define {i32, i1} @test7(i32 %v1, i32 %v2) nounwind {
55; CHECK-LABEL: test7:
56; CHECK:       ; %bb.0:
57; CHECK-NEXT:    move.l (4,%sp), %d0
58; CHECK-NEXT:    add.l (8,%sp), %d0
59; CHECK-NEXT:    scs %d1
60; CHECK-NEXT:    rts
61  %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2)
62  ret {i32, i1} %t
63}
64
65define fastcc i1 @test10(i32 %x) nounwind {
66; CHECK-LABEL: test10:
67; CHECK:       ; %bb.0: ; %entry
68; CHECK-NEXT:    add.l #1, %d0
69; CHECK-NEXT:    svs %d0
70; CHECK-NEXT:    rts
71entry:
72  %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %x, i32 1)
73  %obit = extractvalue {i32, i1} %t, 1
74  ret i1 %obit
75}
76