xref: /llvm-project/llvm/test/CodeGen/Mips/cconv/return.ll (revision 8663926a544602932d299dda435ed1ef70a05f48)
1; RUN: llc -mtriple=mips-linux-gnu -relocation-model=static < %s | FileCheck --check-prefixes=ALL,O32 %s
2; RUN: llc -mtriple=mipsel-linux-gnu -relocation-model=static < %s | FileCheck --check-prefixes=ALL,O32 %s
3
4; RUN-TODO: llc -mtriple=mips64-linux-gnu -relocation-model=static -target-abi o32 < %s | FileCheck --check-prefixes=ALL,O32 %s
5; RUN-TODO: llc -mtriple=mips64el-linux-gnu -relocation-model=static -target-abi o32 < %s | FileCheck --check-prefixes=ALL,O32 %s
6
7; RUN: llc -mtriple=mips64-linux-gnu -relocation-model=static -target-abi n32 < %s | FileCheck --check-prefixes=ALL,N32 %s
8; RUN: llc -mtriple=mips64el-linux-gnu -relocation-model=static -target-abi n32 < %s | FileCheck --check-prefixes=ALL,N32 %s
9
10; RUN: llc -mtriple=mips64-linux-gnu -relocation-model=static -target-abi n64 < %s | FileCheck --check-prefixes=ALL,N64 %s
11; RUN: llc -mtriple=mips64el-linux-gnu -relocation-model=static -target-abi n64 < %s | FileCheck --check-prefixes=ALL,N64 %s
12
13; Test the integer returns for all ABI's and byte orders as specified by
14; section 5 of MD00305 (MIPS ABIs Described).
15
16; We only test Linux because other OS's use different relocations and I don't
17; know if this is correct.
18
19@byte = global i8 zeroinitializer
20@word = global i32 zeroinitializer
21@dword = global i64 zeroinitializer
22@float = global float zeroinitializer
23@double = global double zeroinitializer
24
25define i8 @reti8() nounwind {
26entry:
27        %0 = load volatile i8, ptr @byte
28        ret i8 %0
29}
30
31; ALL-LABEL: reti8:
32; O32-DAG:           lui [[R1:\$[0-9]+]], %hi(byte)
33; O32-DAG:           lbu $2, %lo(byte)([[R1]])
34; N32-DAG:           lui [[R1:\$[0-9]+]], %hi(byte)
35; N32-DAG:           lbu $2, %lo(byte)([[R1]])
36; N64-DAG:           lui  [[R1:\$[0-9]+]], %highest(byte)
37; N64-DAG:           lbu $2, %lo(byte)([[R1]])
38
39define i32 @reti32() nounwind {
40entry:
41        %0 = load volatile i32, ptr @word
42        ret i32 %0
43}
44
45; ALL-LABEL: reti32:
46; O32-DAG:           lui [[R1:\$[0-9]+]], %hi(word)
47; O32-DAG:           lw $2, %lo(word)([[R1]])
48; N32-DAG:           lui [[R1:\$[0-9]+]], %hi(word)
49; N32-DAG:           lw $2, %lo(word)([[R1]])
50; N64-DAG:           lui [[R1:\$[0-9]+]], %highest(word)
51; N64-DAG:           lw $2, %lo(word)([[R1]])
52
53define i64 @reti64() nounwind {
54entry:
55        %0 = load volatile i64, ptr @dword
56        ret i64 %0
57}
58
59; ALL-LABEL: reti64:
60; On O32, we must use v0 and v1 for the return value
61; O32-DAG:           lw $2, %lo(dword)([[R1:\$[0-9]+]])
62; O32-DAG:           addiu [[R2:\$[0-9]+]], [[R1]], %lo(dword)
63; O32-DAG:           lw $3, 4([[R2]])
64; N32-DAG:           ld $2, %lo(dword)([[R1:\$[0-9]+]])
65; N64-DAG:           lui  [[R1:\$[0-9]+]], %highest(dword)
66; N64-DAG:           ld $2, %lo(dword)([[R1]])
67