1*9880d681SAndroid Build Coastguard Worker; FIXME: FastISel currently returns false if it hits code that uses VSX 2*9880d681SAndroid Build Coastguard Worker; registers and with -fast-isel-abort=1 turned on the test case will then fail. 3*9880d681SAndroid Build Coastguard Worker; When fastisel better supports VSX fix up this test case. 4*9880d681SAndroid Build Coastguard Worker; 5*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -O0 -verify-machineinstrs -fast-isel -fast-isel-abort=1 -mattr=-vsx -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 | FileCheck %s --check-prefix=ELF64 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker; This test verifies that load/store instructions are properly generated, 8*9880d681SAndroid Build Coastguard Worker; and that they pass MI verification. 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker@a = global i8 1, align 1 11*9880d681SAndroid Build Coastguard Worker@b = global i16 2, align 2 12*9880d681SAndroid Build Coastguard Worker@c = global i32 4, align 4 13*9880d681SAndroid Build Coastguard Worker@d = global i64 8, align 8 14*9880d681SAndroid Build Coastguard Worker@e = global float 1.25, align 4 15*9880d681SAndroid Build Coastguard Worker@f = global double 3.5, align 8 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker%struct.s = type<{ i8, i32 }> 18*9880d681SAndroid Build Coastguard Worker%struct.t = type<{ i8, i64 }> 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker@g = global %struct.s <{ i8 1, i32 2 }>, align 1 21*9880d681SAndroid Build Coastguard Worker@h = global %struct.t <{ i8 1, i64 2 }>, align 1 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker@i = common global [8192 x i64] zeroinitializer, align 8 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker; load 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Workerdefine i8 @t1() nounwind { 28*9880d681SAndroid Build Coastguard Worker; ELF64: t1 29*9880d681SAndroid Build Coastguard Worker %1 = load i8, i8* @a, align 1 30*9880d681SAndroid Build Coastguard Worker; ELF64: lbz 31*9880d681SAndroid Build Coastguard Worker %2 = add nsw i8 %1, 1 32*9880d681SAndroid Build Coastguard Worker; ELF64: addi 33*9880d681SAndroid Build Coastguard Worker ret i8 %2 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Workerdefine i16 @t2() nounwind { 37*9880d681SAndroid Build Coastguard Worker; ELF64: t2 38*9880d681SAndroid Build Coastguard Worker %1 = load i16, i16* @b, align 2 39*9880d681SAndroid Build Coastguard Worker; ELF64: lhz 40*9880d681SAndroid Build Coastguard Worker %2 = add nsw i16 %1, 1 41*9880d681SAndroid Build Coastguard Worker; ELF64: addi 42*9880d681SAndroid Build Coastguard Worker ret i16 %2 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerdefine i32 @t3() nounwind { 46*9880d681SAndroid Build Coastguard Worker; ELF64: t3 47*9880d681SAndroid Build Coastguard Worker %1 = load i32, i32* @c, align 4 48*9880d681SAndroid Build Coastguard Worker; ELF64: lwz 49*9880d681SAndroid Build Coastguard Worker %2 = add nsw i32 %1, 1 50*9880d681SAndroid Build Coastguard Worker; ELF64: addi 51*9880d681SAndroid Build Coastguard Worker ret i32 %2 52*9880d681SAndroid Build Coastguard Worker} 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Workerdefine i64 @t4() nounwind { 55*9880d681SAndroid Build Coastguard Worker; ELF64: t4 56*9880d681SAndroid Build Coastguard Worker %1 = load i64, i64* @d, align 4 57*9880d681SAndroid Build Coastguard Worker; ELF64: ld 58*9880d681SAndroid Build Coastguard Worker %2 = add nsw i64 %1, 1 59*9880d681SAndroid Build Coastguard Worker; ELF64: addi 60*9880d681SAndroid Build Coastguard Worker ret i64 %2 61*9880d681SAndroid Build Coastguard Worker} 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Workerdefine float @t5() nounwind { 64*9880d681SAndroid Build Coastguard Worker; ELF64: t5 65*9880d681SAndroid Build Coastguard Worker %1 = load float, float* @e, align 4 66*9880d681SAndroid Build Coastguard Worker; ELF64: lfs 67*9880d681SAndroid Build Coastguard Worker %2 = fadd float %1, 1.0 68*9880d681SAndroid Build Coastguard Worker; ELF64: fadds 69*9880d681SAndroid Build Coastguard Worker ret float %2 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerdefine double @t6() nounwind { 73*9880d681SAndroid Build Coastguard Worker; ELF64: t6 74*9880d681SAndroid Build Coastguard Worker %1 = load double, double* @f, align 8 75*9880d681SAndroid Build Coastguard Worker; ELF64: lfd 76*9880d681SAndroid Build Coastguard Worker %2 = fadd double %1, 1.0 77*9880d681SAndroid Build Coastguard Worker; ELF64: fadd 78*9880d681SAndroid Build Coastguard Worker ret double %2 79*9880d681SAndroid Build Coastguard Worker} 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Worker; store 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Workerdefine void @t7(i8 %v) nounwind { 84*9880d681SAndroid Build Coastguard Worker; ELF64: t7 85*9880d681SAndroid Build Coastguard Worker %1 = add nsw i8 %v, 1 86*9880d681SAndroid Build Coastguard Worker store i8 %1, i8* @a, align 1 87*9880d681SAndroid Build Coastguard Worker; ELF64: addis 88*9880d681SAndroid Build Coastguard Worker; ELF64: addi 89*9880d681SAndroid Build Coastguard Worker; ELF64: addi 90*9880d681SAndroid Build Coastguard Worker; ELF64: stb 91*9880d681SAndroid Build Coastguard Worker ret void 92*9880d681SAndroid Build Coastguard Worker} 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Workerdefine void @t8(i16 %v) nounwind { 95*9880d681SAndroid Build Coastguard Worker; ELF64: t8 96*9880d681SAndroid Build Coastguard Worker %1 = add nsw i16 %v, 1 97*9880d681SAndroid Build Coastguard Worker store i16 %1, i16* @b, align 2 98*9880d681SAndroid Build Coastguard Worker; ELF64: addis 99*9880d681SAndroid Build Coastguard Worker; ELF64: addi 100*9880d681SAndroid Build Coastguard Worker; ELF64: addi 101*9880d681SAndroid Build Coastguard Worker; ELF64: sth 102*9880d681SAndroid Build Coastguard Worker ret void 103*9880d681SAndroid Build Coastguard Worker} 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Workerdefine void @t9(i32 %v) nounwind { 106*9880d681SAndroid Build Coastguard Worker; ELF64: t9 107*9880d681SAndroid Build Coastguard Worker %1 = add nsw i32 %v, 1 108*9880d681SAndroid Build Coastguard Worker store i32 %1, i32* @c, align 4 109*9880d681SAndroid Build Coastguard Worker; ELF64: addis 110*9880d681SAndroid Build Coastguard Worker; ELF64: addi 111*9880d681SAndroid Build Coastguard Worker; ELF64: addi 112*9880d681SAndroid Build Coastguard Worker; ELF64: stw 113*9880d681SAndroid Build Coastguard Worker ret void 114*9880d681SAndroid Build Coastguard Worker} 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Workerdefine void @t10(i64 %v) nounwind { 117*9880d681SAndroid Build Coastguard Worker; ELF64: t10 118*9880d681SAndroid Build Coastguard Worker %1 = add nsw i64 %v, 1 119*9880d681SAndroid Build Coastguard Worker store i64 %1, i64* @d, align 4 120*9880d681SAndroid Build Coastguard Worker; ELF64: addis 121*9880d681SAndroid Build Coastguard Worker; ELF64: addi 122*9880d681SAndroid Build Coastguard Worker; ELF64: addi 123*9880d681SAndroid Build Coastguard Worker; ELF64: std 124*9880d681SAndroid Build Coastguard Worker ret void 125*9880d681SAndroid Build Coastguard Worker} 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Workerdefine void @t11(float %v) nounwind { 128*9880d681SAndroid Build Coastguard Worker; ELF64: t11 129*9880d681SAndroid Build Coastguard Worker %1 = fadd float %v, 1.0 130*9880d681SAndroid Build Coastguard Worker store float %1, float* @e, align 4 131*9880d681SAndroid Build Coastguard Worker; ELF64: fadds 132*9880d681SAndroid Build Coastguard Worker; ELF64: stfs 133*9880d681SAndroid Build Coastguard Worker ret void 134*9880d681SAndroid Build Coastguard Worker} 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Workerdefine void @t12(double %v) nounwind { 137*9880d681SAndroid Build Coastguard Worker; ELF64: t12 138*9880d681SAndroid Build Coastguard Worker %1 = fadd double %v, 1.0 139*9880d681SAndroid Build Coastguard Worker store double %1, double* @f, align 8 140*9880d681SAndroid Build Coastguard Worker; ELF64: fadd 141*9880d681SAndroid Build Coastguard Worker; ELF64: stfd 142*9880d681SAndroid Build Coastguard Worker ret void 143*9880d681SAndroid Build Coastguard Worker} 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Worker;; lwa requires an offset divisible by 4, so we need lwax here. 146*9880d681SAndroid Build Coastguard Workerdefine i64 @t13() nounwind { 147*9880d681SAndroid Build Coastguard Worker; ELF64: t13 148*9880d681SAndroid Build Coastguard Worker %1 = load i32, i32* getelementptr inbounds (%struct.s, %struct.s* @g, i32 0, i32 1), align 1 149*9880d681SAndroid Build Coastguard Worker %2 = sext i32 %1 to i64 150*9880d681SAndroid Build Coastguard Worker; ELF64: li 151*9880d681SAndroid Build Coastguard Worker; ELF64: lwax 152*9880d681SAndroid Build Coastguard Worker %3 = add nsw i64 %2, 1 153*9880d681SAndroid Build Coastguard Worker; ELF64: addi 154*9880d681SAndroid Build Coastguard Worker ret i64 %3 155*9880d681SAndroid Build Coastguard Worker} 156*9880d681SAndroid Build Coastguard Worker 157*9880d681SAndroid Build Coastguard Worker;; ld requires an offset divisible by 4, so we need ldx here. 158*9880d681SAndroid Build Coastguard Workerdefine i64 @t14() nounwind { 159*9880d681SAndroid Build Coastguard Worker; ELF64: t14 160*9880d681SAndroid Build Coastguard Worker %1 = load i64, i64* getelementptr inbounds (%struct.t, %struct.t* @h, i32 0, i32 1), align 1 161*9880d681SAndroid Build Coastguard Worker; ELF64: li 162*9880d681SAndroid Build Coastguard Worker; ELF64: ldx 163*9880d681SAndroid Build Coastguard Worker %2 = add nsw i64 %1, 1 164*9880d681SAndroid Build Coastguard Worker; ELF64: addi 165*9880d681SAndroid Build Coastguard Worker ret i64 %2 166*9880d681SAndroid Build Coastguard Worker} 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Worker;; std requires an offset divisible by 4, so we need stdx here. 169*9880d681SAndroid Build Coastguard Workerdefine void @t15(i64 %v) nounwind { 170*9880d681SAndroid Build Coastguard Worker; ELF64: t15 171*9880d681SAndroid Build Coastguard Worker %1 = add nsw i64 %v, 1 172*9880d681SAndroid Build Coastguard Worker store i64 %1, i64* getelementptr inbounds (%struct.t, %struct.t* @h, i32 0, i32 1), align 1 173*9880d681SAndroid Build Coastguard Worker; ELF64: addis 174*9880d681SAndroid Build Coastguard Worker; ELF64: addi 175*9880d681SAndroid Build Coastguard Worker; ELF64: addi 176*9880d681SAndroid Build Coastguard Worker; ELF64: li 177*9880d681SAndroid Build Coastguard Worker; ELF64: stdx 178*9880d681SAndroid Build Coastguard Worker ret void 179*9880d681SAndroid Build Coastguard Worker} 180*9880d681SAndroid Build Coastguard Worker 181*9880d681SAndroid Build Coastguard Worker;; ld requires an offset that fits in 16 bits, so we need ldx here. 182*9880d681SAndroid Build Coastguard Workerdefine i64 @t16() nounwind { 183*9880d681SAndroid Build Coastguard Worker; ELF64: t16 184*9880d681SAndroid Build Coastguard Worker %1 = load i64, i64* getelementptr inbounds ([8192 x i64], [8192 x i64]* @i, i32 0, i64 5000), align 8 185*9880d681SAndroid Build Coastguard Worker; ELF64: lis 186*9880d681SAndroid Build Coastguard Worker; ELF64: ori 187*9880d681SAndroid Build Coastguard Worker; ELF64: ldx 188*9880d681SAndroid Build Coastguard Worker %2 = add nsw i64 %1, 1 189*9880d681SAndroid Build Coastguard Worker; ELF64: addi 190*9880d681SAndroid Build Coastguard Worker ret i64 %2 191*9880d681SAndroid Build Coastguard Worker} 192*9880d681SAndroid Build Coastguard Worker 193*9880d681SAndroid Build Coastguard Worker;; std requires an offset that fits in 16 bits, so we need stdx here. 194*9880d681SAndroid Build Coastguard Workerdefine void @t17(i64 %v) nounwind { 195*9880d681SAndroid Build Coastguard Worker; ELF64: t17 196*9880d681SAndroid Build Coastguard Worker %1 = add nsw i64 %v, 1 197*9880d681SAndroid Build Coastguard Worker store i64 %1, i64* getelementptr inbounds ([8192 x i64], [8192 x i64]* @i, i32 0, i64 5000), align 8 198*9880d681SAndroid Build Coastguard Worker; ELF64: addis 199*9880d681SAndroid Build Coastguard Worker; ELF64: ld 200*9880d681SAndroid Build Coastguard Worker; ELF64: addi 201*9880d681SAndroid Build Coastguard Worker; ELF64: lis 202*9880d681SAndroid Build Coastguard Worker; ELF64: ori 203*9880d681SAndroid Build Coastguard Worker; ELF64: stdx 204*9880d681SAndroid Build Coastguard Worker ret void 205*9880d681SAndroid Build Coastguard Worker} 206*9880d681SAndroid Build Coastguard Worker 207