xref: /llvm-project/llvm/test/CodeGen/M68k/multiple-return.ll (revision 3006dddfe091bcb95924d72dddbb84f73186a344)
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
4define { i32, i32, i32, i32 } @test0() {
5; CHECK-LABEL: test0:
6; CHECK:         .cfi_startproc
7; CHECK-NEXT:  ; %bb.0: ; %start
8; CHECK-NEXT:    move.l (4,%sp), %a0
9; CHECK-NEXT:    move.l #23, (12,%a0)
10; CHECK-NEXT:    move.l #19, (8,%a0)
11; CHECK-NEXT:    move.l #17, (4,%a0)
12; CHECK-NEXT:    move.l #13, (%a0)
13; CHECK-NEXT:    move.l %a0, %d0
14; CHECK-NEXT:    move.l (%sp), %a1
15; CHECK-NEXT:    adda.l #4, %sp
16; CHECK-NEXT:    move.l %a1, (%sp)
17; CHECK-NEXT:    rts
18start:
19  ret { i32, i32, i32, i32 } { i32 13, i32 17, i32 19, i32 23 }
20}
21
22define void @call_test0() {
23; CHECK-LABEL: call_test0:
24; CHECK:         .cfi_startproc
25; CHECK-NEXT:  ; %bb.0: ; %start
26; CHECK-NEXT:    suba.l #20, %sp
27; CHECK-NEXT:    .cfi_def_cfa_offset -24
28; CHECK-NEXT:    lea (4,%sp), %a0
29; CHECK-NEXT:    move.l %a0, (%sp)
30; CHECK-NEXT:    jsr test0
31; CHECK-NEXT:    adda.l #16, %sp
32; CHECK-NEXT:    rts
33start:
34  %val = call { i32, i32, i32, i32 } @test0()
35  ret void
36}
37
38define void @test1(ptr sret({ i32, i32, i32, i32 }) %ret_val) {
39; CHECK-LABEL: test1:
40; CHECK:         .cfi_startproc
41; CHECK-NEXT:  ; %bb.0: ; %start
42; CHECK-NEXT:    move.l (4,%sp), %d0
43; CHECK-NEXT:    move.l (%sp), %a1
44; CHECK-NEXT:    adda.l #4, %sp
45; CHECK-NEXT:    move.l %a1, (%sp)
46; CHECK-NEXT:    rts
47start:
48  ret void
49}
50
51define void @call_test1() {
52; CHECK-LABEL: call_test1:
53; CHECK:         .cfi_startproc
54; CHECK-NEXT:  ; %bb.0: ; %start
55; CHECK-NEXT:    suba.l #20, %sp
56; CHECK-NEXT:    .cfi_def_cfa_offset -24
57; CHECK-NEXT:    lea (4,%sp), %a0
58; CHECK-NEXT:    move.l %a0, (%sp)
59; CHECK-NEXT:    jsr test1
60; CHECK-NEXT:    adda.l #16, %sp
61; CHECK-NEXT:    rts
62start:
63  %ret_val = alloca { i32, i32, i32, i32 }
64  call void @test1(ptr %ret_val)
65  ret void
66}
67
68define i32 @test2() {
69; CHECK-LABEL: test2:
70; CHECK:         .cfi_startproc
71; CHECK-NEXT:  ; %bb.0: ; %start
72; CHECK-NEXT:    moveq #13, %d0
73; CHECK-NEXT:    rts
74start:
75  ret i32 13
76}
77
78define void @call_test2() {
79; CHECK-LABEL: call_test2:
80; CHECK:         .cfi_startproc
81; CHECK-NEXT:  ; %bb.0: ; %start
82; CHECK-NEXT:    suba.l #4, %sp
83; CHECK-NEXT:    .cfi_def_cfa_offset -8
84; CHECK-NEXT:    jsr test2
85; CHECK-NEXT:    adda.l #4, %sp
86; CHECK-NEXT:    rts
87start:
88  %0 = call i32 @test2()
89  ret void
90}
91