1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \
3; RUN:   -mcpu=pwr8 < %s | FileCheck %s
4; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \
5; RUN:   -mcpu=pwr7 < %s | FileCheck %s
6; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-aix \
7; RUN:   -mcpu=pwr7 < %s | FileCheck %s
8; RUN: llc -verify-machineinstrs -mtriple=powerpc-unknown-aix \
9; RUN:   -mcpu=pwr7 < %s | FileCheck %s --check-prefix=CHECK-32BIT
10
11declare i32 @llvm.ppc.mftbu()
12declare i32 @llvm.ppc.mfmsr()
13declare void @llvm.ppc.mtmsr(i32)
14
15@ula = external local_unnamed_addr global i64, align 8
16
17define dso_local zeroext i32 @test_mftbu() {
18; CHECK-LABEL: test_mftbu:
19; CHECK:       # %bb.0: # %entry
20; CHECK-NEXT:    mftbu 3
21; CHECK-NEXT:    clrldi 3, 3, 32
22; CHECK-NEXT:    blr
23;
24; CHECK-32BIT-LABEL: test_mftbu:
25; CHECK-32BIT:       # %bb.0: # %entry
26; CHECK-32BIT-NEXT:    mftbu 3
27; CHECK-32BIT-NEXT:    blr
28entry:
29  %0 = tail call i32 @llvm.ppc.mftbu()
30  ret i32 %0
31}
32
33define dso_local i64 @test_mfmsr() {
34; CHECK-LABEL: test_mfmsr:
35; CHECK:       # %bb.0: # %entry
36; CHECK-NEXT:    mfmsr 3
37; CHECK-NEXT:    clrldi 3, 3, 32
38; CHECK-NEXT:    blr
39;
40; CHECK-32BIT-LABEL: test_mfmsr:
41; CHECK-32BIT:       # %bb.0: # %entry
42; CHECK-32BIT-NEXT:    mfmsr 4
43; CHECK-32BIT-NEXT:    li 3, 0
44; CHECK-32BIT-NEXT:    blr
45entry:
46  %0 = tail call i32 @llvm.ppc.mfmsr()
47  %conv = zext i32 %0 to i64
48  ret i64 %conv
49}
50
51define dso_local void @test_mtmsr() {
52; CHECK-LABEL: test_mtmsr:
53; CHECK:    mtmsr 3
54; CHECK-NEXT:    blr
55;
56; CHECK-32BIT-LABEL: test_mtmsr:
57; CHECK-32BIT:       # %bb.0: # %entry
58; CHECK-32BIT-NEXT:    lwz 3, L..C0(2) # @ula
59; CHECK-32BIT-NEXT:    lwz 3, 4(3)
60; CHECK-32BIT-NEXT:    mtmsr 3, 0
61; CHECK-32BIT-NEXT:    blr
62entry:
63  %0 = load i64, i64* @ula, align 8
64  %conv = trunc i64 %0 to i32
65  call void @llvm.ppc.mtmsr(i32 %conv)
66  ret void
67}
68