; RUN: llc < %s -mtriple aarch64--none-eabi -verify-machineinstrs | FileCheck %s ; RUN: llc < %s -mtriple aarch64--none-eabi -mattr=+strict-align -verify-machineinstrs | FileCheck %s -check-prefix=CHECK-STRICT ; CHECK-LABEL: Strh_zero ; CHECK: str wzr ; CHECK-STRICT-LABEL: Strh_zero ; CHECK-STRICT: strh wzr ; CHECK-STRICT: strh wzr define void @Strh_zero(i16* nocapture %P, i32 %n) { entry: %idxprom = sext i32 %n to i64 %arrayidx = getelementptr inbounds i16, i16* %P, i64 %idxprom store i16 0, i16* %arrayidx %add = add nsw i32 %n, 1 %idxprom1 = sext i32 %add to i64 %arrayidx2 = getelementptr inbounds i16, i16* %P, i64 %idxprom1 store i16 0, i16* %arrayidx2 ret void } ; CHECK-LABEL: Strh_zero_4 ; CHECK: str xzr ; CHECK-STRICT-LABEL: Strh_zero_4 ; CHECK-STRICT: strh wzr ; CHECK-STRICT: strh wzr ; CHECK-STRICT: strh wzr ; CHECK-STRICT: strh wzr define void @Strh_zero_4(i16* nocapture %P, i32 %n) { entry: %idxprom = sext i32 %n to i64 %arrayidx = getelementptr inbounds i16, i16* %P, i64 %idxprom store i16 0, i16* %arrayidx %add = add nsw i32 %n, 1 %idxprom1 = sext i32 %add to i64 %arrayidx2 = getelementptr inbounds i16, i16* %P, i64 %idxprom1 store i16 0, i16* %arrayidx2 %add3 = add nsw i32 %n, 2 %idxprom4 = sext i32 %add3 to i64 %arrayidx5 = getelementptr inbounds i16, i16* %P, i64 %idxprom4 store i16 0, i16* %arrayidx5 %add6 = add nsw i32 %n, 3 %idxprom7 = sext i32 %add6 to i64 %arrayidx8 = getelementptr inbounds i16, i16* %P, i64 %idxprom7 store i16 0, i16* %arrayidx8 ret void } ; CHECK-LABEL: Strw_zero ; CHECK: str xzr ; CHECK-STRICT-LABEL: Strw_zero ; CHECK-STRICT: stp wzr, wzr define void @Strw_zero(i32* nocapture %P, i32 %n) { entry: %idxprom = sext i32 %n to i64 %arrayidx = getelementptr inbounds i32, i32* %P, i64 %idxprom store i32 0, i32* %arrayidx %add = add nsw i32 %n, 1 %idxprom1 = sext i32 %add to i64 %arrayidx2 = getelementptr inbounds i32, i32* %P, i64 %idxprom1 store i32 0, i32* %arrayidx2 ret void } ; CHECK-LABEL: Strw_zero_nonzero ; CHECK: stp wzr, w1 define void @Strw_zero_nonzero(i32* nocapture %P, i32 %n) { entry: %idxprom = sext i32 %n to i64 %arrayidx = getelementptr inbounds i32, i32* %P, i64 %idxprom store i32 0, i32* %arrayidx %add = add nsw i32 %n, 1 %idxprom1 = sext i32 %add to i64 %arrayidx2 = getelementptr inbounds i32, i32* %P, i64 %idxprom1 store i32 %n, i32* %arrayidx2 ret void } ; CHECK-LABEL: Strw_zero_4 ; CHECK: stp xzr, xzr ; CHECK-STRICT-LABEL: Strw_zero_4 ; CHECK-STRICT: stp wzr, wzr ; CHECK-STRICT: stp wzr, wzr define void @Strw_zero_4(i32* nocapture %P, i32 %n) { entry: %idxprom = sext i32 %n to i64 %arrayidx = getelementptr inbounds i32, i32* %P, i64 %idxprom store i32 0, i32* %arrayidx %add = add nsw i32 %n, 1 %idxprom1 = sext i32 %add to i64 %arrayidx2 = getelementptr inbounds i32, i32* %P, i64 %idxprom1 store i32 0, i32* %arrayidx2 %add3 = add nsw i32 %n, 2 %idxprom4 = sext i32 %add3 to i64 %arrayidx5 = getelementptr inbounds i32, i32* %P, i64 %idxprom4 store i32 0, i32* %arrayidx5 %add6 = add nsw i32 %n, 3 %idxprom7 = sext i32 %add6 to i64 %arrayidx8 = getelementptr inbounds i32, i32* %P, i64 %idxprom7 store i32 0, i32* %arrayidx8 ret void } ; CHECK-LABEL: Sturb_zero ; CHECK: sturh wzr ; CHECK-STRICT-LABEL: Sturb_zero ; CHECK-STRICT: sturb wzr ; CHECK-STRICT: sturb wzr define void @Sturb_zero(i8* nocapture %P, i32 %n) #0 { entry: %sub = add nsw i32 %n, -2 %idxprom = sext i32 %sub to i64 %arrayidx = getelementptr inbounds i8, i8* %P, i64 %idxprom store i8 0, i8* %arrayidx %sub2= add nsw i32 %n, -1 %idxprom1 = sext i32 %sub2 to i64 %arrayidx2 = getelementptr inbounds i8, i8* %P, i64 %idxprom1 store i8 0, i8* %arrayidx2 ret void } ; CHECK-LABEL: Sturh_zero ; CHECK: stur wzr ; CHECK-STRICT-LABEL: Sturh_zero ; CHECK-STRICT: sturh wzr ; CHECK-STRICT: sturh wzr define void @Sturh_zero(i16* nocapture %P, i32 %n) { entry: %sub = add nsw i32 %n, -2 %idxprom = sext i32 %sub to i64 %arrayidx = getelementptr inbounds i16, i16* %P, i64 %idxprom store i16 0, i16* %arrayidx %sub1 = add nsw i32 %n, -3 %idxprom2 = sext i32 %sub1 to i64 %arrayidx3 = getelementptr inbounds i16, i16* %P, i64 %idxprom2 store i16 0, i16* %arrayidx3 ret void } ; CHECK-LABEL: Sturh_zero_4 ; CHECK: stur xzr ; CHECK-STRICT-LABEL: Sturh_zero_4 ; CHECK-STRICT: sturh wzr ; CHECK-STRICT: sturh wzr ; CHECK-STRICT: sturh wzr ; CHECK-STRICT: sturh wzr define void @Sturh_zero_4(i16* nocapture %P, i32 %n) { entry: %sub = add nsw i32 %n, -3 %idxprom = sext i32 %sub to i64 %arrayidx = getelementptr inbounds i16, i16* %P, i64 %idxprom store i16 0, i16* %arrayidx %sub1 = add nsw i32 %n, -4 %idxprom2 = sext i32 %sub1 to i64 %arrayidx3 = getelementptr inbounds i16, i16* %P, i64 %idxprom2 store i16 0, i16* %arrayidx3 %sub4 = add nsw i32 %n, -2 %idxprom5 = sext i32 %sub4 to i64 %arrayidx6 = getelementptr inbounds i16, i16* %P, i64 %idxprom5 store i16 0, i16* %arrayidx6 %sub7 = add nsw i32 %n, -1 %idxprom8 = sext i32 %sub7 to i64 %arrayidx9 = getelementptr inbounds i16, i16* %P, i64 %idxprom8 store i16 0, i16* %arrayidx9 ret void } ; CHECK-LABEL: Sturw_zero ; CHECK: stur xzr ; CHECK-STRICT-LABEL: Sturw_zero ; CHECK-STRICT: stp wzr, wzr define void @Sturw_zero(i32* nocapture %P, i32 %n) { entry: %sub = add nsw i32 %n, -3 %idxprom = sext i32 %sub to i64 %arrayidx = getelementptr inbounds i32, i32* %P, i64 %idxprom store i32 0, i32* %arrayidx %sub1 = add nsw i32 %n, -4 %idxprom2 = sext i32 %sub1 to i64 %arrayidx3 = getelementptr inbounds i32, i32* %P, i64 %idxprom2 store i32 0, i32* %arrayidx3 ret void } ; CHECK-LABEL: Sturw_zero_4 ; CHECK: stp xzr, xzr ; CHECK-STRICT-LABEL: Sturw_zero_4 ; CHECK-STRICT: stp wzr, wzr ; CHECK-STRICT: stp wzr, wzr define void @Sturw_zero_4(i32* nocapture %P, i32 %n) { entry: %sub = add nsw i32 %n, -3 %idxprom = sext i32 %sub to i64 %arrayidx = getelementptr inbounds i32, i32* %P, i64 %idxprom store i32 0, i32* %arrayidx %sub1 = add nsw i32 %n, -4 %idxprom2 = sext i32 %sub1 to i64 %arrayidx3 = getelementptr inbounds i32, i32* %P, i64 %idxprom2 store i32 0, i32* %arrayidx3 %sub4 = add nsw i32 %n, -2 %idxprom5 = sext i32 %sub4 to i64 %arrayidx6 = getelementptr inbounds i32, i32* %P, i64 %idxprom5 store i32 0, i32* %arrayidx6 %sub7 = add nsw i32 %n, -1 %idxprom8 = sext i32 %sub7 to i64 %arrayidx9 = getelementptr inbounds i32, i32* %P, i64 %idxprom8 store i32 0, i32* %arrayidx9 ret void }