1; RUN: llc -mtriple powerpc-ibm-aix-xcoff -verify-machineinstrs < %s \ 2; RUN: -stop-before=ppc-vsx-copy | FileCheck %s --check-prefix CHECK32 3; RUN: llc -mtriple powerpc64-ibm-aix-xcoff -verify-machineinstrs < %s \ 4; RUN: -stop-before=ppc-vsx-copy | FileCheck %s --check-prefix CHECK64 5; RUN: llc -mtriple powerpc-ibm-aix-xcoff -verify-machineinstrs < %s | FileCheck %s --check-prefix TEST32 6; RUN: llc -mtriple powerpc64-ibm-aix-xcoff -verify-machineinstrs < %s | FileCheck %s --check-prefix TEST64 7 8; RUN: llc -mtriple powerpc-ibm-aix-xcoff -verify-machineinstrs < %s \ 9; RUN: -stop-before=ppc-vsx-copy -O0 | FileCheck %s --check-prefix CHECK32 10; RUN: llc -mtriple powerpc64-ibm-aix-xcoff -verify-machineinstrs < %s \ 11; RUN: -stop-before=ppc-vsx-copy -O0 | FileCheck %s --check-prefix CHECK64-NOOPT 12; RUN: llc -mtriple powerpc-ibm-aix-xcoff -verify-machineinstrs -O0 < %s | FileCheck %s --check-prefix TEST32 13; RUN: llc -mtriple powerpc64-ibm-aix-xcoff -verify-machineinstrs -O0 < %s | FileCheck %s --check-prefix TEST64 14 15@i = dso_local global i32 0, align 4 #0 16@d = dso_local local_unnamed_addr global double 3.141590e+00, align 8 17@f = dso_local local_unnamed_addr global float 0x4005BE76C0000000, align 4 #0 18@ll = dso_local local_unnamed_addr global i64 55, align 8 19@ilocal = internal global i32 0, align 4 20 21define dso_local void @write_int(i32 signext %in) { 22 entry: 23 store i32 %in, i32* @i, align 4 24 ret void 25} 26; CHECK32: name: write_int 27; CHECK32: %[[SCRATCH:[0-9]+]]:gprc_and_gprc_nor0 = ADDItoc @i, $r2 28; CHECK32-NEXT: STW %{{[0-9]+}}, 0, killed %[[SCRATCH]] :: (store (s32) into @i) 29 30; TEST32: .write_int: 31; TEST32: la 4, i[TD](2) 32; TEST32-NEXT: stw 3, 0(4) 33 34; CHECK64: name: write_int 35; CHECK64: %[[SCRATCH:[0-9]+]]:g8rc_and_g8rc_nox0 = ADDItoc8 @i, $x2 36; CHECK64-NEXT: STW8 %{{[0-9]+}}, 0, killed %[[SCRATCH]] :: (store (s32) into @i) 37 38; CHECK64-NOOPT: name: write_int 39; CHECK64-NOOPT: %[[SUBREG:[0-9]+]]:gprc = COPY %{{[0-9]}}.sub_32 40; CHECK64-NOOPT: %[[ADDR:[0-9]+]]:g8rc_and_g8rc_nox0 = ADDItoc8 @i, $x2 :: (load (s64) from got) 41; CHECK64-NOOPT: STW %[[SUBREG]], 0, killed %[[ADDR]] :: (store (s32) into @i) 42 43; TEST64: .write_int: 44; TEST64: la 4, i[TD](2) 45; TEST64-NEXT: stw 3, 0(4) 46 47 48define dso_local i64 @read_ll() { 49 entry: 50 %0 = load i64, i64* @ll, align 8 51 ret i64 %0 52} 53; CHECK32: name: read_ll 54; CHECK32: LWZtoc @ll, $r2 :: (load (s32) from got) 55 56; TEST32: .read_ll: 57; TEST32: lwz 4, L..C0(2) 58; TEST32-NEXT: lwz 3, 0(4) 59; TEST32-NEXT: lwz 4, 4(4) 60 61; CHECK64: name: read_ll 62; CHECK64: %[[SCRATCH:[0-9]+]]:g8rc_and_g8rc_nox0 = LDtoc @ll, $x2 :: (load (s64) from got) 63; CHECK64: LD 0, killed %[[SCRATCH]] 64 65; CHECK64-NOOPT: name: read_ll 66; CHECK64-NOOPT: %[[SCRATCH:[0-9]+]]:g8rc_and_g8rc_nox0 = LDtoc @ll, $x2 67; CHECK64-NOOPT: LD 0, %[[SCRATCH]] 68 69; TEST64: .read_ll: 70; TEST64: ld 3, L..C0(2) 71; TEST64-NEXT: ld 3, 0(3) 72 73 74define dso_local float @read_float() { 75 entry: 76 %0 = load float, float* @f, align 4 77 ret float %0 78} 79; CHECK32: name: read_float 80; CHECK32: %[[SCRATCH:[0-9]+]]:gprc_and_gprc_nor0 = ADDItoc @f, $r2 81; CHECK32: %{{[0-9]+}}:f4rc = LFS 0, killed %[[SCRATCH]] :: (dereferenceable load (s32) from @f) 82 83; TEST32: .read_float: 84; TEST32: la 3, f[TD](2) 85; TEST32-NEXT: lfs 1, 0(3) 86 87; CHECK64: name: read_float 88; CHECK64: %[[SCRATCH:[0-9]+]]:g8rc_and_g8rc_nox0 = ADDItoc8 @f, $x2 89; CHECK64: %{{[0-9]+}}:f4rc = LFS 0, killed %[[SCRATCH]] :: (dereferenceable load (s32) from @f) 90 91; CHECK64-NOOPT: name: read_float 92; CHECK64-NOOPT: %[[SCRATCH:[0-9]+]]:g8rc_and_g8rc_nox0 = ADDItoc8 @f, $x2 93; CHECK64-NOOPT: %{{[0-9]+}}:f4rc = LFS 0, killed %[[SCRATCH]] 94 95; TEST64: .read_float: 96; TEST64: la 3, f[TD](2) 97; TEST64-NEXT: lfs 1, 0(3) 98 99 100define dso_local void @write_double(double %in) { 101 entry: 102 store double %in, double* @d, align 8 103 ret void 104} 105; CHECK32: name: write_double 106; CHECK32: LWZtoc @d, $r2 :: (load (s32) from got) 107 108; TEST32: .write_double 109; TEST32: lwz 3, L..C1(2) 110; TEST32-NEXT: stfd 1, 0(3) 111 112; CHECK64: name: write_double 113; CHECK64: %[[SCRATCH:[0-9]+]]:g8rc_and_g8rc_nox0 = LDtoc @d, $x2 :: (load (s64) from got) 114; CHECK64: STFD %{{[0-9]+}}, 0, killed %[[SCRATCH]] 115 116; CHECK64-NOOPT: name: write_double 117; CHECK64-NOOPT: %[[SCRATCH:[0-9]+]]:g8rc_and_g8rc_nox0 = LDtoc @d, $x2 118; CHECK64-NOOPT STFD %{{[0-9]+}}, 0 %[[SCRATCH]] 119 120; TEST64: .write_double 121; TEST64: ld 3, L..C1(2) 122; TEST64-NEXT: stfd 1, 0(3) 123 124 125define dso_local nonnull i32* @addr() { 126 entry: 127 ret i32* @i 128} 129; CHECK32: name: addr 130; CHECK32: %[[SCRATCH:[0-9]+]]:gprc = ADDItoc @i, $r2 131; CHECK32-NEXT: $r3 = COPY %[[SCRATCH]] 132 133; TEST32: .addr 134; TEST32: la 3, i[TD](2) 135 136; CHECK64: name: addr 137; CHECK64: %[[SCRATCH:[0-9]+]]:g8rc = ADDItoc8 @i, $x2 138; CHECK64-NEXT: $x3 = COPY %[[SCRATCH]] 139 140; CHECK64-NOOPT: name: addr 141; CHECK64-NOOPT: %[[SCRATCH:[0-9]+]]:g8rc = ADDItoc8 @i, $x2 142; CHECK64-NOOPT: $x3 = COPY %[[SCRATCH]] 143 144; TEST64: .addr 145; TEST64: la 3, i[TD](2) 146 147; TEST32: .toc 148; TEST32: .tc ll[TC],ll[RW] 149; TEST32-NOT: .csect ll[TD] 150; TEST32: .tc d[TC],d[RW] 151; TEST32-NOT: .csect d[TD],2 152; TEST32: .csect i[TD],2 153; TEST32-NEXT: .globl i[TD] 154; TEST32-NEXT: .align 2 155; TEST32-NOT: .tc i[TC],i[RW] 156; TEST32: .csect f[TD],2 157; TEST32-NEXT: .globl f[TD] 158; TEST32-NOT: .tc f[TD],f[RW] 159 160; TEST64: .toc 161; TEST64: .tc ll[TC],ll[RW] 162; TEST64-NOT: .csect ll[TD] 163; TEST64: .tc d[TC],d[RW] 164; TEST64-NOT: .csect d[TD],2 165; TEST64: .csect i[TD],2 166; TEST64-NEXT: .globl i[TD] 167; TEST64-NEXT: .align 2 168; TEST64-NOT: .tc i[TC],i[RW] 169; TEST64: .csect f[TD],2 170; TEST64-NEXT: .globl f[TD] 171; TEST64-NOT: .tc f[TD],f[RW] 172 173attributes #0 = { "toc-data" } 174