1*9880d681SAndroid Build Coastguard Worker; Test load/store pairs that act as memcpys. 2*9880d681SAndroid Build Coastguard Worker; 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker@g1src = global i8 1 6*9880d681SAndroid Build Coastguard Worker@g1dst = global i8 1 7*9880d681SAndroid Build Coastguard Worker@g2src = global i16 2 8*9880d681SAndroid Build Coastguard Worker@g2dst = global i16 2 9*9880d681SAndroid Build Coastguard Worker@g3 = global i32 3 10*9880d681SAndroid Build Coastguard Worker@g4 = global i64 4 11*9880d681SAndroid Build Coastguard Worker@g5src = external global fp128, align 16 12*9880d681SAndroid Build Coastguard Worker@g5dst = external global fp128, align 16 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker; Test the simple i8 case. 15*9880d681SAndroid Build Coastguard Workerdefine void @f1(i8 *%ptr1) { 16*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 17*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 1(1,%r2), 0(%r2) 18*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 19*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i8, i8 *%ptr1, i64 1 20*9880d681SAndroid Build Coastguard Worker %val = load i8 , i8 *%ptr1 21*9880d681SAndroid Build Coastguard Worker store i8 %val, i8 *%ptr2 22*9880d681SAndroid Build Coastguard Worker ret void 23*9880d681SAndroid Build Coastguard Worker} 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker; Test i8 cases where the value is zero-extended to 32 bits. 26*9880d681SAndroid Build Coastguard Workerdefine void @f2(i8 *%ptr1) { 27*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 28*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 1(1,%r2), 0(%r2) 29*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 30*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i8, i8 *%ptr1, i64 1 31*9880d681SAndroid Build Coastguard Worker %val = load i8 , i8 *%ptr1 32*9880d681SAndroid Build Coastguard Worker %ext = zext i8 %val to i32 33*9880d681SAndroid Build Coastguard Worker %trunc = trunc i32 %ext to i8 34*9880d681SAndroid Build Coastguard Worker store i8 %trunc, i8 *%ptr2 35*9880d681SAndroid Build Coastguard Worker ret void 36*9880d681SAndroid Build Coastguard Worker} 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker; Test i8 cases where the value is zero-extended to 64 bits. 39*9880d681SAndroid Build Coastguard Workerdefine void @f3(i8 *%ptr1) { 40*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 41*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 1(1,%r2), 0(%r2) 42*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 43*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i8, i8 *%ptr1, i64 1 44*9880d681SAndroid Build Coastguard Worker %val = load i8 , i8 *%ptr1 45*9880d681SAndroid Build Coastguard Worker %ext = zext i8 %val to i64 46*9880d681SAndroid Build Coastguard Worker %trunc = trunc i64 %ext to i8 47*9880d681SAndroid Build Coastguard Worker store i8 %trunc, i8 *%ptr2 48*9880d681SAndroid Build Coastguard Worker ret void 49*9880d681SAndroid Build Coastguard Worker} 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Worker; Test i8 cases where the value is sign-extended to 32 bits. 52*9880d681SAndroid Build Coastguard Workerdefine void @f4(i8 *%ptr1) { 53*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 54*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 1(1,%r2), 0(%r2) 55*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 56*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i8, i8 *%ptr1, i64 1 57*9880d681SAndroid Build Coastguard Worker %val = load i8 , i8 *%ptr1 58*9880d681SAndroid Build Coastguard Worker %ext = sext i8 %val to i32 59*9880d681SAndroid Build Coastguard Worker %trunc = trunc i32 %ext to i8 60*9880d681SAndroid Build Coastguard Worker store i8 %trunc, i8 *%ptr2 61*9880d681SAndroid Build Coastguard Worker ret void 62*9880d681SAndroid Build Coastguard Worker} 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker; Test i8 cases where the value is sign-extended to 64 bits. 65*9880d681SAndroid Build Coastguard Workerdefine void @f5(i8 *%ptr1) { 66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 67*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 1(1,%r2), 0(%r2) 68*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 69*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i8, i8 *%ptr1, i64 1 70*9880d681SAndroid Build Coastguard Worker %val = load i8 , i8 *%ptr1 71*9880d681SAndroid Build Coastguard Worker %ext = sext i8 %val to i64 72*9880d681SAndroid Build Coastguard Worker %trunc = trunc i64 %ext to i8 73*9880d681SAndroid Build Coastguard Worker store i8 %trunc, i8 *%ptr2 74*9880d681SAndroid Build Coastguard Worker ret void 75*9880d681SAndroid Build Coastguard Worker} 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Worker; Test the simple i16 case. 78*9880d681SAndroid Build Coastguard Workerdefine void @f6(i16 *%ptr1) { 79*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 80*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 2(2,%r2), 0(%r2) 81*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 82*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i16, i16 *%ptr1, i64 1 83*9880d681SAndroid Build Coastguard Worker %val = load i16 , i16 *%ptr1 84*9880d681SAndroid Build Coastguard Worker store i16 %val, i16 *%ptr2 85*9880d681SAndroid Build Coastguard Worker ret void 86*9880d681SAndroid Build Coastguard Worker} 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Worker; Test i16 cases where the value is zero-extended to 32 bits. 89*9880d681SAndroid Build Coastguard Workerdefine void @f7(i16 *%ptr1) { 90*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7: 91*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 2(2,%r2), 0(%r2) 92*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 93*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i16, i16 *%ptr1, i64 1 94*9880d681SAndroid Build Coastguard Worker %val = load i16 , i16 *%ptr1 95*9880d681SAndroid Build Coastguard Worker %ext = zext i16 %val to i32 96*9880d681SAndroid Build Coastguard Worker %trunc = trunc i32 %ext to i16 97*9880d681SAndroid Build Coastguard Worker store i16 %trunc, i16 *%ptr2 98*9880d681SAndroid Build Coastguard Worker ret void 99*9880d681SAndroid Build Coastguard Worker} 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker; Test i16 cases where the value is zero-extended to 64 bits. 102*9880d681SAndroid Build Coastguard Workerdefine void @f8(i16 *%ptr1) { 103*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8: 104*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 2(2,%r2), 0(%r2) 105*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 106*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i16, i16 *%ptr1, i64 1 107*9880d681SAndroid Build Coastguard Worker %val = load i16 , i16 *%ptr1 108*9880d681SAndroid Build Coastguard Worker %ext = zext i16 %val to i64 109*9880d681SAndroid Build Coastguard Worker %trunc = trunc i64 %ext to i16 110*9880d681SAndroid Build Coastguard Worker store i16 %trunc, i16 *%ptr2 111*9880d681SAndroid Build Coastguard Worker ret void 112*9880d681SAndroid Build Coastguard Worker} 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Worker; Test i16 cases where the value is sign-extended to 32 bits. 115*9880d681SAndroid Build Coastguard Workerdefine void @f9(i16 *%ptr1) { 116*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9: 117*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 2(2,%r2), 0(%r2) 118*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 119*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i16, i16 *%ptr1, i64 1 120*9880d681SAndroid Build Coastguard Worker %val = load i16 , i16 *%ptr1 121*9880d681SAndroid Build Coastguard Worker %ext = sext i16 %val to i32 122*9880d681SAndroid Build Coastguard Worker %trunc = trunc i32 %ext to i16 123*9880d681SAndroid Build Coastguard Worker store i16 %trunc, i16 *%ptr2 124*9880d681SAndroid Build Coastguard Worker ret void 125*9880d681SAndroid Build Coastguard Worker} 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Worker; Test i16 cases where the value is sign-extended to 64 bits. 128*9880d681SAndroid Build Coastguard Workerdefine void @f10(i16 *%ptr1) { 129*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f10: 130*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 2(2,%r2), 0(%r2) 131*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 132*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i16, i16 *%ptr1, i64 1 133*9880d681SAndroid Build Coastguard Worker %val = load i16 , i16 *%ptr1 134*9880d681SAndroid Build Coastguard Worker %ext = sext i16 %val to i64 135*9880d681SAndroid Build Coastguard Worker %trunc = trunc i64 %ext to i16 136*9880d681SAndroid Build Coastguard Worker store i16 %trunc, i16 *%ptr2 137*9880d681SAndroid Build Coastguard Worker ret void 138*9880d681SAndroid Build Coastguard Worker} 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Worker; Test the simple i32 case. 141*9880d681SAndroid Build Coastguard Workerdefine void @f11(i32 *%ptr1) { 142*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f11: 143*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 4(4,%r2), 0(%r2) 144*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 145*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i32, i32 *%ptr1, i64 1 146*9880d681SAndroid Build Coastguard Worker %val = load i32 , i32 *%ptr1 147*9880d681SAndroid Build Coastguard Worker store i32 %val, i32 *%ptr2 148*9880d681SAndroid Build Coastguard Worker ret void 149*9880d681SAndroid Build Coastguard Worker} 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Worker; Test i32 cases where the value is zero-extended to 64 bits. 152*9880d681SAndroid Build Coastguard Workerdefine void @f12(i32 *%ptr1) { 153*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f12: 154*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 4(4,%r2), 0(%r2) 155*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 156*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i32, i32 *%ptr1, i64 1 157*9880d681SAndroid Build Coastguard Worker %val = load i32 , i32 *%ptr1 158*9880d681SAndroid Build Coastguard Worker %ext = zext i32 %val to i64 159*9880d681SAndroid Build Coastguard Worker %trunc = trunc i64 %ext to i32 160*9880d681SAndroid Build Coastguard Worker store i32 %trunc, i32 *%ptr2 161*9880d681SAndroid Build Coastguard Worker ret void 162*9880d681SAndroid Build Coastguard Worker} 163*9880d681SAndroid Build Coastguard Worker 164*9880d681SAndroid Build Coastguard Worker; Test i32 cases where the value is sign-extended to 64 bits. 165*9880d681SAndroid Build Coastguard Workerdefine void @f13(i32 *%ptr1) { 166*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f13: 167*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 4(4,%r2), 0(%r2) 168*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 169*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i32, i32 *%ptr1, i64 1 170*9880d681SAndroid Build Coastguard Worker %val = load i32 , i32 *%ptr1 171*9880d681SAndroid Build Coastguard Worker %ext = sext i32 %val to i64 172*9880d681SAndroid Build Coastguard Worker %trunc = trunc i64 %ext to i32 173*9880d681SAndroid Build Coastguard Worker store i32 %trunc, i32 *%ptr2 174*9880d681SAndroid Build Coastguard Worker ret void 175*9880d681SAndroid Build Coastguard Worker} 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Worker; Test the i64 case. 178*9880d681SAndroid Build Coastguard Workerdefine void @f14(i64 *%ptr1) { 179*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f14: 180*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 8(8,%r2), 0(%r2) 181*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 182*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i64, i64 *%ptr1, i64 1 183*9880d681SAndroid Build Coastguard Worker %val = load i64 , i64 *%ptr1 184*9880d681SAndroid Build Coastguard Worker store i64 %val, i64 *%ptr2 185*9880d681SAndroid Build Coastguard Worker ret void 186*9880d681SAndroid Build Coastguard Worker} 187*9880d681SAndroid Build Coastguard Worker 188*9880d681SAndroid Build Coastguard Worker; Test the f32 case. 189*9880d681SAndroid Build Coastguard Workerdefine void @f15(float *%ptr1) { 190*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f15: 191*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 4(4,%r2), 0(%r2) 192*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 193*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr float, float *%ptr1, i64 1 194*9880d681SAndroid Build Coastguard Worker %val = load float , float *%ptr1 195*9880d681SAndroid Build Coastguard Worker store float %val, float *%ptr2 196*9880d681SAndroid Build Coastguard Worker ret void 197*9880d681SAndroid Build Coastguard Worker} 198*9880d681SAndroid Build Coastguard Worker 199*9880d681SAndroid Build Coastguard Worker; Test the f64 case. 200*9880d681SAndroid Build Coastguard Workerdefine void @f16(double *%ptr1) { 201*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f16: 202*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 8(8,%r2), 0(%r2) 203*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 204*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr double, double *%ptr1, i64 1 205*9880d681SAndroid Build Coastguard Worker %val = load double , double *%ptr1 206*9880d681SAndroid Build Coastguard Worker store double %val, double *%ptr2 207*9880d681SAndroid Build Coastguard Worker ret void 208*9880d681SAndroid Build Coastguard Worker} 209*9880d681SAndroid Build Coastguard Worker 210*9880d681SAndroid Build Coastguard Worker; Test the f128 case. 211*9880d681SAndroid Build Coastguard Workerdefine void @f17(fp128 *%ptr1) { 212*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f17: 213*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 16(16,%r2), 0(%r2) 214*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 215*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr fp128, fp128 *%ptr1, i64 1 216*9880d681SAndroid Build Coastguard Worker %val = load fp128 , fp128 *%ptr1 217*9880d681SAndroid Build Coastguard Worker store fp128 %val, fp128 *%ptr2 218*9880d681SAndroid Build Coastguard Worker ret void 219*9880d681SAndroid Build Coastguard Worker} 220*9880d681SAndroid Build Coastguard Worker 221*9880d681SAndroid Build Coastguard Worker; Make sure that we don't use MVC if the load is volatile. 222*9880d681SAndroid Build Coastguard Workerdefine void @f18(i64 *%ptr1) { 223*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f18: 224*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: mvc 225*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 226*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i64, i64 *%ptr1, i64 1 227*9880d681SAndroid Build Coastguard Worker %val = load volatile i64 , i64 *%ptr1 228*9880d681SAndroid Build Coastguard Worker store i64 %val, i64 *%ptr2 229*9880d681SAndroid Build Coastguard Worker ret void 230*9880d681SAndroid Build Coastguard Worker} 231*9880d681SAndroid Build Coastguard Worker 232*9880d681SAndroid Build Coastguard Worker; ...likewise the store. 233*9880d681SAndroid Build Coastguard Workerdefine void @f19(i64 *%ptr1) { 234*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f19: 235*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: mvc 236*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 237*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i64, i64 *%ptr1, i64 1 238*9880d681SAndroid Build Coastguard Worker %val = load i64 , i64 *%ptr1 239*9880d681SAndroid Build Coastguard Worker store volatile i64 %val, i64 *%ptr2 240*9880d681SAndroid Build Coastguard Worker ret void 241*9880d681SAndroid Build Coastguard Worker} 242*9880d681SAndroid Build Coastguard Worker 243*9880d681SAndroid Build Coastguard Worker; Test that MVC is not used for aligned loads and stores if there is 244*9880d681SAndroid Build Coastguard Worker; no way of telling whether they alias. We don't want to use MVC in 245*9880d681SAndroid Build Coastguard Worker; cases where the addresses could be equal. 246*9880d681SAndroid Build Coastguard Workerdefine void @f20(i64 *%ptr1, i64 *%ptr2) { 247*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f20: 248*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: mvc 249*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 250*9880d681SAndroid Build Coastguard Worker %val = load i64 , i64 *%ptr1 251*9880d681SAndroid Build Coastguard Worker store i64 %val, i64 *%ptr2 252*9880d681SAndroid Build Coastguard Worker ret void 253*9880d681SAndroid Build Coastguard Worker} 254*9880d681SAndroid Build Coastguard Worker 255*9880d681SAndroid Build Coastguard Worker; ...and again for unaligned loads and stores. 256*9880d681SAndroid Build Coastguard Workerdefine void @f21(i64 *%ptr1, i64 *%ptr2) { 257*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f21: 258*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: mvc 259*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 260*9880d681SAndroid Build Coastguard Worker %val = load i64 , i64 *%ptr1, align 2 261*9880d681SAndroid Build Coastguard Worker store i64 %val, i64 *%ptr2, align 2 262*9880d681SAndroid Build Coastguard Worker ret void 263*9880d681SAndroid Build Coastguard Worker} 264*9880d681SAndroid Build Coastguard Worker 265*9880d681SAndroid Build Coastguard Worker; Test a case where there is definite overlap. 266*9880d681SAndroid Build Coastguard Workerdefine void @f22(i64 %base) { 267*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f22: 268*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: mvc 269*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 270*9880d681SAndroid Build Coastguard Worker %add = add i64 %base, 1 271*9880d681SAndroid Build Coastguard Worker %ptr1 = inttoptr i64 %base to i64 * 272*9880d681SAndroid Build Coastguard Worker %ptr2 = inttoptr i64 %add to i64 * 273*9880d681SAndroid Build Coastguard Worker %val = load i64 , i64 *%ptr1, align 1 274*9880d681SAndroid Build Coastguard Worker store i64 %val, i64 *%ptr2, align 1 275*9880d681SAndroid Build Coastguard Worker ret void 276*9880d681SAndroid Build Coastguard Worker} 277*9880d681SAndroid Build Coastguard Worker 278*9880d681SAndroid Build Coastguard Worker; Test that we can use MVC for global addresses for i8. 279*9880d681SAndroid Build Coastguard Workerdefine void @f23(i8 *%ptr) { 280*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f23: 281*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: larl [[SRC:%r[0-5]]], g1src 282*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: larl [[DST:%r[0-5]]], g1dst 283*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 0(1,[[DST]]), 0([[SRC]]) 284*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 285*9880d681SAndroid Build Coastguard Worker %val = load i8 , i8 *@g1src 286*9880d681SAndroid Build Coastguard Worker store i8 %val, i8 *@g1dst 287*9880d681SAndroid Build Coastguard Worker ret void 288*9880d681SAndroid Build Coastguard Worker} 289*9880d681SAndroid Build Coastguard Worker 290*9880d681SAndroid Build Coastguard Worker; Test that we use LHRL and STHRL for i16. 291*9880d681SAndroid Build Coastguard Workerdefine void @f24(i16 *%ptr) { 292*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f24: 293*9880d681SAndroid Build Coastguard Worker; CHECK: lhrl [[REG:%r[0-5]]], g2src 294*9880d681SAndroid Build Coastguard Worker; CHECK: sthrl [[REG]], g2dst 295*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 296*9880d681SAndroid Build Coastguard Worker %val = load i16 , i16 *@g2src 297*9880d681SAndroid Build Coastguard Worker store i16 %val, i16 *@g2dst 298*9880d681SAndroid Build Coastguard Worker ret void 299*9880d681SAndroid Build Coastguard Worker} 300*9880d681SAndroid Build Coastguard Worker 301*9880d681SAndroid Build Coastguard Worker; Test that we use LRL for i32. 302*9880d681SAndroid Build Coastguard Workerdefine void @f25(i32 *%ptr) { 303*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f25: 304*9880d681SAndroid Build Coastguard Worker; CHECK: lrl [[REG:%r[0-5]]], g3 305*9880d681SAndroid Build Coastguard Worker; CHECK: st [[REG]], 0(%r2) 306*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 307*9880d681SAndroid Build Coastguard Worker %val = load i32 , i32 *@g3 308*9880d681SAndroid Build Coastguard Worker store i32 %val, i32 *%ptr 309*9880d681SAndroid Build Coastguard Worker ret void 310*9880d681SAndroid Build Coastguard Worker} 311*9880d681SAndroid Build Coastguard Worker 312*9880d681SAndroid Build Coastguard Worker; ...likewise STRL. 313*9880d681SAndroid Build Coastguard Workerdefine void @f26(i32 *%ptr) { 314*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f26: 315*9880d681SAndroid Build Coastguard Worker; CHECK: l [[REG:%r[0-5]]], 0(%r2) 316*9880d681SAndroid Build Coastguard Worker; CHECK: strl [[REG]], g3 317*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 318*9880d681SAndroid Build Coastguard Worker %val = load i32 , i32 *%ptr 319*9880d681SAndroid Build Coastguard Worker store i32 %val, i32 *@g3 320*9880d681SAndroid Build Coastguard Worker ret void 321*9880d681SAndroid Build Coastguard Worker} 322*9880d681SAndroid Build Coastguard Worker 323*9880d681SAndroid Build Coastguard Worker; Test that we use LGRL for i64. 324*9880d681SAndroid Build Coastguard Workerdefine void @f27(i64 *%ptr) { 325*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f27: 326*9880d681SAndroid Build Coastguard Worker; CHECK: lgrl [[REG:%r[0-5]]], g4 327*9880d681SAndroid Build Coastguard Worker; CHECK: stg [[REG]], 0(%r2) 328*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 329*9880d681SAndroid Build Coastguard Worker %val = load i64 , i64 *@g4 330*9880d681SAndroid Build Coastguard Worker store i64 %val, i64 *%ptr 331*9880d681SAndroid Build Coastguard Worker ret void 332*9880d681SAndroid Build Coastguard Worker} 333*9880d681SAndroid Build Coastguard Worker 334*9880d681SAndroid Build Coastguard Worker; ...likewise STGRL. 335*9880d681SAndroid Build Coastguard Workerdefine void @f28(i64 *%ptr) { 336*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f28: 337*9880d681SAndroid Build Coastguard Worker; CHECK: lg [[REG:%r[0-5]]], 0(%r2) 338*9880d681SAndroid Build Coastguard Worker; CHECK: stgrl [[REG]], g4 339*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 340*9880d681SAndroid Build Coastguard Worker %val = load i64 , i64 *%ptr 341*9880d681SAndroid Build Coastguard Worker store i64 %val, i64 *@g4 342*9880d681SAndroid Build Coastguard Worker ret void 343*9880d681SAndroid Build Coastguard Worker} 344*9880d681SAndroid Build Coastguard Worker 345*9880d681SAndroid Build Coastguard Worker; Test that we can use MVC for global addresses for fp128. 346*9880d681SAndroid Build Coastguard Workerdefine void @f29(fp128 *%ptr) { 347*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f29: 348*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: larl [[SRC:%r[0-5]]], g5src 349*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: larl [[DST:%r[0-5]]], g5dst 350*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 0(16,[[DST]]), 0([[SRC]]) 351*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 352*9880d681SAndroid Build Coastguard Worker %val = load fp128 , fp128 *@g5src, align 16 353*9880d681SAndroid Build Coastguard Worker store fp128 %val, fp128 *@g5dst, align 16 354*9880d681SAndroid Build Coastguard Worker ret void 355*9880d681SAndroid Build Coastguard Worker} 356*9880d681SAndroid Build Coastguard Worker 357*9880d681SAndroid Build Coastguard Worker; Test a case where offset disambiguation is enough. 358*9880d681SAndroid Build Coastguard Workerdefine void @f30(i64 *%ptr1) { 359*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f30: 360*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 8(8,%r2), 0(%r2) 361*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 362*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i64, i64 *%ptr1, i64 1 363*9880d681SAndroid Build Coastguard Worker %val = load i64 , i64 *%ptr1, align 1 364*9880d681SAndroid Build Coastguard Worker store i64 %val, i64 *%ptr2, align 1 365*9880d681SAndroid Build Coastguard Worker ret void 366*9880d681SAndroid Build Coastguard Worker} 367*9880d681SAndroid Build Coastguard Worker 368*9880d681SAndroid Build Coastguard Worker; Test f21 in cases where TBAA tells us there is no alias. 369*9880d681SAndroid Build Coastguard Workerdefine void @f31(i64 *%ptr1, i64 *%ptr2) { 370*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f31: 371*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 0(8,%r3), 0(%r2) 372*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 373*9880d681SAndroid Build Coastguard Worker %val = load i64 , i64 *%ptr1, align 2, !tbaa !1 374*9880d681SAndroid Build Coastguard Worker store i64 %val, i64 *%ptr2, align 2, !tbaa !2 375*9880d681SAndroid Build Coastguard Worker ret void 376*9880d681SAndroid Build Coastguard Worker} 377*9880d681SAndroid Build Coastguard Worker 378*9880d681SAndroid Build Coastguard Worker; Test f21 in cases where TBAA is present but doesn't help. 379*9880d681SAndroid Build Coastguard Workerdefine void @f32(i64 *%ptr1, i64 *%ptr2) { 380*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f32: 381*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: mvc 382*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 383*9880d681SAndroid Build Coastguard Worker %val = load i64 , i64 *%ptr1, align 2, !tbaa !1 384*9880d681SAndroid Build Coastguard Worker store i64 %val, i64 *%ptr2, align 2, !tbaa !1 385*9880d681SAndroid Build Coastguard Worker ret void 386*9880d681SAndroid Build Coastguard Worker} 387*9880d681SAndroid Build Coastguard Worker 388*9880d681SAndroid Build Coastguard Worker!0 = !{ !"root" } 389*9880d681SAndroid Build Coastguard Worker!1 = !{ !3, !3, i64 0 } 390*9880d681SAndroid Build Coastguard Worker!2 = !{ !4, !4, i64 0 } 391*9880d681SAndroid Build Coastguard Worker!3 = !{ !"set1", !0 } 392*9880d681SAndroid Build Coastguard Worker!4 = !{ !"set2", !0 } 393