1; RUN: llc < %s -march=ppc32 -mcpu=ppc32 | FileCheck %s -check-prefix=X32
2; RUN: llc < %s -march=ppc64 -mcpu=ppc64 | FileCheck %s -check-prefix=X64
3; RUN: llc < %s -march=ppc64 -mcpu=pwr7 | FileCheck %s -check-prefix=PWR7
4; RUN: llc < %s -march=ppc32 -mcpu=pwr7 | FileCheck %s -check-prefix=X32
5
6
7define void @STWBRX(i32 %i, i8* %ptr, i32 %off) {
8        %tmp1 = getelementptr i8* %ptr, i32 %off                ; <i8*> [#uses=1]
9        %tmp1.upgrd.1 = bitcast i8* %tmp1 to i32*               ; <i32*> [#uses=1]
10        %tmp13 = tail call i32 @llvm.bswap.i32( i32 %i )                ; <i32> [#uses=1]
11        store i32 %tmp13, i32* %tmp1.upgrd.1
12        ret void
13}
14
15define i32 @LWBRX(i8* %ptr, i32 %off) {
16        %tmp1 = getelementptr i8* %ptr, i32 %off                ; <i8*> [#uses=1]
17        %tmp1.upgrd.2 = bitcast i8* %tmp1 to i32*               ; <i32*> [#uses=1]
18        %tmp = load i32* %tmp1.upgrd.2          ; <i32> [#uses=1]
19        %tmp14 = tail call i32 @llvm.bswap.i32( i32 %tmp )              ; <i32> [#uses=1]
20        ret i32 %tmp14
21}
22
23define void @STHBRX(i16 %s, i8* %ptr, i32 %off) {
24        %tmp1 = getelementptr i8* %ptr, i32 %off                ; <i8*> [#uses=1]
25        %tmp1.upgrd.3 = bitcast i8* %tmp1 to i16*               ; <i16*> [#uses=1]
26        %tmp5 = call i16 @llvm.bswap.i16( i16 %s )              ; <i16> [#uses=1]
27        store i16 %tmp5, i16* %tmp1.upgrd.3
28        ret void
29}
30
31define i16 @LHBRX(i8* %ptr, i32 %off) {
32        %tmp1 = getelementptr i8* %ptr, i32 %off                ; <i8*> [#uses=1]
33        %tmp1.upgrd.4 = bitcast i8* %tmp1 to i16*               ; <i16*> [#uses=1]
34        %tmp = load i16* %tmp1.upgrd.4          ; <i16> [#uses=1]
35        %tmp6 = call i16 @llvm.bswap.i16( i16 %tmp )            ; <i16> [#uses=1]
36        ret i16 %tmp6
37}
38
39define void @STDBRX(i64 %i, i8* %ptr, i64 %off) {
40        %tmp1 = getelementptr i8* %ptr, i64 %off                ; <i8*> [#uses=1]
41        %tmp1.upgrd.1 = bitcast i8* %tmp1 to i64*               ; <i64*> [#uses=1]
42        %tmp13 = tail call i64 @llvm.bswap.i64( i64 %i )                ; <i64> [#uses=1]
43        store i64 %tmp13, i64* %tmp1.upgrd.1
44        ret void
45}
46
47define i64 @LDBRX(i8* %ptr, i64 %off) {
48        %tmp1 = getelementptr i8* %ptr, i64 %off                ; <i8*> [#uses=1]
49        %tmp1.upgrd.2 = bitcast i8* %tmp1 to i64*               ; <i64*> [#uses=1]
50        %tmp = load i64* %tmp1.upgrd.2          ; <i64> [#uses=1]
51        %tmp14 = tail call i64 @llvm.bswap.i64( i64 %tmp )              ; <i64> [#uses=1]
52        ret i64 %tmp14
53}
54
55declare i32 @llvm.bswap.i32(i32)
56
57declare i16 @llvm.bswap.i16(i16)
58
59declare i64 @llvm.bswap.i64(i64)
60
61
62; X32: stwbrx
63; X32: lwbrx
64; X32: sthbrx
65; X32: lhbrx
66; X32-NOT: ldbrx
67; X32-NOT: stdbrx
68
69; X64: stwbrx
70; X64: lwbrx
71; X64: sthbrx
72; X64: lhbrx
73; X64-NOT: ldbrx
74; X64-NOT: stdbrx
75
76; PWR7: stwbrx
77; PWR7: lwbrx
78; PWR7: sthbrx
79; PWR7: lhbrx
80; PWR7: stdbrx
81; PWR7: ldbrx
82
83