1*9880d681SAndroid Build Coastguard Worker; Test 64-bit GPR accesses to a PC-relative location. 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@gsrc16 = global i16 1 6*9880d681SAndroid Build Coastguard Worker@gsrc32 = global i32 1 7*9880d681SAndroid Build Coastguard Worker@gsrc64 = global i64 1 8*9880d681SAndroid Build Coastguard Worker@gdst16 = global i16 2 9*9880d681SAndroid Build Coastguard Worker@gdst32 = global i32 2 10*9880d681SAndroid Build Coastguard Worker@gdst64 = global i64 2 11*9880d681SAndroid Build Coastguard Worker@gsrc16u = global i16 1, align 1, section "foo" 12*9880d681SAndroid Build Coastguard Worker@gsrc32u = global i32 1, align 2, section "foo" 13*9880d681SAndroid Build Coastguard Worker@gsrc64u = global i64 1, align 4, section "foo" 14*9880d681SAndroid Build Coastguard Worker@gdst16u = global i16 2, align 1, section "foo" 15*9880d681SAndroid Build Coastguard Worker@gdst32u = global i32 2, align 2, section "foo" 16*9880d681SAndroid Build Coastguard Worker@gdst64u = global i64 2, align 4, section "foo" 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker; Check sign-extending loads from i16. 19*9880d681SAndroid Build Coastguard Workerdefine i64 @f1() { 20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 21*9880d681SAndroid Build Coastguard Worker; CHECK: lghrl %r2, gsrc16 22*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 23*9880d681SAndroid Build Coastguard Worker %val = load i16 , i16 *@gsrc16 24*9880d681SAndroid Build Coastguard Worker %ext = sext i16 %val to i64 25*9880d681SAndroid Build Coastguard Worker ret i64 %ext 26*9880d681SAndroid Build Coastguard Worker} 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker; Check zero-extending loads from i16. 29*9880d681SAndroid Build Coastguard Workerdefine i64 @f2() { 30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 31*9880d681SAndroid Build Coastguard Worker; CHECK: llghrl %r2, gsrc16 32*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 33*9880d681SAndroid Build Coastguard Worker %val = load i16 , i16 *@gsrc16 34*9880d681SAndroid Build Coastguard Worker %ext = zext i16 %val to i64 35*9880d681SAndroid Build Coastguard Worker ret i64 %ext 36*9880d681SAndroid Build Coastguard Worker} 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker; Check sign-extending loads from i32. 39*9880d681SAndroid Build Coastguard Workerdefine i64 @f3() { 40*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 41*9880d681SAndroid Build Coastguard Worker; CHECK: lgfrl %r2, gsrc32 42*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 43*9880d681SAndroid Build Coastguard Worker %val = load i32 , i32 *@gsrc32 44*9880d681SAndroid Build Coastguard Worker %ext = sext i32 %val to i64 45*9880d681SAndroid Build Coastguard Worker ret i64 %ext 46*9880d681SAndroid Build Coastguard Worker} 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker; Check zero-extending loads from i32. 49*9880d681SAndroid Build Coastguard Workerdefine i64 @f4() { 50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 51*9880d681SAndroid Build Coastguard Worker; CHECK: llgfrl %r2, gsrc32 52*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 53*9880d681SAndroid Build Coastguard Worker %val = load i32 , i32 *@gsrc32 54*9880d681SAndroid Build Coastguard Worker %ext = zext i32 %val to i64 55*9880d681SAndroid Build Coastguard Worker ret i64 %ext 56*9880d681SAndroid Build Coastguard Worker} 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Worker; Check truncating 16-bit stores. 59*9880d681SAndroid Build Coastguard Workerdefine void @f5(i64 %val) { 60*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 61*9880d681SAndroid Build Coastguard Worker; CHECK: sthrl %r2, gdst16 62*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 63*9880d681SAndroid Build Coastguard Worker %half = trunc i64 %val to i16 64*9880d681SAndroid Build Coastguard Worker store i16 %half, i16 *@gdst16 65*9880d681SAndroid Build Coastguard Worker ret void 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker; Check truncating 32-bit stores. 69*9880d681SAndroid Build Coastguard Workerdefine void @f6(i64 %val) { 70*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 71*9880d681SAndroid Build Coastguard Worker; CHECK: strl %r2, gdst32 72*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 73*9880d681SAndroid Build Coastguard Worker %word = trunc i64 %val to i32 74*9880d681SAndroid Build Coastguard Worker store i32 %word, i32 *@gdst32 75*9880d681SAndroid Build Coastguard Worker ret void 76*9880d681SAndroid Build Coastguard Worker} 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker; Check plain loads and stores. 79*9880d681SAndroid Build Coastguard Workerdefine void @f7() { 80*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7: 81*9880d681SAndroid Build Coastguard Worker; CHECK: lgrl %r0, gsrc64 82*9880d681SAndroid Build Coastguard Worker; CHECK: stgrl %r0, gdst64 83*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 84*9880d681SAndroid Build Coastguard Worker %val = load i64 , i64 *@gsrc64 85*9880d681SAndroid Build Coastguard Worker store i64 %val, i64 *@gdst64 86*9880d681SAndroid Build Coastguard Worker ret void 87*9880d681SAndroid Build Coastguard Worker} 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Worker; Repeat f1 with an unaligned variable. 90*9880d681SAndroid Build Coastguard Workerdefine i64 @f8() { 91*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8: 92*9880d681SAndroid Build Coastguard Worker; CHECK: lgrl [[REG:%r[0-5]]], gsrc16u@GOT 93*9880d681SAndroid Build Coastguard Worker; CHECK: lgh %r2, 0([[REG]]) 94*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 95*9880d681SAndroid Build Coastguard Worker %val = load i16 , i16 *@gsrc16u, align 1 96*9880d681SAndroid Build Coastguard Worker %ext = sext i16 %val to i64 97*9880d681SAndroid Build Coastguard Worker ret i64 %ext 98*9880d681SAndroid Build Coastguard Worker} 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Worker; Repeat f2 with an unaligned variable. 101*9880d681SAndroid Build Coastguard Workerdefine i64 @f9() { 102*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9: 103*9880d681SAndroid Build Coastguard Worker; CHECK: lgrl [[REG:%r[0-5]]], gsrc16u@GOT 104*9880d681SAndroid Build Coastguard Worker; CHECK: llgh %r2, 0([[REG]]) 105*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 106*9880d681SAndroid Build Coastguard Worker %val = load i16 , i16 *@gsrc16u, align 1 107*9880d681SAndroid Build Coastguard Worker %ext = zext i16 %val to i64 108*9880d681SAndroid Build Coastguard Worker ret i64 %ext 109*9880d681SAndroid Build Coastguard Worker} 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Worker; Repeat f3 with an unaligned variable. 112*9880d681SAndroid Build Coastguard Workerdefine i64 @f10() { 113*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f10: 114*9880d681SAndroid Build Coastguard Worker; CHECK: larl [[REG:%r[0-5]]], gsrc32u 115*9880d681SAndroid Build Coastguard Worker; CHECK: lgf %r2, 0([[REG]]) 116*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 117*9880d681SAndroid Build Coastguard Worker %val = load i32 , i32 *@gsrc32u, align 2 118*9880d681SAndroid Build Coastguard Worker %ext = sext i32 %val to i64 119*9880d681SAndroid Build Coastguard Worker ret i64 %ext 120*9880d681SAndroid Build Coastguard Worker} 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Worker; Repeat f4 with an unaligned variable. 123*9880d681SAndroid Build Coastguard Workerdefine i64 @f11() { 124*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f11: 125*9880d681SAndroid Build Coastguard Worker; CHECK: larl [[REG:%r[0-5]]], gsrc32u 126*9880d681SAndroid Build Coastguard Worker; CHECK: llgf %r2, 0([[REG]]) 127*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 128*9880d681SAndroid Build Coastguard Worker %val = load i32 , i32 *@gsrc32u, align 2 129*9880d681SAndroid Build Coastguard Worker %ext = zext i32 %val to i64 130*9880d681SAndroid Build Coastguard Worker ret i64 %ext 131*9880d681SAndroid Build Coastguard Worker} 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Worker; Repeat f5 with an unaligned variable. 134*9880d681SAndroid Build Coastguard Workerdefine void @f12(i64 %val) { 135*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f12: 136*9880d681SAndroid Build Coastguard Worker; CHECK: lgrl [[REG:%r[0-5]]], gdst16u@GOT 137*9880d681SAndroid Build Coastguard Worker; CHECK: sth %r2, 0([[REG]]) 138*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 139*9880d681SAndroid Build Coastguard Worker %half = trunc i64 %val to i16 140*9880d681SAndroid Build Coastguard Worker store i16 %half, i16 *@gdst16u, align 1 141*9880d681SAndroid Build Coastguard Worker ret void 142*9880d681SAndroid Build Coastguard Worker} 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Worker; Repeat f6 with an unaligned variable. 145*9880d681SAndroid Build Coastguard Workerdefine void @f13(i64 %val) { 146*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f13: 147*9880d681SAndroid Build Coastguard Worker; CHECK: larl [[REG:%r[0-5]]], gdst32u 148*9880d681SAndroid Build Coastguard Worker; CHECK: st %r2, 0([[REG]]) 149*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 150*9880d681SAndroid Build Coastguard Worker %word = trunc i64 %val to i32 151*9880d681SAndroid Build Coastguard Worker store i32 %word, i32 *@gdst32u, align 2 152*9880d681SAndroid Build Coastguard Worker ret void 153*9880d681SAndroid Build Coastguard Worker} 154*9880d681SAndroid Build Coastguard Worker 155*9880d681SAndroid Build Coastguard Worker; Repeat f7 with unaligned variables. 156*9880d681SAndroid Build Coastguard Workerdefine void @f14() { 157*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f14: 158*9880d681SAndroid Build Coastguard Worker; CHECK: larl [[REG:%r[0-5]]], gsrc64u 159*9880d681SAndroid Build Coastguard Worker; CHECK: lg [[VAL:%r[0-5]]], 0([[REG]]) 160*9880d681SAndroid Build Coastguard Worker; CHECK: larl [[REG:%r[0-5]]], gdst64u 161*9880d681SAndroid Build Coastguard Worker; CHECK: stg [[VAL]], 0([[REG]]) 162*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 163*9880d681SAndroid Build Coastguard Worker %val = load i64 , i64 *@gsrc64u, align 4 164*9880d681SAndroid Build Coastguard Worker store i64 %val, i64 *@gdst64u, align 4 165*9880d681SAndroid Build Coastguard Worker ret void 166*9880d681SAndroid Build Coastguard Worker} 167