301 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=thumbv7m -mattr=+dsp %s -o - | FileCheck %s --check-prefix=DSP3; RUN: llc -mtriple=armv7a %s -o - | FileCheck %s --check-prefix=ARM74; RUN: llc -mtriple=thumbv7m -mattr=-dsp %s -o - | FileCheck %s --check-prefix=NODSP5 6define hidden i32 @SMMULR_SMMLAR(i32 %a, i32 %b0, i32 %b1, i32 %Xn, i32 %Xn1) local_unnamed_addr {7; DSP-LABEL: SMMULR_SMMLAR:8; DSP: @ %bb.0: @ %entry9; DSP-NEXT: ldr r0, [sp]10; DSP-NEXT: smmulr r0, r0, r211; DSP-NEXT: smmlar r0, r3, r1, r012; DSP-NEXT: bx lr13;14; ARM7-LABEL: SMMULR_SMMLAR:15; ARM7: @ %bb.0: @ %entry16; ARM7-NEXT: ldr r0, [sp]17; ARM7-NEXT: smmulr r0, r0, r218; ARM7-NEXT: smmlar r0, r3, r1, r019; ARM7-NEXT: bx lr20;21; NODSP-LABEL: SMMULR_SMMLAR:22; NODSP: @ %bb.0: @ %entry23; NODSP-NEXT: push {r4, lr}24; NODSP-NEXT: ldr.w lr, [sp, #8]25; NODSP-NEXT: movs r0, #026; NODSP-NEXT: mov.w r4, #-214748364827; NODSP-NEXT: mov.w r12, #-214748364828; NODSP-NEXT: smlal r4, r0, lr, r229; NODSP-NEXT: smlal r12, r0, r3, r130; NODSP-NEXT: pop {r4, pc}31entry:32 %conv = sext i32 %b1 to i6433 %conv1 = sext i32 %Xn1 to i6434 %mul = mul nsw i64 %conv1, %conv35 %add = add nsw i64 %mul, 214748364836 %0 = and i64 %add, -429496729637 %conv4 = sext i32 %b0 to i6438 %conv5 = sext i32 %Xn to i6439 %mul6 = mul nsw i64 %conv5, %conv440 %add7 = add i64 %mul6, 214748364841 %add8 = add i64 %add7, %042 %1 = lshr i64 %add8, 3243 %conv10 = trunc i64 %1 to i3244 ret i32 %conv1045}46 47define hidden i32 @SMMULR(i32 %a, i32 %b) local_unnamed_addr {48; DSP-LABEL: SMMULR:49; DSP: @ %bb.0: @ %entry50; DSP-NEXT: smmulr r0, r1, r051; DSP-NEXT: bx lr52;53; ARM7-LABEL: SMMULR:54; ARM7: @ %bb.0: @ %entry55; ARM7-NEXT: smmulr r0, r1, r056; ARM7-NEXT: bx lr57;58; NODSP-LABEL: SMMULR:59; NODSP: @ %bb.0: @ %entry60; NODSP-NEXT: movs r2, #061; NODSP-NEXT: mov.w r3, #-214748364862; NODSP-NEXT: smlal r3, r2, r1, r063; NODSP-NEXT: mov r0, r264; NODSP-NEXT: bx lr65entry:66 %conv = sext i32 %a to i6467 %conv1 = sext i32 %b to i6468 %mul = mul nsw i64 %conv1, %conv69 %add = add nsw i64 %mul, 214748364870 %0 = lshr i64 %add, 3271 %conv2 = trunc i64 %0 to i3272 ret i32 %conv273}74 75define hidden i32 @SMMUL(i32 %a, i32 %b) local_unnamed_addr {76; DSP-LABEL: SMMUL:77; DSP: @ %bb.0: @ %entry78; DSP-NEXT: smmul r0, r1, r079; DSP-NEXT: bx lr80;81; ARM7-LABEL: SMMUL:82; ARM7: @ %bb.0: @ %entry83; ARM7-NEXT: smmul r0, r1, r084; ARM7-NEXT: bx lr85;86; NODSP-LABEL: SMMUL:87; NODSP: @ %bb.0: @ %entry88; NODSP-NEXT: smull r1, r0, r1, r089; NODSP-NEXT: bx lr90entry:91 %conv = sext i32 %a to i6492 %conv1 = sext i32 %b to i6493 %mul = mul nsw i64 %conv1, %conv94 %0 = lshr i64 %mul, 3295 %conv2 = trunc i64 %0 to i3296 ret i32 %conv297}98 99define hidden i32 @SMMLSR(i32 %a, i32 %b, i32 %c) local_unnamed_addr {100; DSP-LABEL: SMMLSR:101; DSP: @ %bb.0: @ %entry102; DSP-NEXT: smmlsr r0, r2, r1, r0103; DSP-NEXT: bx lr104;105; ARM7-LABEL: SMMLSR:106; ARM7: @ %bb.0: @ %entry107; ARM7-NEXT: smmlsr r0, r2, r1, r0108; ARM7-NEXT: bx lr109;110; NODSP-LABEL: SMMLSR:111; NODSP: @ %bb.0: @ %entry112; NODSP-NEXT: smull r1, r2, r2, r1113; NODSP-NEXT: rsbs.w r1, r1, #-2147483648114; NODSP-NEXT: sbcs r0, r2115; NODSP-NEXT: bx lr116entry:117 %conv6 = zext i32 %a to i64118 %shl = shl nuw i64 %conv6, 32119 %conv1 = sext i32 %b to i64120 %conv2 = sext i32 %c to i64121 %mul = mul nsw i64 %conv2, %conv1122 %sub = or i64 %shl, 2147483648123 %add = sub i64 %sub, %mul124 %0 = lshr i64 %add, 32125 %conv3 = trunc i64 %0 to i32126 ret i32 %conv3127}128 129define hidden i32 @NOT_SMMLSR(i32 %a, i32 %b, i32 %c) local_unnamed_addr {130; DSP-LABEL: NOT_SMMLSR:131; DSP: @ %bb.0: @ %entry132; DSP-NEXT: smmulr r1, r2, r1133; DSP-NEXT: subs r0, r0, r1134; DSP-NEXT: bx lr135;136; ARM7-LABEL: NOT_SMMLSR:137; ARM7: @ %bb.0: @ %entry138; ARM7-NEXT: smmulr r1, r2, r1139; ARM7-NEXT: sub r0, r0, r1140; ARM7-NEXT: bx lr141;142; NODSP-LABEL: NOT_SMMLSR:143; NODSP: @ %bb.0: @ %entry144; NODSP-NEXT: mov.w r12, #0145; NODSP-NEXT: mov.w r3, #-2147483648146; NODSP-NEXT: smlal r3, r12, r2, r1147; NODSP-NEXT: sub.w r0, r0, r12148; NODSP-NEXT: bx lr149entry:150 %conv = sext i32 %b to i64151 %conv1 = sext i32 %c to i64152 %mul = mul nsw i64 %conv1, %conv153 %add = add nsw i64 %mul, 2147483648154 %0 = lshr i64 %add, 32155 %conv2 = trunc i64 %0 to i32156 %sub = sub nsw i32 %a, %conv2157 ret i32 %sub158}159 160define hidden i32 @SMMLS(i32 %a, i32 %b, i32 %c) local_unnamed_addr {161; DSP-LABEL: SMMLS:162; DSP: @ %bb.0: @ %entry163; DSP-NEXT: smmls r0, r2, r1, r0164; DSP-NEXT: bx lr165;166; ARM7-LABEL: SMMLS:167; ARM7: @ %bb.0: @ %entry168; ARM7-NEXT: smmls r0, r2, r1, r0169; ARM7-NEXT: bx lr170;171; NODSP-LABEL: SMMLS:172; NODSP: @ %bb.0: @ %entry173; NODSP-NEXT: smull r1, r2, r2, r1174; NODSP-NEXT: rsbs r1, r1, #0175; NODSP-NEXT: sbcs r0, r2176; NODSP-NEXT: bx lr177entry:178 %conv5 = zext i32 %a to i64179 %shl = shl nuw i64 %conv5, 32180 %conv1 = sext i32 %b to i64181 %conv2 = sext i32 %c to i64182 %mul = mul nsw i64 %conv2, %conv1183 %sub = sub nsw i64 %shl, %mul184 %0 = lshr i64 %sub, 32185 %conv3 = trunc i64 %0 to i32186 ret i32 %conv3187}188 189define hidden i32 @NOT_SMMLS(i32 %a, i32 %b, i32 %c) local_unnamed_addr {190; DSP-LABEL: NOT_SMMLS:191; DSP: @ %bb.0: @ %entry192; DSP-NEXT: smmul r1, r2, r1193; DSP-NEXT: subs r0, r0, r1194; DSP-NEXT: bx lr195;196; ARM7-LABEL: NOT_SMMLS:197; ARM7: @ %bb.0: @ %entry198; ARM7-NEXT: smmul r1, r2, r1199; ARM7-NEXT: sub r0, r0, r1200; ARM7-NEXT: bx lr201;202; NODSP-LABEL: NOT_SMMLS:203; NODSP: @ %bb.0: @ %entry204; NODSP-NEXT: smull r1, r2, r2, r1205; NODSP-NEXT: subs r0, r0, r2206; NODSP-NEXT: bx lr207entry:208 %conv = sext i32 %b to i64209 %conv1 = sext i32 %c to i64210 %mul = mul nsw i64 %conv1, %conv211 %0 = lshr i64 %mul, 32212 %conv2 = trunc i64 %0 to i32213 %sub = sub nsw i32 %a, %conv2214 ret i32 %sub215}216 217define hidden i32 @SMMLA(i32 %a, i32 %b, i32 %c) local_unnamed_addr {218; DSP-LABEL: SMMLA:219; DSP: @ %bb.0: @ %entry220; DSP-NEXT: smmla r0, r1, r2, r0221; DSP-NEXT: bx lr222;223; ARM7-LABEL: SMMLA:224; ARM7: @ %bb.0: @ %entry225; ARM7-NEXT: smmla r0, r2, r1, r0226; ARM7-NEXT: bx lr227;228; NODSP-LABEL: SMMLA:229; NODSP: @ %bb.0: @ %entry230; NODSP-NEXT: smull r1, r2, r2, r1231; NODSP-NEXT: add r0, r2232; NODSP-NEXT: bx lr233entry:234 %conv = sext i32 %b to i64235 %conv1 = sext i32 %c to i64236 %mul = mul nsw i64 %conv1, %conv237 %0 = lshr i64 %mul, 32238 %conv2 = trunc i64 %0 to i32239 %add = add nsw i32 %conv2, %a240 ret i32 %add241}242 243define hidden i32 @SMMLAR(i32 %a, i32 %b, i32 %c) local_unnamed_addr {244; DSP-LABEL: SMMLAR:245; DSP: @ %bb.0: @ %entry246; DSP-NEXT: smmlar r0, r2, r1, r0247; DSP-NEXT: bx lr248;249; ARM7-LABEL: SMMLAR:250; ARM7: @ %bb.0: @ %entry251; ARM7-NEXT: smmlar r0, r2, r1, r0252; ARM7-NEXT: bx lr253;254; NODSP-LABEL: SMMLAR:255; NODSP: @ %bb.0: @ %entry256; NODSP-NEXT: mov.w r3, #-2147483648257; NODSP-NEXT: smlal r3, r0, r2, r1258; NODSP-NEXT: bx lr259entry:260 %conv7 = zext i32 %a to i64261 %shl = shl nuw i64 %conv7, 32262 %conv1 = sext i32 %b to i64263 %conv2 = sext i32 %c to i64264 %mul = mul nsw i64 %conv2, %conv1265 %add = or i64 %shl, 2147483648266 %add3 = add i64 %add, %mul267 %0 = lshr i64 %add3, 32268 %conv4 = trunc i64 %0 to i32269 ret i32 %conv4270}271 272define hidden i32 @NOT_SMMLA(i32 %a, i32 %b, i32 %c) local_unnamed_addr {273; DSP-LABEL: NOT_SMMLA:274; DSP: @ %bb.0: @ %entry275; DSP-NEXT: smmla r0, r1, r2, r0276; DSP-NEXT: add.w r0, r0, #-2147483648277; DSP-NEXT: bx lr278;279; ARM7-LABEL: NOT_SMMLA:280; ARM7: @ %bb.0: @ %entry281; ARM7-NEXT: smmla r0, r2, r1, r0282; ARM7-NEXT: add r0, r0, #-2147483648283; ARM7-NEXT: bx lr284;285; NODSP-LABEL: NOT_SMMLA:286; NODSP: @ %bb.0: @ %entry287; NODSP-NEXT: smull r1, r2, r2, r1288; NODSP-NEXT: add r0, r2289; NODSP-NEXT: add.w r0, r0, #-2147483648290; NODSP-NEXT: bx lr291entry:292 %conv = sext i32 %b to i64293 %conv1 = sext i32 %c to i64294 %mul = mul nsw i64 %conv1, %conv295 %0 = lshr i64 %mul, 32296 %conv2 = trunc i64 %0 to i32297 %add = xor i32 %conv2, -2147483648298 %add3 = add i32 %add, %a299 ret i32 %add3300}301