xref: /llvm-project/llvm/test/CodeGen/M68k/Arith/sub-with-overflow.ll (revision ebbc5de7db45b2fc81564a6c870a57f4b95d0477)
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 @printf(ptr, ...) nounwind
5declare {i32, i1} @llvm.ssub.with.overflow.i32(i32, i32)
6declare {i32, i1} @llvm.usub.with.overflow.i32(i32, i32)
7
8@ok = internal constant [4 x i8] c"%d\0A\00"
9@no = internal constant [4 x i8] c"no\0A\00"
10
11define i1 @func1(i32 %v1, i32 %v2) nounwind {
12; CHECK-LABEL: func1:
13; CHECK:       ; %bb.0: ; %entry
14; CHECK-NEXT:    suba.l #12, %sp
15; CHECK-NEXT:    move.l (16,%sp), %d0
16; CHECK-NEXT:    sub.l (20,%sp), %d0
17; CHECK-NEXT:    bvc .LBB0_1
18; CHECK-NEXT:  ; %bb.2: ; %overflow
19; CHECK-NEXT:    lea (no,%pc), %a0
20; CHECK-NEXT:    move.l %a0, (%sp)
21; CHECK-NEXT:    jsr printf
22; CHECK-NEXT:    moveq #0, %d0
23; CHECK-NEXT:    adda.l #12, %sp
24; CHECK-NEXT:    rts
25; CHECK-NEXT:  .LBB0_1: ; %normal
26; CHECK-NEXT:    move.l %d0, (4,%sp)
27; CHECK-NEXT:    lea (ok,%pc), %a0
28; CHECK-NEXT:    move.l %a0, (%sp)
29; CHECK-NEXT:    jsr printf
30; CHECK-NEXT:    moveq #1, %d0
31; CHECK-NEXT:    adda.l #12, %sp
32; CHECK-NEXT:    rts
33entry:
34  %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2)
35  %sum = extractvalue {i32, i1} %t, 0
36  %obit = extractvalue {i32, i1} %t, 1
37  br i1 %obit, label %overflow, label %normal
38
39normal:
40  %t1 = tail call i32 (ptr, ...) @printf( ptr @ok, i32 %sum ) nounwind
41  ret i1 true
42
43overflow:
44  %t2 = tail call i32 (ptr, ...) @printf( ptr @no ) nounwind
45  ret i1 false
46}
47
48define i1 @func2(i32 %v1, i32 %v2) nounwind {
49; CHECK-LABEL: func2:
50; CHECK:       ; %bb.0: ; %entry
51; CHECK-NEXT:    suba.l #12, %sp
52; CHECK-NEXT:    move.l (16,%sp), %d0
53; CHECK-NEXT:    sub.l (20,%sp), %d0
54; CHECK-NEXT:    bcc .LBB1_1
55; CHECK-NEXT:  ; %bb.2: ; %carry
56; CHECK-NEXT:    lea (no,%pc), %a0
57; CHECK-NEXT:    move.l %a0, (%sp)
58; CHECK-NEXT:    jsr printf
59; CHECK-NEXT:    moveq #0, %d0
60; CHECK-NEXT:    adda.l #12, %sp
61; CHECK-NEXT:    rts
62; CHECK-NEXT:  .LBB1_1: ; %normal
63; CHECK-NEXT:    move.l %d0, (4,%sp)
64; CHECK-NEXT:    lea (ok,%pc), %a0
65; CHECK-NEXT:    move.l %a0, (%sp)
66; CHECK-NEXT:    jsr printf
67; CHECK-NEXT:    moveq #1, %d0
68; CHECK-NEXT:    adda.l #12, %sp
69; CHECK-NEXT:    rts
70entry:
71  %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2)
72  %sum = extractvalue {i32, i1} %t, 0
73  %obit = extractvalue {i32, i1} %t, 1
74  br i1 %obit, label %carry, label %normal
75
76normal:
77  %t1 = tail call i32 (ptr, ...) @printf( ptr @ok, i32 %sum ) nounwind
78  ret i1 true
79
80carry:
81  %t2 = tail call i32 (ptr, ...) @printf( ptr @no ) nounwind
82  ret i1 false
83}
84
85define i1 @func3(i32 %x) nounwind {
86; CHECK-LABEL: func3:
87; CHECK:       ; %bb.0: ; %entry
88; CHECK-NEXT:    moveq #-1, %d0
89; CHECK-NEXT:    add.l (4,%sp), %d0
90; CHECK-NEXT:    svs %d0
91; CHECK-NEXT:    rts
92entry:
93  %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %x, i32 1)
94  %obit = extractvalue {i32, i1} %t, 1
95  ret i1 %obit
96}
97