806 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc < %s -mtriple aarch64 -verify-machineinstrs | FileCheck %s3 4define i64 @Str64Ldr64(ptr nocapture %P, i64 %v, i64 %n) {5; CHECK-LABEL: Str64Ldr64:6; CHECK: // %bb.0: // %entry7; CHECK-NEXT: mov x8, x08; CHECK-NEXT: mov x0, x19; CHECK-NEXT: str x1, [x8, #8]10; CHECK-NEXT: ret11entry:12 %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 113 store i64 %v, ptr %arrayidx014 %arrayidx1 = getelementptr inbounds i64, ptr %P, i64 115 %0 = load i64, ptr %arrayidx116 ret i64 %017}18 19define i32 @Str64Ldr32_0(ptr nocapture %P, i64 %v, i64 %n) {20; CHECK-LABEL: Str64Ldr32_0:21; CHECK: // %bb.0: // %entry22; CHECK-NEXT: mov x8, x023; CHECK-NEXT: mov w0, w124; CHECK-NEXT: str x1, [x8, #8]25; CHECK-NEXT: ret26entry:27 %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 128 store i64 %v, ptr %arrayidx029 %arrayidx1 = getelementptr inbounds i32, ptr %P, i64 230 %0 = load i32, ptr %arrayidx131 ret i32 %032}33 34define i32 @Str64Ldr32_1(ptr nocapture %P, i64 %v, i64 %n) {35; CHECK-LABEL: Str64Ldr32_1:36; CHECK: // %bb.0: // %entry37; CHECK-NEXT: str x1, [x0, #8]38; CHECK-NEXT: lsr x0, x1, #3239; CHECK-NEXT: ret40entry:41 %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 142 store i64 %v, ptr %arrayidx043 %arrayidx1 = getelementptr inbounds i32, ptr %P, i64 344 %0 = load i32, ptr %arrayidx145 ret i32 %046}47 48define i16 @Str64Ldr16_0(ptr nocapture %P, i64 %v, i64 %n) {49; CHECK-LABEL: Str64Ldr16_0:50; CHECK: // %bb.0: // %entry51; CHECK-NEXT: mov x8, x052; CHECK-NEXT: mov w0, w153; CHECK-NEXT: str x1, [x8, #8]54; CHECK-NEXT: ret55entry:56 %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 157 store i64 %v, ptr %arrayidx058 %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 459 %0 = load i16, ptr %arrayidx160 ret i16 %061}62 63define i16 @Str64Ldr16_1(ptr nocapture %P, i64 %v, i64 %n) {64; CHECK-LABEL: Str64Ldr16_1:65; CHECK: // %bb.0: // %entry66; CHECK-NEXT: str x1, [x0, #8]67; CHECK-NEXT: lsr w0, w1, #1668; CHECK-NEXT: ret69entry:70 %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 171 store i64 %v, ptr %arrayidx072 %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 573 %0 = load i16, ptr %arrayidx174 ret i16 %075}76 77define i16 @Str64Ldr16_2(ptr nocapture %P, i64 %v, i64 %n) {78; CHECK-LABEL: Str64Ldr16_2:79; CHECK: // %bb.0: // %entry80; CHECK-NEXT: str x1, [x0, #8]81; CHECK-NEXT: ubfx x0, x1, #32, #1682; CHECK-NEXT: ret83entry:84 %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 185 store i64 %v, ptr %arrayidx086 %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 687 %0 = load i16, ptr %arrayidx188 ret i16 %089}90 91define i16 @Str64Ldr16_3(ptr nocapture %P, i64 %v, i64 %n) {92; CHECK-LABEL: Str64Ldr16_3:93; CHECK: // %bb.0: // %entry94; CHECK-NEXT: str x1, [x0, #8]95; CHECK-NEXT: lsr x0, x1, #4896; CHECK-NEXT: ret97entry:98 %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 199 store i64 %v, ptr %arrayidx0100 %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 7101 %0 = load i16, ptr %arrayidx1102 ret i16 %0103}104 105define i8 @Str64Ldr8_0(ptr nocapture %P, i64 %v, i64 %n) {106; CHECK-LABEL: Str64Ldr8_0:107; CHECK: // %bb.0: // %entry108; CHECK-NEXT: mov x8, x0109; CHECK-NEXT: mov w0, w1110; CHECK-NEXT: str x1, [x8, #8]111; CHECK-NEXT: ret112entry:113 %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 1114 store i64 %v, ptr %arrayidx0115 %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 8116 %0 = load i8, ptr %arrayidx1117 ret i8 %0118}119 120define i8 @Str64Ldr8_1(ptr nocapture %P, i64 %v, i64 %n) {121; CHECK-LABEL: Str64Ldr8_1:122; CHECK: // %bb.0: // %entry123; CHECK-NEXT: str x1, [x0, #8]124; CHECK-NEXT: ubfx x0, x1, #8, #8125; CHECK-NEXT: ret126entry:127 %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 1128 store i64 %v, ptr %arrayidx0129 %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 9130 %0 = load i8, ptr %arrayidx1131 ret i8 %0132}133 134define i8 @Str64Ldr8_2(ptr nocapture %P, i64 %v, i64 %n) {135; CHECK-LABEL: Str64Ldr8_2:136; CHECK: // %bb.0: // %entry137; CHECK-NEXT: str x1, [x0, #8]138; CHECK-NEXT: ubfx x0, x1, #16, #8139; CHECK-NEXT: ret140entry:141 %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 1142 store i64 %v, ptr %arrayidx0143 %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 10144 %0 = load i8, ptr %arrayidx1145 ret i8 %0146}147 148define i8 @Str64Ldr8_3(ptr nocapture %P, i64 %v, i64 %n) {149; CHECK-LABEL: Str64Ldr8_3:150; CHECK: // %bb.0: // %entry151; CHECK-NEXT: str x1, [x0, #8]152; CHECK-NEXT: lsr w0, w1, #24153; CHECK-NEXT: ret154entry:155 %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 1156 store i64 %v, ptr %arrayidx0157 %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 11158 %0 = load i8, ptr %arrayidx1159 ret i8 %0160}161 162define i8 @Str64Ldr8_4(ptr nocapture %P, i64 %v, i64 %n) {163; CHECK-LABEL: Str64Ldr8_4:164; CHECK: // %bb.0: // %entry165; CHECK-NEXT: str x1, [x0, #8]166; CHECK-NEXT: ubfx x0, x1, #32, #8167; CHECK-NEXT: ret168entry:169 %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 1170 store i64 %v, ptr %arrayidx0171 %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 12172 %0 = load i8, ptr %arrayidx1173 ret i8 %0174}175 176define i8 @Str64Ldr8_5(ptr nocapture %P, i64 %v, i64 %n) {177; CHECK-LABEL: Str64Ldr8_5:178; CHECK: // %bb.0: // %entry179; CHECK-NEXT: str x1, [x0, #8]180; CHECK-NEXT: ubfx x0, x1, #40, #8181; CHECK-NEXT: ret182entry:183 %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 1184 store i64 %v, ptr %arrayidx0185 %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 13186 %0 = load i8, ptr %arrayidx1187 ret i8 %0188}189 190define i8 @Str64Ldr8_6(ptr nocapture %P, i64 %v, i64 %n) {191; CHECK-LABEL: Str64Ldr8_6:192; CHECK: // %bb.0: // %entry193; CHECK-NEXT: str x1, [x0, #8]194; CHECK-NEXT: ubfx x0, x1, #48, #8195; CHECK-NEXT: ret196entry:197 %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 1198 store i64 %v, ptr %arrayidx0199 %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 14200 %0 = load i8, ptr %arrayidx1201 ret i8 %0202}203 204define i8 @Str64Ldr8_7(ptr nocapture %P, i64 %v, i64 %n) {205; CHECK-LABEL: Str64Ldr8_7:206; CHECK: // %bb.0: // %entry207; CHECK-NEXT: str x1, [x0, #8]208; CHECK-NEXT: lsr x0, x1, #56209; CHECK-NEXT: ret210entry:211 %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 1212 store i64 %v, ptr %arrayidx0213 %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 15214 %0 = load i8, ptr %arrayidx1215 ret i8 %0216}217 218define i32 @Str32Ldr32(ptr nocapture %P, i32 %v, i64 %n) {219; CHECK-LABEL: Str32Ldr32:220; CHECK: // %bb.0: // %entry221; CHECK-NEXT: mov x8, x0222; CHECK-NEXT: mov w0, w1223; CHECK-NEXT: str w1, [x8, #4]224; CHECK-NEXT: ret225entry:226 %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 1227 store i32 %v, ptr %arrayidx0228 %arrayidx1 = getelementptr inbounds i32, ptr %P, i64 1229 %0 = load i32, ptr %arrayidx1230 ret i32 %0231}232 233define i16 @Str32Ldr16_0(ptr nocapture %P, i32 %v, i64 %n) {234; CHECK-LABEL: Str32Ldr16_0:235; CHECK: // %bb.0: // %entry236; CHECK-NEXT: mov x8, x0237; CHECK-NEXT: mov w0, w1238; CHECK-NEXT: str w1, [x8, #4]239; CHECK-NEXT: ret240entry:241 %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 1242 store i32 %v, ptr %arrayidx0243 %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 2244 %0 = load i16, ptr %arrayidx1245 ret i16 %0246}247 248define i16 @Str32Ldr16_1(ptr nocapture %P, i32 %v, i64 %n) {249; CHECK-LABEL: Str32Ldr16_1:250; CHECK: // %bb.0: // %entry251; CHECK-NEXT: str w1, [x0, #4]252; CHECK-NEXT: lsr w0, w1, #16253; CHECK-NEXT: ret254entry:255 %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 1256 store i32 %v, ptr %arrayidx0257 %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 3258 %0 = load i16, ptr %arrayidx1259 ret i16 %0260}261 262define i8 @Str32Ldr8_0(ptr nocapture %P, i32 %v, i64 %n) {263; CHECK-LABEL: Str32Ldr8_0:264; CHECK: // %bb.0: // %entry265; CHECK-NEXT: mov x8, x0266; CHECK-NEXT: mov w0, w1267; CHECK-NEXT: str w1, [x8, #4]268; CHECK-NEXT: ret269entry:270 %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 1271 store i32 %v, ptr %arrayidx0272 %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 4273 %0 = load i8, ptr %arrayidx1274 ret i8 %0275}276 277define i8 @Str32Ldr8_1(ptr nocapture %P, i32 %v, i64 %n) {278; CHECK-LABEL: Str32Ldr8_1:279; CHECK: // %bb.0: // %entry280; CHECK-NEXT: str w1, [x0, #4]281; CHECK-NEXT: ubfx w0, w1, #8, #8282; CHECK-NEXT: ret283entry:284 %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 1285 store i32 %v, ptr %arrayidx0286 %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 5287 %0 = load i8, ptr %arrayidx1288 ret i8 %0289}290 291define i8 @Str32Ldr8_2(ptr nocapture %P, i32 %v, i64 %n) {292; CHECK-LABEL: Str32Ldr8_2:293; CHECK: // %bb.0: // %entry294; CHECK-NEXT: str w1, [x0, #4]295; CHECK-NEXT: ubfx w0, w1, #16, #8296; CHECK-NEXT: ret297entry:298 %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 1299 store i32 %v, ptr %arrayidx0300 %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 6301 %0 = load i8, ptr %arrayidx1302 ret i8 %0303}304 305define i8 @Str32Ldr8_3(ptr nocapture %P, i32 %v, i64 %n) {306; CHECK-LABEL: Str32Ldr8_3:307; CHECK: // %bb.0: // %entry308; CHECK-NEXT: str w1, [x0, #4]309; CHECK-NEXT: lsr w0, w1, #24310; CHECK-NEXT: ret311entry:312 %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 1313 store i32 %v, ptr %arrayidx0314 %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 7315 %0 = load i8, ptr %arrayidx1316 ret i8 %0317}318 319define i16 @Str16Ldr16(ptr nocapture %P, i16 %v, i64 %n) {320; CHECK-LABEL: Str16Ldr16:321; CHECK: // %bb.0: // %entry322; CHECK-NEXT: mov x8, x0323; CHECK-NEXT: mov w0, w1324; CHECK-NEXT: strh w1, [x8, #2]325; CHECK-NEXT: ret326entry:327 %arrayidx0 = getelementptr inbounds i16, ptr %P, i64 1328 store i16 %v, ptr %arrayidx0329 %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 1330 %0 = load i16, ptr %arrayidx1331 ret i16 %0332}333 334define i8 @Str16Ldr8_0(ptr nocapture %P, i16 %v, i64 %n) {335; CHECK-LABEL: Str16Ldr8_0:336; CHECK: // %bb.0: // %entry337; CHECK-NEXT: mov x8, x0338; CHECK-NEXT: mov w0, w1339; CHECK-NEXT: strh w1, [x8, #2]340; CHECK-NEXT: ret341entry:342 %arrayidx0 = getelementptr inbounds i16, ptr %P, i64 1343 store i16 %v, ptr %arrayidx0344 %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 2345 %0 = load i8, ptr %arrayidx1346 ret i8 %0347}348 349define i8 @Str16Ldr8_1(ptr nocapture %P, i16 %v, i64 %n) {350; CHECK-LABEL: Str16Ldr8_1:351; CHECK: // %bb.0: // %entry352; CHECK-NEXT: strh w1, [x0, #2]353; CHECK-NEXT: ubfx w0, w1, #8, #8354; CHECK-NEXT: ret355entry:356 %arrayidx0 = getelementptr inbounds i16, ptr %P, i64 1357 store i16 %v, ptr %arrayidx0358 %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 3359 %0 = load i8, ptr %arrayidx1360 ret i8 %0361}362 363 364define i64 @Unscaled_Str64Ldr64(ptr nocapture %P, i64 %v, i64 %n) {365; CHECK-LABEL: Unscaled_Str64Ldr64:366; CHECK: // %bb.0: // %entry367; CHECK-NEXT: mov x8, x0368; CHECK-NEXT: mov x0, x1369; CHECK-NEXT: stur x1, [x8, #-8]370; CHECK-NEXT: ret371entry:372 %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 -1373 store i64 %v, ptr %arrayidx0374 %arrayidx1 = getelementptr inbounds i64, ptr %P, i64 -1375 %0 = load i64, ptr %arrayidx1376 ret i64 %0377}378 379define i32 @Unscaled_Str64Ldr32_0(ptr nocapture %P, i64 %v, i64 %n) {380; CHECK-LABEL: Unscaled_Str64Ldr32_0:381; CHECK: // %bb.0: // %entry382; CHECK-NEXT: mov x8, x0383; CHECK-NEXT: mov w0, w1384; CHECK-NEXT: stur x1, [x8, #-8]385; CHECK-NEXT: ret386entry:387 %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 -1388 store i64 %v, ptr %arrayidx0389 %arrayidx1 = getelementptr inbounds i32, ptr %P, i64 -2390 %0 = load i32, ptr %arrayidx1391 ret i32 %0392}393 394define i32 @Unscaled_Str64Ldr32_1(ptr nocapture %P, i64 %v, i64 %n) {395; CHECK-LABEL: Unscaled_Str64Ldr32_1:396; CHECK: // %bb.0: // %entry397; CHECK-NEXT: stur x1, [x0, #-8]398; CHECK-NEXT: lsr x0, x1, #32399; CHECK-NEXT: ret400entry:401 %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 -1402 store i64 %v, ptr %arrayidx0403 %arrayidx1 = getelementptr inbounds i32, ptr %P, i64 -1404 %0 = load i32, ptr %arrayidx1405 ret i32 %0406}407 408define i16 @Unscaled_Str64Ldr16_0(ptr nocapture %P, i64 %v, i64 %n) {409; CHECK-LABEL: Unscaled_Str64Ldr16_0:410; CHECK: // %bb.0: // %entry411; CHECK-NEXT: mov x8, x0412; CHECK-NEXT: mov w0, w1413; CHECK-NEXT: stur x1, [x8, #-8]414; CHECK-NEXT: ret415entry:416 %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 -1417 store i64 %v, ptr %arrayidx0418 %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 -4419 %0 = load i16, ptr %arrayidx1420 ret i16 %0421}422 423define i16 @Unscaled_Str64Ldr16_1(ptr nocapture %P, i64 %v, i64 %n) {424; CHECK-LABEL: Unscaled_Str64Ldr16_1:425; CHECK: // %bb.0: // %entry426; CHECK-NEXT: stur x1, [x0, #-8]427; CHECK-NEXT: lsr w0, w1, #16428; CHECK-NEXT: ret429entry:430 %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 -1431 store i64 %v, ptr %arrayidx0432 %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 -3433 %0 = load i16, ptr %arrayidx1434 ret i16 %0435}436 437define i16 @Unscaled_Str64Ldr16_2(ptr nocapture %P, i64 %v, i64 %n) {438; CHECK-LABEL: Unscaled_Str64Ldr16_2:439; CHECK: // %bb.0: // %entry440; CHECK-NEXT: stur x1, [x0, #-8]441; CHECK-NEXT: ubfx x0, x1, #32, #16442; CHECK-NEXT: ret443entry:444 %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 -1445 store i64 %v, ptr %arrayidx0446 %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 -2447 %0 = load i16, ptr %arrayidx1448 ret i16 %0449}450 451define i16 @Unscaled_Str64Ldr16_3(ptr nocapture %P, i64 %v, i64 %n) {452; CHECK-LABEL: Unscaled_Str64Ldr16_3:453; CHECK: // %bb.0: // %entry454; CHECK-NEXT: stur x1, [x0, #-8]455; CHECK-NEXT: lsr x0, x1, #48456; CHECK-NEXT: ret457entry:458 %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 -1459 store i64 %v, ptr %arrayidx0460 %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 -1461 %0 = load i16, ptr %arrayidx1462 ret i16 %0463}464 465define i8 @Unscaled_Str64Ldr8_0(ptr nocapture %P, i64 %v, i64 %n) {466; CHECK-LABEL: Unscaled_Str64Ldr8_0:467; CHECK: // %bb.0: // %entry468; CHECK-NEXT: mov x8, x0469; CHECK-NEXT: mov w0, w1470; CHECK-NEXT: stur x1, [x8, #-8]471; CHECK-NEXT: ret472entry:473 %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 -1474 store i64 %v, ptr %arrayidx0475 %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 -8476 %0 = load i8, ptr %arrayidx1477 ret i8 %0478}479 480define i8 @Unscaled_Str64Ldr8_1(ptr nocapture %P, i64 %v, i64 %n) {481; CHECK-LABEL: Unscaled_Str64Ldr8_1:482; CHECK: // %bb.0: // %entry483; CHECK-NEXT: stur x1, [x0, #-8]484; CHECK-NEXT: ubfx x0, x1, #8, #8485; CHECK-NEXT: ret486entry:487 %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 -1488 store i64 %v, ptr %arrayidx0489 %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 -7490 %0 = load i8, ptr %arrayidx1491 ret i8 %0492}493 494define i8 @Unscaled_Str64Ldr8_2(ptr nocapture %P, i64 %v, i64 %n) {495; CHECK-LABEL: Unscaled_Str64Ldr8_2:496; CHECK: // %bb.0: // %entry497; CHECK-NEXT: stur x1, [x0, #-8]498; CHECK-NEXT: ubfx x0, x1, #16, #8499; CHECK-NEXT: ret500entry:501 %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 -1502 store i64 %v, ptr %arrayidx0503 %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 -6504 %0 = load i8, ptr %arrayidx1505 ret i8 %0506}507 508define i8 @Unscaled_Str64Ldr8_3(ptr nocapture %P, i64 %v, i64 %n) {509; CHECK-LABEL: Unscaled_Str64Ldr8_3:510; CHECK: // %bb.0: // %entry511; CHECK-NEXT: stur x1, [x0, #-8]512; CHECK-NEXT: lsr w0, w1, #24513; CHECK-NEXT: ret514entry:515 %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 -1516 store i64 %v, ptr %arrayidx0517 %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 -5518 %0 = load i8, ptr %arrayidx1519 ret i8 %0520}521 522define i8 @Unscaled_Str64Ldr8_4(ptr nocapture %P, i64 %v, i64 %n) {523; CHECK-LABEL: Unscaled_Str64Ldr8_4:524; CHECK: // %bb.0: // %entry525; CHECK-NEXT: stur x1, [x0, #-8]526; CHECK-NEXT: ubfx x0, x1, #32, #8527; CHECK-NEXT: ret528entry:529 %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 -1530 store i64 %v, ptr %arrayidx0531 %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 -4532 %0 = load i8, ptr %arrayidx1533 ret i8 %0534}535 536define i8 @Unscaled_Str64Ldr8_5(ptr nocapture %P, i64 %v, i64 %n) {537; CHECK-LABEL: Unscaled_Str64Ldr8_5:538; CHECK: // %bb.0: // %entry539; CHECK-NEXT: stur x1, [x0, #-8]540; CHECK-NEXT: ubfx x0, x1, #40, #8541; CHECK-NEXT: ret542entry:543 %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 -1544 store i64 %v, ptr %arrayidx0545 %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 -3546 %0 = load i8, ptr %arrayidx1547 ret i8 %0548}549 550define i8 @Unscaled_Str64Ldr8_6(ptr nocapture %P, i64 %v, i64 %n) {551; CHECK-LABEL: Unscaled_Str64Ldr8_6:552; CHECK: // %bb.0: // %entry553; CHECK-NEXT: stur x1, [x0, #-8]554; CHECK-NEXT: ubfx x0, x1, #48, #8555; CHECK-NEXT: ret556entry:557 %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 -1558 store i64 %v, ptr %arrayidx0559 %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 -2560 %0 = load i8, ptr %arrayidx1561 ret i8 %0562}563 564define i8 @Unscaled_Str64Ldr8_7(ptr nocapture %P, i64 %v, i64 %n) {565; CHECK-LABEL: Unscaled_Str64Ldr8_7:566; CHECK: // %bb.0: // %entry567; CHECK-NEXT: stur x1, [x0, #-8]568; CHECK-NEXT: lsr x0, x1, #56569; CHECK-NEXT: ret570entry:571 %arrayidx0 = getelementptr inbounds i64, ptr %P, i64 -1572 store i64 %v, ptr %arrayidx0573 %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 -1574 %0 = load i8, ptr %arrayidx1575 ret i8 %0576}577 578define i32 @Unscaled_Str32Ldr32(ptr nocapture %P, i32 %v, i64 %n) {579; CHECK-LABEL: Unscaled_Str32Ldr32:580; CHECK: // %bb.0: // %entry581; CHECK-NEXT: mov x8, x0582; CHECK-NEXT: mov w0, w1583; CHECK-NEXT: stur w1, [x8, #-4]584; CHECK-NEXT: ret585entry:586 %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 -1587 store i32 %v, ptr %arrayidx0588 %arrayidx1 = getelementptr inbounds i32, ptr %P, i64 -1589 %0 = load i32, ptr %arrayidx1590 ret i32 %0591}592 593define i16 @Unscaled_Str32Ldr16_0(ptr nocapture %P, i32 %v, i64 %n) {594; CHECK-LABEL: Unscaled_Str32Ldr16_0:595; CHECK: // %bb.0: // %entry596; CHECK-NEXT: mov x8, x0597; CHECK-NEXT: mov w0, w1598; CHECK-NEXT: stur w1, [x8, #-4]599; CHECK-NEXT: ret600entry:601 %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 -1602 store i32 %v, ptr %arrayidx0603 %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 -2604 %0 = load i16, ptr %arrayidx1605 ret i16 %0606}607 608define i16 @Unscaled_Str32Ldr16_1(ptr nocapture %P, i32 %v, i64 %n) {609; CHECK-LABEL: Unscaled_Str32Ldr16_1:610; CHECK: // %bb.0: // %entry611; CHECK-NEXT: stur w1, [x0, #-4]612; CHECK-NEXT: lsr w0, w1, #16613; CHECK-NEXT: ret614entry:615 %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 -1616 store i32 %v, ptr %arrayidx0617 %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 -1618 %0 = load i16, ptr %arrayidx1619 ret i16 %0620}621 622define i8 @Unscaled_Str32Ldr8_0(ptr nocapture %P, i32 %v, i64 %n) {623; CHECK-LABEL: Unscaled_Str32Ldr8_0:624; CHECK: // %bb.0: // %entry625; CHECK-NEXT: mov x8, x0626; CHECK-NEXT: mov w0, w1627; CHECK-NEXT: stur w1, [x8, #-4]628; CHECK-NEXT: ret629entry:630 %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 -1631 store i32 %v, ptr %arrayidx0632 %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 -4633 %0 = load i8, ptr %arrayidx1634 ret i8 %0635}636 637define i8 @Unscaled_Str32Ldr8_1(ptr nocapture %P, i32 %v, i64 %n) {638; CHECK-LABEL: Unscaled_Str32Ldr8_1:639; CHECK: // %bb.0: // %entry640; CHECK-NEXT: stur w1, [x0, #-4]641; CHECK-NEXT: ubfx w0, w1, #8, #8642; CHECK-NEXT: ret643entry:644 %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 -1645 store i32 %v, ptr %arrayidx0646 %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 -3647 %0 = load i8, ptr %arrayidx1648 ret i8 %0649}650 651define i8 @Unscaled_Str32Ldr8_2(ptr nocapture %P, i32 %v, i64 %n) {652; CHECK-LABEL: Unscaled_Str32Ldr8_2:653; CHECK: // %bb.0: // %entry654; CHECK-NEXT: stur w1, [x0, #-4]655; CHECK-NEXT: ubfx w0, w1, #16, #8656; CHECK-NEXT: ret657entry:658 %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 -1659 store i32 %v, ptr %arrayidx0660 %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 -2661 %0 = load i8, ptr %arrayidx1662 ret i8 %0663}664 665define i8 @Unscaled_Str32Ldr8_3(ptr nocapture %P, i32 %v, i64 %n) {666; CHECK-LABEL: Unscaled_Str32Ldr8_3:667; CHECK: // %bb.0: // %entry668; CHECK-NEXT: stur w1, [x0, #-4]669; CHECK-NEXT: lsr w0, w1, #24670; CHECK-NEXT: ret671entry:672 %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 -1673 store i32 %v, ptr %arrayidx0674 %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 -1675 %0 = load i8, ptr %arrayidx1676 ret i8 %0677}678 679define i16 @Unscaled_Str16Ldr16(ptr nocapture %P, i16 %v, i64 %n) {680; CHECK-LABEL: Unscaled_Str16Ldr16:681; CHECK: // %bb.0: // %entry682; CHECK-NEXT: mov x8, x0683; CHECK-NEXT: mov w0, w1684; CHECK-NEXT: sturh w1, [x8, #-2]685; CHECK-NEXT: ret686entry:687 %arrayidx0 = getelementptr inbounds i16, ptr %P, i64 -1688 store i16 %v, ptr %arrayidx0689 %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 -1690 %0 = load i16, ptr %arrayidx1691 ret i16 %0692}693 694define i8 @Unscaled_Str16Ldr8_0(ptr nocapture %P, i16 %v, i64 %n) {695; CHECK-LABEL: Unscaled_Str16Ldr8_0:696; CHECK: // %bb.0: // %entry697; CHECK-NEXT: mov x8, x0698; CHECK-NEXT: mov w0, w1699; CHECK-NEXT: sturh w1, [x8, #-2]700; CHECK-NEXT: ret701entry:702 %arrayidx0 = getelementptr inbounds i16, ptr %P, i64 -1703 store i16 %v, ptr %arrayidx0704 %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 -2705 %0 = load i8, ptr %arrayidx1706 ret i8 %0707}708 709define i8 @Unscaled_Str16Ldr8_1(ptr nocapture %P, i16 %v, i64 %n) {710; CHECK-LABEL: Unscaled_Str16Ldr8_1:711; CHECK: // %bb.0: // %entry712; CHECK-NEXT: sturh w1, [x0, #-2]713; CHECK-NEXT: ubfx w0, w1, #8, #8714; CHECK-NEXT: ret715entry:716 %arrayidx0 = getelementptr inbounds i16, ptr %P, i64 -1717 store i16 %v, ptr %arrayidx0718 %arrayidx1 = getelementptr inbounds i8, ptr %P, i64 -1719 %0 = load i8, ptr %arrayidx1720 ret i8 %0721}722 723define i16 @StrVolatileLdr(ptr nocapture %P, i32 %v, i64 %n) {724; CHECK-LABEL: StrVolatileLdr:725; CHECK: // %bb.0: // %entry726; CHECK-NEXT: str w1, [x0, #4]727; CHECK-NEXT: ldrh w0, [x0, #4]728; CHECK-NEXT: ret729entry:730 %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 1731 store i32 %v, ptr %arrayidx0732 %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 2733 %0 = load volatile i16, ptr %arrayidx1734 ret i16 %0735}736 737define i16 @StrNotInRangeLdr(ptr nocapture %P, i32 %v, i64 %n) {738; CHECK-LABEL: StrNotInRangeLdr:739; CHECK: // %bb.0: // %entry740; CHECK-NEXT: mov x8, x0741; CHECK-NEXT: ldrh w0, [x0, #2]742; CHECK-NEXT: str w1, [x8, #4]743; CHECK-NEXT: ret744entry:745 %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 1746 store i32 %v, ptr %arrayidx0747 %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 1748 %0 = load i16, ptr %arrayidx1749 ret i16 %0750}751 752define i16 @Unscaled_StrNotInRangeLdr(ptr nocapture %P, i32 %v, i64 %n) {753; CHECK-LABEL: Unscaled_StrNotInRangeLdr:754; CHECK: // %bb.0: // %entry755; CHECK-NEXT: mov x8, x0756; CHECK-NEXT: ldurh w0, [x0, #-6]757; CHECK-NEXT: stur w1, [x8, #-4]758; CHECK-NEXT: ret759entry:760 %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 -1761 store i32 %v, ptr %arrayidx0762 %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 -3763 %0 = load i16, ptr %arrayidx1764 ret i16 %0765}766 767define i16 @StrCallLdr(ptr nocapture %P, i32 %v, i64 %n) {768; CHECK-LABEL: StrCallLdr:769; CHECK: // %bb.0: // %entry770; CHECK-NEXT: stp x30, x19, [sp, #-16]! // 16-byte Folded Spill771; CHECK-NEXT: .cfi_def_cfa_offset 16772; CHECK-NEXT: .cfi_offset w19, -8773; CHECK-NEXT: .cfi_offset w30, -16774; CHECK-NEXT: mov x19, x0775; CHECK-NEXT: str w1, [x0, #4]776; CHECK-NEXT: bl test_dummy777; CHECK-NEXT: ldrh w0, [x19, #2]778; CHECK-NEXT: ldp x30, x19, [sp], #16 // 16-byte Folded Reload779; CHECK-NEXT: ret780entry:781 %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 1782 store i32 %v, ptr %arrayidx0783 %c = call i1 @test_dummy()784 %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 1785 %0 = load i16, ptr %arrayidx1786 ret i16 %0787}788 789declare i1 @test_dummy()790 791define i16 @StrStrLdr(i32 %v, ptr %P, ptr %P2, i32 %n) {792; CHECK-LABEL: StrStrLdr:793; CHECK: // %bb.0: // %entry794; CHECK-NEXT: str w0, [x1, #4]795; CHECK-NEXT: str w3, [x2]796; CHECK-NEXT: ldrh w0, [x1, #4]797; CHECK-NEXT: ret798entry:799 %arrayidx0 = getelementptr inbounds i32, ptr %P, i64 1800 store i32 %v, ptr %arrayidx0801 store i32 %n, ptr %P2802 %arrayidx1 = getelementptr inbounds i16, ptr %P, i64 2803 %0 = load i16, ptr %arrayidx1804 ret i16 %0805}806