398 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=aarch64-- | FileCheck %s --check-prefixes=ALL3 4define void @lshr_4bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {5; ALL-LABEL: lshr_4bytes:6; ALL: // %bb.0:7; ALL-NEXT: ldr w8, [x1]8; ALL-NEXT: ldr w9, [x0]9; ALL-NEXT: lsl w8, w8, #310; ALL-NEXT: lsr w8, w9, w811; ALL-NEXT: str w8, [x2]12; ALL-NEXT: ret13 %src = load i32, ptr %src.ptr, align 114 %byteOff = load i32, ptr %byteOff.ptr, align 115 %bitOff = shl i32 %byteOff, 316 %res = lshr i32 %src, %bitOff17 store i32 %res, ptr %dst, align 118 ret void19}20define void @shl_4bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {21; ALL-LABEL: shl_4bytes:22; ALL: // %bb.0:23; ALL-NEXT: ldr w8, [x1]24; ALL-NEXT: ldr w9, [x0]25; ALL-NEXT: lsl w8, w8, #326; ALL-NEXT: lsl w8, w9, w827; ALL-NEXT: str w8, [x2]28; ALL-NEXT: ret29 %src = load i32, ptr %src.ptr, align 130 %byteOff = load i32, ptr %byteOff.ptr, align 131 %bitOff = shl i32 %byteOff, 332 %res = shl i32 %src, %bitOff33 store i32 %res, ptr %dst, align 134 ret void35}36define void @ashr_4bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {37; ALL-LABEL: ashr_4bytes:38; ALL: // %bb.0:39; ALL-NEXT: ldr w8, [x1]40; ALL-NEXT: ldr w9, [x0]41; ALL-NEXT: lsl w8, w8, #342; ALL-NEXT: asr w8, w9, w843; ALL-NEXT: str w8, [x2]44; ALL-NEXT: ret45 %src = load i32, ptr %src.ptr, align 146 %byteOff = load i32, ptr %byteOff.ptr, align 147 %bitOff = shl i32 %byteOff, 348 %res = ashr i32 %src, %bitOff49 store i32 %res, ptr %dst, align 150 ret void51}52 53define void @lshr_8bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {54; ALL-LABEL: lshr_8bytes:55; ALL: // %bb.0:56; ALL-NEXT: ldr x8, [x1]57; ALL-NEXT: ldr x9, [x0]58; ALL-NEXT: lsl x8, x8, #359; ALL-NEXT: lsr x8, x9, x860; ALL-NEXT: str x8, [x2]61; ALL-NEXT: ret62 %src = load i64, ptr %src.ptr, align 163 %byteOff = load i64, ptr %byteOff.ptr, align 164 %bitOff = shl i64 %byteOff, 365 %res = lshr i64 %src, %bitOff66 store i64 %res, ptr %dst, align 167 ret void68}69define void @shl_8bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {70; ALL-LABEL: shl_8bytes:71; ALL: // %bb.0:72; ALL-NEXT: ldr x8, [x1]73; ALL-NEXT: ldr x9, [x0]74; ALL-NEXT: lsl x8, x8, #375; ALL-NEXT: lsl x8, x9, x876; ALL-NEXT: str x8, [x2]77; ALL-NEXT: ret78 %src = load i64, ptr %src.ptr, align 179 %byteOff = load i64, ptr %byteOff.ptr, align 180 %bitOff = shl i64 %byteOff, 381 %res = shl i64 %src, %bitOff82 store i64 %res, ptr %dst, align 183 ret void84}85define void @ashr_8bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {86; ALL-LABEL: ashr_8bytes:87; ALL: // %bb.0:88; ALL-NEXT: ldr x8, [x1]89; ALL-NEXT: ldr x9, [x0]90; ALL-NEXT: lsl x8, x8, #391; ALL-NEXT: asr x8, x9, x892; ALL-NEXT: str x8, [x2]93; ALL-NEXT: ret94 %src = load i64, ptr %src.ptr, align 195 %byteOff = load i64, ptr %byteOff.ptr, align 196 %bitOff = shl i64 %byteOff, 397 %res = ashr i64 %src, %bitOff98 store i64 %res, ptr %dst, align 199 ret void100}101 102define void @lshr_16bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {103; ALL-LABEL: lshr_16bytes:104; ALL: // %bb.0:105; ALL-NEXT: ldr x8, [x1]106; ALL-NEXT: ldp x10, x9, [x0]107; ALL-NEXT: lsl x8, x8, #3108; ALL-NEXT: lsl x11, x9, #1109; ALL-NEXT: and x12, x8, #0x38110; ALL-NEXT: mvn w13, w8111; ALL-NEXT: tst x8, #0x40112; ALL-NEXT: lsr x10, x10, x12113; ALL-NEXT: lsl x11, x11, x13114; ALL-NEXT: lsr x9, x9, x12115; ALL-NEXT: orr x8, x11, x10116; ALL-NEXT: csel x10, xzr, x9, ne117; ALL-NEXT: csel x8, x9, x8, ne118; ALL-NEXT: stp x8, x10, [x2]119; ALL-NEXT: ret120 %src = load i128, ptr %src.ptr, align 1121 %byteOff = load i128, ptr %byteOff.ptr, align 1122 %bitOff = shl i128 %byteOff, 3123 %res = lshr i128 %src, %bitOff124 store i128 %res, ptr %dst, align 1125 ret void126}127define void @shl_16bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {128; ALL-LABEL: shl_16bytes:129; ALL: // %bb.0:130; ALL-NEXT: ldr x8, [x1]131; ALL-NEXT: ldp x9, x10, [x0]132; ALL-NEXT: lsl x8, x8, #3133; ALL-NEXT: lsr x11, x9, #1134; ALL-NEXT: and x12, x8, #0x38135; ALL-NEXT: mvn w13, w8136; ALL-NEXT: tst x8, #0x40137; ALL-NEXT: lsl x10, x10, x12138; ALL-NEXT: lsr x11, x11, x13139; ALL-NEXT: lsl x9, x9, x12140; ALL-NEXT: orr x8, x10, x11141; ALL-NEXT: csel x10, xzr, x9, ne142; ALL-NEXT: csel x8, x9, x8, ne143; ALL-NEXT: stp x10, x8, [x2]144; ALL-NEXT: ret145 %src = load i128, ptr %src.ptr, align 1146 %byteOff = load i128, ptr %byteOff.ptr, align 1147 %bitOff = shl i128 %byteOff, 3148 %res = shl i128 %src, %bitOff149 store i128 %res, ptr %dst, align 1150 ret void151}152define void @ashr_16bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {153; ALL-LABEL: ashr_16bytes:154; ALL: // %bb.0:155; ALL-NEXT: ldr x8, [x1]156; ALL-NEXT: ldp x10, x9, [x0]157; ALL-NEXT: lsl x8, x8, #3158; ALL-NEXT: lsl x11, x9, #1159; ALL-NEXT: and x12, x8, #0x38160; ALL-NEXT: mvn w13, w8161; ALL-NEXT: tst x8, #0x40162; ALL-NEXT: lsr x10, x10, x12163; ALL-NEXT: lsl x11, x11, x13164; ALL-NEXT: asr x12, x9, x12165; ALL-NEXT: asr x9, x9, #63166; ALL-NEXT: orr x8, x11, x10167; ALL-NEXT: csel x9, x9, x12, ne168; ALL-NEXT: csel x8, x12, x8, ne169; ALL-NEXT: stp x8, x9, [x2]170; ALL-NEXT: ret171 %src = load i128, ptr %src.ptr, align 1172 %byteOff = load i128, ptr %byteOff.ptr, align 1173 %bitOff = shl i128 %byteOff, 3174 %res = ashr i128 %src, %bitOff175 store i128 %res, ptr %dst, align 1176 ret void177}178 179define void @lshr_32bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {180; ALL-LABEL: lshr_32bytes:181; ALL: // %bb.0:182; ALL-NEXT: sub sp, sp, #64183; ALL-NEXT: ldp x9, x8, [x0, #16]184; ALL-NEXT: movi v0.2d, #0000000000000000185; ALL-NEXT: ldr x10, [x1]186; ALL-NEXT: ldr q1, [x0]187; ALL-NEXT: stp x9, x8, [sp, #16]188; ALL-NEXT: mov x8, sp189; ALL-NEXT: and x9, x10, #0x18190; ALL-NEXT: str q1, [sp]191; ALL-NEXT: add x8, x8, x9192; ALL-NEXT: lsl x9, x10, #3193; ALL-NEXT: stp q0, q0, [sp, #32]194; ALL-NEXT: ldp x11, x10, [x8, #16]195; ALL-NEXT: mvn w13, w9196; ALL-NEXT: ldp x8, x12, [x8]197; ALL-NEXT: and x9, x9, #0x38198; ALL-NEXT: lsl x14, x10, #1199; ALL-NEXT: lsl x15, x11, #1200; ALL-NEXT: lsr x11, x11, x9201; ALL-NEXT: lsl x16, x12, #1202; ALL-NEXT: lsr x10, x10, x9203; ALL-NEXT: lsr x12, x12, x9204; ALL-NEXT: lsl x14, x14, x13205; ALL-NEXT: lsr x8, x8, x9206; ALL-NEXT: lsl x9, x16, x13207; ALL-NEXT: lsl x13, x15, x13208; ALL-NEXT: orr x11, x14, x11209; ALL-NEXT: orr x8, x9, x8210; ALL-NEXT: orr x9, x12, x13211; ALL-NEXT: stp x11, x10, [x2, #16]212; ALL-NEXT: stp x8, x9, [x2]213; ALL-NEXT: add sp, sp, #64214; ALL-NEXT: ret215 %src = load i256, ptr %src.ptr, align 1216 %byteOff = load i256, ptr %byteOff.ptr, align 1217 %bitOff = shl i256 %byteOff, 3218 %res = lshr i256 %src, %bitOff219 store i256 %res, ptr %dst, align 1220 ret void221}222 223define void @lshr_32bytes_dwordOff(ptr %src.ptr, ptr %dwordOff.ptr, ptr %dst) nounwind {224; ALL-LABEL: lshr_32bytes_dwordOff:225; ALL: // %bb.0:226; ALL-NEXT: sub sp, sp, #64227; ALL-NEXT: ldp x9, x8, [x0, #16]228; ALL-NEXT: movi v0.2d, #0000000000000000229; ALL-NEXT: ldr x10, [x1]230; ALL-NEXT: ldr q1, [x0]231; ALL-NEXT: stp x9, x8, [sp, #16]232; ALL-NEXT: ubfiz x8, x10, #3, #2233; ALL-NEXT: mov x9, sp234; ALL-NEXT: str q1, [sp]235; ALL-NEXT: stp q0, q0, [sp, #32]236; ALL-NEXT: add x8, x9, x8237; ALL-NEXT: ldp x10, x9, [x8, #16]238; ALL-NEXT: ldr q0, [x8]239; ALL-NEXT: str q0, [x2]240; ALL-NEXT: stp x10, x9, [x2, #16]241; ALL-NEXT: add sp, sp, #64242; ALL-NEXT: ret243 %src = load i256, ptr %src.ptr, align 1244 %dwordOff = load i256, ptr %dwordOff.ptr, align 1245 %bitOff = shl i256 %dwordOff, 6246 %res = lshr i256 %src, %bitOff247 store i256 %res, ptr %dst, align 1248 ret void249}250 251define void @shl_32bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {252; ALL-LABEL: shl_32bytes:253; ALL: // %bb.0:254; ALL-NEXT: sub sp, sp, #64255; ALL-NEXT: ldp x9, x8, [x0, #16]256; ALL-NEXT: movi v0.2d, #0000000000000000257; ALL-NEXT: ldr x10, [x1]258; ALL-NEXT: ldr q1, [x0]259; ALL-NEXT: stp x9, x8, [sp, #48]260; ALL-NEXT: mov x8, sp261; ALL-NEXT: and x9, x10, #0x18262; ALL-NEXT: add x8, x8, #32263; ALL-NEXT: stp q0, q0, [sp]264; ALL-NEXT: str q1, [sp, #32]265; ALL-NEXT: sub x8, x8, x9266; ALL-NEXT: lsl x9, x10, #3267; ALL-NEXT: ldp x10, x11, [x8]268; ALL-NEXT: ldp x12, x8, [x8, #16]269; ALL-NEXT: mvn w13, w9270; ALL-NEXT: and x9, x9, #0x38271; ALL-NEXT: lsr x14, x10, #1272; ALL-NEXT: lsr x15, x11, #1273; ALL-NEXT: lsl x11, x11, x9274; ALL-NEXT: lsr x16, x12, #1275; ALL-NEXT: lsl x10, x10, x9276; ALL-NEXT: lsl x12, x12, x9277; ALL-NEXT: lsr x14, x14, x13278; ALL-NEXT: lsl x8, x8, x9279; ALL-NEXT: lsr x9, x16, x13280; ALL-NEXT: lsr x13, x15, x13281; ALL-NEXT: orr x11, x11, x14282; ALL-NEXT: orr x8, x8, x9283; ALL-NEXT: orr x9, x12, x13284; ALL-NEXT: stp x10, x11, [x2]285; ALL-NEXT: stp x9, x8, [x2, #16]286; ALL-NEXT: add sp, sp, #64287; ALL-NEXT: ret288 %src = load i256, ptr %src.ptr, align 1289 %byteOff = load i256, ptr %byteOff.ptr, align 1290 %bitOff = shl i256 %byteOff, 3291 %res = shl i256 %src, %bitOff292 store i256 %res, ptr %dst, align 1293 ret void294}295 296define void @shl_32bytes_dwordOff(ptr %src.ptr, ptr %dwordOff.ptr, ptr %dst) nounwind {297; ALL-LABEL: shl_32bytes_dwordOff:298; ALL: // %bb.0:299; ALL-NEXT: sub sp, sp, #64300; ALL-NEXT: ldp x9, x8, [x0, #16]301; ALL-NEXT: movi v0.2d, #0000000000000000302; ALL-NEXT: ldr x10, [x1]303; ALL-NEXT: ldr q1, [x0]304; ALL-NEXT: stp x9, x8, [sp, #48]305; ALL-NEXT: mov x8, sp306; ALL-NEXT: ubfiz x9, x10, #3, #2307; ALL-NEXT: add x8, x8, #32308; ALL-NEXT: stp q0, q1, [sp, #16]309; ALL-NEXT: str q0, [sp]310; ALL-NEXT: sub x8, x8, x9311; ALL-NEXT: ldp x9, x10, [x8, #16]312; ALL-NEXT: ldr q0, [x8]313; ALL-NEXT: str q0, [x2]314; ALL-NEXT: stp x9, x10, [x2, #16]315; ALL-NEXT: add sp, sp, #64316; ALL-NEXT: ret317 %src = load i256, ptr %src.ptr, align 1318 %dwordOff = load i256, ptr %dwordOff.ptr, align 1319 %bitOff = shl i256 %dwordOff, 6320 %res = shl i256 %src, %bitOff321 store i256 %res, ptr %dst, align 1322 ret void323}324 325define void @ashr_32bytes(ptr %src.ptr, ptr %byteOff.ptr, ptr %dst) nounwind {326; ALL-LABEL: ashr_32bytes:327; ALL: // %bb.0:328; ALL-NEXT: sub sp, sp, #64329; ALL-NEXT: ldp x9, x8, [x0, #16]330; ALL-NEXT: ldr x10, [x1]331; ALL-NEXT: ldr q0, [x0]332; ALL-NEXT: and x11, x10, #0x18333; ALL-NEXT: stp x9, x8, [sp, #16]334; ALL-NEXT: asr x8, x8, #63335; ALL-NEXT: mov x9, sp336; ALL-NEXT: str q0, [sp]337; ALL-NEXT: add x9, x9, x11338; ALL-NEXT: stp x8, x8, [sp, #48]339; ALL-NEXT: stp x8, x8, [sp, #32]340; ALL-NEXT: lsl x8, x10, #3341; ALL-NEXT: ldp x11, x10, [x9, #16]342; ALL-NEXT: ldp x9, x12, [x9]343; ALL-NEXT: mvn w13, w8344; ALL-NEXT: and x8, x8, #0x38345; ALL-NEXT: lsl x14, x10, #1346; ALL-NEXT: lsl x15, x11, #1347; ALL-NEXT: lsr x11, x11, x8348; ALL-NEXT: lsl x16, x12, #1349; ALL-NEXT: asr x10, x10, x8350; ALL-NEXT: lsr x12, x12, x8351; ALL-NEXT: lsl x14, x14, x13352; ALL-NEXT: lsr x8, x9, x8353; ALL-NEXT: lsl x9, x16, x13354; ALL-NEXT: lsl x13, x15, x13355; ALL-NEXT: orr x11, x14, x11356; ALL-NEXT: orr x8, x9, x8357; ALL-NEXT: orr x9, x12, x13358; ALL-NEXT: stp x11, x10, [x2, #16]359; ALL-NEXT: stp x8, x9, [x2]360; ALL-NEXT: add sp, sp, #64361; ALL-NEXT: ret362 %src = load i256, ptr %src.ptr, align 1363 %byteOff = load i256, ptr %byteOff.ptr, align 1364 %bitOff = shl i256 %byteOff, 3365 %res = ashr i256 %src, %bitOff366 store i256 %res, ptr %dst, align 1367 ret void368}369 370define void @ashr_32bytes_dwordOff(ptr %src.ptr, ptr %dwordOff.ptr, ptr %dst) nounwind {371; ALL-LABEL: ashr_32bytes_dwordOff:372; ALL: // %bb.0:373; ALL-NEXT: sub sp, sp, #64374; ALL-NEXT: ldp x9, x8, [x0, #16]375; ALL-NEXT: ldr x10, [x1]376; ALL-NEXT: ldr q0, [x0]377; ALL-NEXT: stp x9, x8, [sp, #16]378; ALL-NEXT: asr x8, x8, #63379; ALL-NEXT: ubfiz x9, x10, #3, #2380; ALL-NEXT: mov x10, sp381; ALL-NEXT: str q0, [sp]382; ALL-NEXT: stp x8, x8, [sp, #48]383; ALL-NEXT: stp x8, x8, [sp, #32]384; ALL-NEXT: add x8, x10, x9385; ALL-NEXT: ldp x10, x9, [x8, #16]386; ALL-NEXT: ldr q0, [x8]387; ALL-NEXT: str q0, [x2]388; ALL-NEXT: stp x10, x9, [x2, #16]389; ALL-NEXT: add sp, sp, #64390; ALL-NEXT: ret391 %src = load i256, ptr %src.ptr, align 1392 %dwordOff = load i256, ptr %dwordOff.ptr, align 1393 %bitOff = shl i256 %dwordOff, 6394 %res = ashr i256 %src, %bitOff395 store i256 %res, ptr %dst, align 1396 ret void397}398