263 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=aarch64-unknown-unknown | FileCheck %s3; RUN: llc < %s -mtriple=aarch64-windows | FileCheck %s -check-prefix=CHECK-WIN4; RUN: llc < %s -mtriple=aarch64-apple-darwin | FileCheck %s -check-prefix=CHECK-DARWIN5 6; The Windows runtime doesn't have these.7; CHECK-WIN-NOT: __ashlti38; CHECK-WIN-NOT: __ashrti39 10; Darwin compiler-rt excludes these.11; CHECK-DARWIN-NOT: __ashlti312; CHECK-DARWIN-NOT: __ashrti313 14define i64 @f0(i64 %val, i64 %amt) minsize optsize {15; CHECK-LABEL: f0:16; CHECK: // %bb.0:17; CHECK-NEXT: lsl x0, x0, x118; CHECK-NEXT: ret19;20; CHECK-WIN-LABEL: f0:21; CHECK-WIN: // %bb.0:22; CHECK-WIN-NEXT: lsl x0, x0, x123; CHECK-WIN-NEXT: ret24;25; CHECK-DARWIN-LABEL: f0:26; CHECK-DARWIN: ; %bb.0:27; CHECK-DARWIN-NEXT: lsl x0, x0, x128; CHECK-DARWIN-NEXT: ret29 %res = shl i64 %val, %amt30 ret i64 %res31}32 33define i32 @f1(i64 %x, i64 %y) minsize optsize {34; CHECK-LABEL: f1:35; CHECK: // %bb.0:36; CHECK-NEXT: lsl x0, x0, x137; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x038; CHECK-NEXT: ret39;40; CHECK-WIN-LABEL: f1:41; CHECK-WIN: // %bb.0:42; CHECK-WIN-NEXT: lsl x0, x0, x143; CHECK-WIN-NEXT: // kill: def $w0 killed $w0 killed $x044; CHECK-WIN-NEXT: ret45;46; CHECK-DARWIN-LABEL: f1:47; CHECK-DARWIN: ; %bb.0:48; CHECK-DARWIN-NEXT: lsl x0, x0, x149; CHECK-DARWIN-NEXT: ; kill: def $w0 killed $w0 killed $x050; CHECK-DARWIN-NEXT: ret51 %a = shl i64 %x, %y52 %b = trunc i64 %a to i3253 ret i32 %b54}55 56define i32 @f2(i64 %x, i64 %y) minsize optsize {57; CHECK-LABEL: f2:58; CHECK: // %bb.0:59; CHECK-NEXT: asr x0, x0, x160; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x061; CHECK-NEXT: ret62;63; CHECK-WIN-LABEL: f2:64; CHECK-WIN: // %bb.0:65; CHECK-WIN-NEXT: asr x0, x0, x166; CHECK-WIN-NEXT: // kill: def $w0 killed $w0 killed $x067; CHECK-WIN-NEXT: ret68;69; CHECK-DARWIN-LABEL: f2:70; CHECK-DARWIN: ; %bb.0:71; CHECK-DARWIN-NEXT: asr x0, x0, x172; CHECK-DARWIN-NEXT: ; kill: def $w0 killed $w0 killed $x073; CHECK-DARWIN-NEXT: ret74 %a = ashr i64 %x, %y75 %b = trunc i64 %a to i3276 ret i32 %b77}78 79define i32 @f3(i64 %x, i64 %y) minsize optsize {80; CHECK-LABEL: f3:81; CHECK: // %bb.0:82; CHECK-NEXT: lsr x0, x0, x183; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x084; CHECK-NEXT: ret85;86; CHECK-WIN-LABEL: f3:87; CHECK-WIN: // %bb.0:88; CHECK-WIN-NEXT: lsr x0, x0, x189; CHECK-WIN-NEXT: // kill: def $w0 killed $w0 killed $x090; CHECK-WIN-NEXT: ret91;92; CHECK-DARWIN-LABEL: f3:93; CHECK-DARWIN: ; %bb.0:94; CHECK-DARWIN-NEXT: lsr x0, x0, x195; CHECK-DARWIN-NEXT: ; kill: def $w0 killed $w0 killed $x096; CHECK-DARWIN-NEXT: ret97 %a = lshr i64 %x, %y98 %b = trunc i64 %a to i3299 ret i32 %b100}101 102define dso_local { i64, i64 } @shl128(i64 %x.coerce0, i64 %x.coerce1, i8 signext %y) minsize optsize {103; CHECK-LABEL: shl128:104; CHECK: // %bb.0: // %entry105; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill106; CHECK-NEXT: .cfi_def_cfa_offset 16107; CHECK-NEXT: .cfi_offset w30, -16108; CHECK-NEXT: bl __ashlti3109; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload110; CHECK-NEXT: ret111;112; CHECK-WIN-LABEL: shl128:113; CHECK-WIN: // %bb.0: // %entry114; CHECK-WIN-NEXT: lsr x8, x0, #1115; CHECK-WIN-NEXT: mvn w9, w2116; CHECK-WIN-NEXT: mov w10, w2117; CHECK-WIN-NEXT: lsl x11, x0, x10118; CHECK-WIN-NEXT: tst x10, #0x40119; CHECK-WIN-NEXT: lsr x8, x8, x9120; CHECK-WIN-NEXT: lsl x9, x1, x10121; CHECK-WIN-NEXT: csel x0, xzr, x11, ne122; CHECK-WIN-NEXT: orr x8, x9, x8123; CHECK-WIN-NEXT: csel x1, x11, x8, ne124; CHECK-WIN-NEXT: ret125;126; CHECK-DARWIN-LABEL: shl128:127; CHECK-DARWIN: ; %bb.0: ; %entry128; CHECK-DARWIN-NEXT: lsr x8, x0, #1129; CHECK-DARWIN-NEXT: mvn w9, w2130; CHECK-DARWIN-NEXT: mov w10, w2131; CHECK-DARWIN-NEXT: lsl x11, x0, x10132; CHECK-DARWIN-NEXT: tst x10, #0x40133; CHECK-DARWIN-NEXT: lsr x8, x8, x9134; CHECK-DARWIN-NEXT: lsl x9, x1, x10135; CHECK-DARWIN-NEXT: csel x0, xzr, x11, ne136; CHECK-DARWIN-NEXT: orr x8, x9, x8137; CHECK-DARWIN-NEXT: csel x1, x11, x8, ne138; CHECK-DARWIN-NEXT: ret139 140entry:141 %x.sroa.2.0.insert.ext = zext i64 %x.coerce1 to i128142 %x.sroa.2.0.insert.shift = shl nuw i128 %x.sroa.2.0.insert.ext, 64143 %x.sroa.0.0.insert.ext = zext i64 %x.coerce0 to i128144 %x.sroa.0.0.insert.insert = or i128 %x.sroa.2.0.insert.shift, %x.sroa.0.0.insert.ext145 %conv = sext i8 %y to i32146 %sh_prom = zext i32 %conv to i128147 %shl = shl i128 %x.sroa.0.0.insert.insert, %sh_prom148 %retval.sroa.0.0.extract.trunc = trunc i128 %shl to i64149 %retval.sroa.2.0.extract.shift = lshr i128 %shl, 64150 %retval.sroa.2.0.extract.trunc = trunc i128 %retval.sroa.2.0.extract.shift to i64151 %.fca.0.insert = insertvalue { i64, i64 } undef, i64 %retval.sroa.0.0.extract.trunc, 0152 %.fca.1.insert = insertvalue { i64, i64 } %.fca.0.insert, i64 %retval.sroa.2.0.extract.trunc, 1153 ret { i64, i64 } %.fca.1.insert154}155 156define dso_local { i64, i64 } @ashr128(i64 %x.coerce0, i64 %x.coerce1, i8 signext %y) minsize optsize {157; CHECK-LABEL: ashr128:158; CHECK: // %bb.0: // %entry159; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill160; CHECK-NEXT: .cfi_def_cfa_offset 16161; CHECK-NEXT: .cfi_offset w30, -16162; CHECK-NEXT: bl __ashrti3163; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload164; CHECK-NEXT: ret165;166; CHECK-WIN-LABEL: ashr128:167; CHECK-WIN: // %bb.0: // %entry168; CHECK-WIN-NEXT: lsl x8, x1, #1169; CHECK-WIN-NEXT: mov w9, w2170; CHECK-WIN-NEXT: mvn w10, w2171; CHECK-WIN-NEXT: lsr x11, x0, x9172; CHECK-WIN-NEXT: asr x12, x1, #63173; CHECK-WIN-NEXT: tst x9, #0x40174; CHECK-WIN-NEXT: lsl x8, x8, x10175; CHECK-WIN-NEXT: asr x10, x1, x9176; CHECK-WIN-NEXT: orr x8, x8, x11177; CHECK-WIN-NEXT: csel x1, x12, x10, ne178; CHECK-WIN-NEXT: csel x0, x10, x8, ne179; CHECK-WIN-NEXT: ret180;181; CHECK-DARWIN-LABEL: ashr128:182; CHECK-DARWIN: ; %bb.0: ; %entry183; CHECK-DARWIN-NEXT: lsl x8, x1, #1184; CHECK-DARWIN-NEXT: mov w9, w2185; CHECK-DARWIN-NEXT: mvn w10, w2186; CHECK-DARWIN-NEXT: lsr x11, x0, x9187; CHECK-DARWIN-NEXT: asr x12, x1, #63188; CHECK-DARWIN-NEXT: tst x9, #0x40189; CHECK-DARWIN-NEXT: lsl x8, x8, x10190; CHECK-DARWIN-NEXT: asr x10, x1, x9191; CHECK-DARWIN-NEXT: orr x8, x8, x11192; CHECK-DARWIN-NEXT: csel x1, x12, x10, ne193; CHECK-DARWIN-NEXT: csel x0, x10, x8, ne194; CHECK-DARWIN-NEXT: ret195entry:196 %x.sroa.2.0.insert.ext = zext i64 %x.coerce1 to i128197 %x.sroa.2.0.insert.shift = shl nuw i128 %x.sroa.2.0.insert.ext, 64198 %x.sroa.0.0.insert.ext = zext i64 %x.coerce0 to i128199 %x.sroa.0.0.insert.insert = or i128 %x.sroa.2.0.insert.shift, %x.sroa.0.0.insert.ext200 %conv = sext i8 %y to i32201 %sh_prom = zext i32 %conv to i128202 %shr = ashr i128 %x.sroa.0.0.insert.insert, %sh_prom203 %retval.sroa.0.0.extract.trunc = trunc i128 %shr to i64204 %retval.sroa.2.0.extract.shift = lshr i128 %shr, 64205 %retval.sroa.2.0.extract.trunc = trunc i128 %retval.sroa.2.0.extract.shift to i64206 %.fca.0.insert = insertvalue { i64, i64 } undef, i64 %retval.sroa.0.0.extract.trunc, 0207 %.fca.1.insert = insertvalue { i64, i64 } %.fca.0.insert, i64 %retval.sroa.2.0.extract.trunc, 1208 ret { i64, i64 } %.fca.1.insert209}210 211define dso_local { i64, i64 } @lshr128(i64 %x.coerce0, i64 %x.coerce1, i8 signext %y) minsize optsize {212; CHECK-LABEL: lshr128:213; CHECK: // %bb.0: // %entry214; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill215; CHECK-NEXT: .cfi_def_cfa_offset 16216; CHECK-NEXT: .cfi_offset w30, -16217; CHECK-NEXT: bl __lshrti3218; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload219; CHECK-NEXT: ret220;221; CHECK-WIN-LABEL: lshr128:222; CHECK-WIN: // %bb.0: // %entry223; CHECK-WIN-NEXT: lsl x8, x1, #1224; CHECK-WIN-NEXT: mov w9, w2225; CHECK-WIN-NEXT: mvn w10, w2226; CHECK-WIN-NEXT: lsr x11, x0, x9227; CHECK-WIN-NEXT: tst x9, #0x40228; CHECK-WIN-NEXT: lsl x8, x8, x10229; CHECK-WIN-NEXT: lsr x10, x1, x9230; CHECK-WIN-NEXT: orr x8, x8, x11231; CHECK-WIN-NEXT: csel x1, xzr, x10, ne232; CHECK-WIN-NEXT: csel x0, x10, x8, ne233; CHECK-WIN-NEXT: ret234;235; CHECK-DARWIN-LABEL: lshr128:236; CHECK-DARWIN: ; %bb.0: ; %entry237; CHECK-DARWIN-NEXT: lsl x8, x1, #1238; CHECK-DARWIN-NEXT: mov w9, w2239; CHECK-DARWIN-NEXT: mvn w10, w2240; CHECK-DARWIN-NEXT: lsr x11, x0, x9241; CHECK-DARWIN-NEXT: tst x9, #0x40242; CHECK-DARWIN-NEXT: lsl x8, x8, x10243; CHECK-DARWIN-NEXT: lsr x10, x1, x9244; CHECK-DARWIN-NEXT: orr x8, x8, x11245; CHECK-DARWIN-NEXT: csel x1, xzr, x10, ne246; CHECK-DARWIN-NEXT: csel x0, x10, x8, ne247; CHECK-DARWIN-NEXT: ret248entry:249 %x.sroa.2.0.insert.ext = zext i64 %x.coerce1 to i128250 %x.sroa.2.0.insert.shift = shl nuw i128 %x.sroa.2.0.insert.ext, 64251 %x.sroa.0.0.insert.ext = zext i64 %x.coerce0 to i128252 %x.sroa.0.0.insert.insert = or i128 %x.sroa.2.0.insert.shift, %x.sroa.0.0.insert.ext253 %conv = sext i8 %y to i32254 %sh_prom = zext i32 %conv to i128255 %shr = lshr i128 %x.sroa.0.0.insert.insert, %sh_prom256 %retval.sroa.0.0.extract.trunc = trunc i128 %shr to i64257 %retval.sroa.2.0.extract.shift = lshr i128 %shr, 64258 %retval.sroa.2.0.extract.trunc = trunc i128 %retval.sroa.2.0.extract.shift to i64259 %.fca.0.insert = insertvalue { i64, i64 } undef, i64 %retval.sroa.0.0.extract.trunc, 0260 %.fca.1.insert = insertvalue { i64, i64 } %.fca.0.insert, i64 %retval.sroa.2.0.extract.trunc, 1261 ret { i64, i64 } %.fca.1.insert262}263