1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 2; Test use of LOAD INDEXED ADDRESS word instructions. 3; 4; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=arch15 | FileCheck %s 5 6; LXAF with base and index. 7define dso_local ptr @f0(ptr %ptr, i32 %idx) { 8; CHECK-LABEL: f0: 9; CHECK: # %bb.0: 10; CHECK-NEXT: lxaf %r2, 0(%r3,%r2) 11; CHECK-NEXT: br %r14 12 %idxprom = sext i32 %idx to i64 13 %arrayidx = getelementptr inbounds i32, ptr %ptr, i64 %idxprom 14 ret ptr %arrayidx 15} 16 17; LXAF with base and index (implied extension). 18define dso_local ptr @f1(ptr %ptr, i32 signext %idx) { 19; CHECK-LABEL: f1: 20; CHECK: # %bb.0: 21; CHECK-NEXT: lxaf %r2, 0(%r3,%r2) 22; CHECK-NEXT: br %r14 23 %idxprom = sext i32 %idx to i64 24 %arrayidx = getelementptr inbounds i32, ptr %ptr, i64 %idxprom 25 ret ptr %arrayidx 26} 27 28; LXAF with base and index and max displacement. 29define dso_local ptr @f2(ptr %ptr, i32 %idx) { 30; CHECK-LABEL: f2: 31; CHECK: # %bb.0: 32; CHECK-NEXT: lxaf %r2, 524287(%r3,%r2) 33; CHECK-NEXT: br %r14 34 %idxoff = add i32 %idx, 524287 35 %idxprom = sext i32 %idxoff to i64 36 %arrayidx = getelementptr inbounds i32, ptr %ptr, i64 %idxprom 37 ret ptr %arrayidx 38} 39 40; LXAF with base and index and min displacement. 41define dso_local ptr @f3(ptr %ptr, i32 %idx) { 42; CHECK-LABEL: f3: 43; CHECK: # %bb.0: 44; CHECK-NEXT: lxaf %r2, -524288(%r3,%r2) 45; CHECK-NEXT: br %r14 46 %idxoff = add i32 %idx, -524288 47 %idxprom = sext i32 %idxoff to i64 48 %arrayidx = getelementptr inbounds i32, ptr %ptr, i64 %idxprom 49 ret ptr %arrayidx 50} 51 52; LXAF with base and index and max displacement overflow. 53define dso_local ptr @f4(ptr %ptr, i32 %idx) { 54; CHECK-LABEL: f4: 55; CHECK: # %bb.0: 56; CHECK-NEXT: afi %r3, 524288 57; CHECK-NEXT: lxaf %r2, 0(%r3,%r2) 58; CHECK-NEXT: br %r14 59 %idxoff = add i32 %idx, 524288 60 %idxprom = sext i32 %idxoff to i64 61 %arrayidx = getelementptr inbounds i32, ptr %ptr, i64 %idxprom 62 ret ptr %arrayidx 63} 64 65; LXAF with base and index and min displacement overflow. 66define dso_local ptr @f5(ptr %ptr, i32 %idx) { 67; CHECK-LABEL: f5: 68; CHECK: # %bb.0: 69; CHECK-NEXT: afi %r3, -524289 70; CHECK-NEXT: lxaf %r2, 0(%r3,%r2) 71; CHECK-NEXT: br %r14 72 %idxoff = add i32 %idx, -524289 73 %idxprom = sext i32 %idxoff to i64 74 %arrayidx = getelementptr inbounds i32, ptr %ptr, i64 %idxprom 75 ret ptr %arrayidx 76} 77 78; LXAF with index. 79define dso_local i64 @f6(i32 %idx) { 80; CHECK-LABEL: f6: 81; CHECK: # %bb.0: 82; CHECK-NEXT: lxaf %r2, 0(%r2,0) 83; CHECK-NEXT: br %r14 84 %idxprom = sext i32 %idx to i64 85 %idxshift = shl i64 %idxprom, 2 86 ret i64 %idxshift 87} 88 89; LXAF with index and displacement. 90define dso_local i64 @f7(i32 %idx) { 91; CHECK-LABEL: f7: 92; CHECK: # %bb.0: 93; CHECK-NEXT: lxaf %r2, 1(%r2,0) 94; CHECK-NEXT: br %r14 95 %idxoff = add i32 %idx, 1 96 %idxprom = sext i32 %idxoff to i64 97 %idxshift = shl i64 %idxprom, 2 98 ret i64 %idxshift 99} 100 101