270 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=sparc-unknown-linux-gnu | FileCheck %s --check-prefixes=SPARC3; RUN: llc < %s -mtriple=sparc64-unknown-linux-gnu | FileCheck %s --check-prefixes=SPARC644; RUN: llc < %s -mtriple=sparc64-unknown-linux-gnu -mattr=vis3 | FileCheck %s --check-prefixes=SPARC64-VIS35 6define { i128, i8 } @muloti_test(i128 %l, i128 %r) nounwind {7; SPARC-LABEL: muloti_test:8; SPARC: ! %bb.0: ! %start9; SPARC-NEXT: save %sp, -96, %sp10; SPARC-NEXT: ld [%fp+96], %l211; SPARC-NEXT: mov %i3, %g212; SPARC-NEXT: mov %i2, %g313; SPARC-NEXT: umul %i1, %l2, %l014; SPARC-NEXT: rd %y, %i215; SPARC-NEXT: ld [%fp+92], %l116; SPARC-NEXT: umul %i0, %l2, %i317; SPARC-NEXT: rd %y, %g418; SPARC-NEXT: addcc %i3, %i2, %i219; SPARC-NEXT: addxcc %g4, 0, %i320; SPARC-NEXT: umul %i1, %l1, %g421; SPARC-NEXT: rd %y, %l322; SPARC-NEXT: addcc %g4, %i2, %l423; SPARC-NEXT: addxcc %l3, 0, %i224; SPARC-NEXT: addcc %i3, %i2, %i225; SPARC-NEXT: addxcc %g0, 0, %i326; SPARC-NEXT: umul %i0, %l1, %g427; SPARC-NEXT: rd %y, %l328; SPARC-NEXT: addcc %g4, %i2, %i229; SPARC-NEXT: sra %i0, 31, %g430; SPARC-NEXT: smul %l1, %g4, %l531; SPARC-NEXT: umul %l2, %g4, %l632; SPARC-NEXT: rd %y, %l733; SPARC-NEXT: addxcc %l3, %i3, %l334; SPARC-NEXT: add %l7, %l6, %i335; SPARC-NEXT: add %i3, %l5, %l536; SPARC-NEXT: addcc %i2, %l6, %l637; SPARC-NEXT: umul %g2, %l2, %i338; SPARC-NEXT: rd %y, %i239; SPARC-NEXT: addxcc %l3, %l5, %l340; SPARC-NEXT: umul %g3, %l2, %l241; SPARC-NEXT: rd %y, %l542; SPARC-NEXT: addcc %l2, %i2, %i243; SPARC-NEXT: addxcc %l5, 0, %l244; SPARC-NEXT: umul %g2, %l1, %l545; SPARC-NEXT: rd %y, %l746; SPARC-NEXT: addcc %l5, %i2, %i247; SPARC-NEXT: addxcc %l7, 0, %l548; SPARC-NEXT: addcc %l2, %l5, %l249; SPARC-NEXT: addxcc %g0, 0, %l550; SPARC-NEXT: umul %g3, %l1, %l151; SPARC-NEXT: rd %y, %l752; SPARC-NEXT: addcc %l1, %l2, %l153; SPARC-NEXT: addxcc %l7, %l5, %l254; SPARC-NEXT: addcc %l0, %l1, %l055; SPARC-NEXT: addxcc %l4, %l2, %l156; SPARC-NEXT: addxcc %l6, 0, %l257; SPARC-NEXT: addxcc %l3, 0, %l358; SPARC-NEXT: umul %g2, %i5, %l459; SPARC-NEXT: rd %y, %l560; SPARC-NEXT: sra %l3, 31, %l661; SPARC-NEXT: umul %g3, %i5, %l762; SPARC-NEXT: rd %y, %o063; SPARC-NEXT: addcc %l7, %l5, %l564; SPARC-NEXT: addxcc %o0, 0, %l765; SPARC-NEXT: umul %g2, %i4, %o066; SPARC-NEXT: rd %y, %o167; SPARC-NEXT: addcc %o0, %l5, %l568; SPARC-NEXT: addxcc %o1, 0, %o069; SPARC-NEXT: addcc %l7, %o0, %l770; SPARC-NEXT: addxcc %g0, 0, %o071; SPARC-NEXT: umul %g3, %i4, %o172; SPARC-NEXT: rd %y, %o273; SPARC-NEXT: addcc %o1, %l7, %l774; SPARC-NEXT: sra %i4, 31, %o175; SPARC-NEXT: smul %o1, %g3, %g376; SPARC-NEXT: umul %o1, %g2, %g277; SPARC-NEXT: rd %y, %o378; SPARC-NEXT: addxcc %o2, %o0, %o079; SPARC-NEXT: add %o3, %g3, %g380; SPARC-NEXT: add %g3, %g2, %g381; SPARC-NEXT: addcc %l7, %g2, %l782; SPARC-NEXT: addxcc %o0, %g3, %o083; SPARC-NEXT: addcc %l4, %l0, %g284; SPARC-NEXT: addxcc %l5, %l1, %g385; SPARC-NEXT: addxcc %l7, 0, %l086; SPARC-NEXT: addxcc %o0, 0, %l187; SPARC-NEXT: sra %l1, 31, %l488; SPARC-NEXT: addcc %l2, %l0, %l089; SPARC-NEXT: addxcc %l3, %l1, %l190; SPARC-NEXT: addxcc %l6, %l4, %l291; SPARC-NEXT: smul %i4, %g4, %l392; SPARC-NEXT: umul %i5, %g4, %g493; SPARC-NEXT: rd %y, %l594; SPARC-NEXT: addxcc %l6, %l4, %l495; SPARC-NEXT: add %l5, %g4, %l596; SPARC-NEXT: smul %o1, %i0, %l697; SPARC-NEXT: umul %o1, %i1, %l798; SPARC-NEXT: rd %y, %o099; SPARC-NEXT: add %l5, %l3, %l3100; SPARC-NEXT: add %o0, %l6, %l5101; SPARC-NEXT: add %l5, %l7, %l5102; SPARC-NEXT: addcc %l7, %g4, %g4103; SPARC-NEXT: umul %i1, %i5, %l6104; SPARC-NEXT: rd %y, %l7105; SPARC-NEXT: addxcc %l5, %l3, %l3106; SPARC-NEXT: umul %i0, %i5, %i5107; SPARC-NEXT: rd %y, %l5108; SPARC-NEXT: addcc %i5, %l7, %i5109; SPARC-NEXT: addxcc %l5, 0, %l5110; SPARC-NEXT: umul %i1, %i4, %i1111; SPARC-NEXT: rd %y, %l7112; SPARC-NEXT: addcc %i1, %i5, %i1113; SPARC-NEXT: addxcc %l7, 0, %i5114; SPARC-NEXT: addcc %l5, %i5, %i5115; SPARC-NEXT: addxcc %g0, 0, %l5116; SPARC-NEXT: umul %i0, %i4, %i0117; SPARC-NEXT: rd %y, %i4118; SPARC-NEXT: addcc %i0, %i5, %i0119; SPARC-NEXT: addxcc %i4, %l5, %i4120; SPARC-NEXT: addcc %i0, %g4, %i0121; SPARC-NEXT: addxcc %i4, %l3, %i4122; SPARC-NEXT: addcc %l6, %l0, %i5123; SPARC-NEXT: addxcc %i1, %l1, %i1124; SPARC-NEXT: addxcc %i0, %l2, %i0125; SPARC-NEXT: addxcc %i4, %l4, %i4126; SPARC-NEXT: sra %g3, 31, %g4127; SPARC-NEXT: xor %i4, %g4, %i4128; SPARC-NEXT: xor %i1, %g4, %i1129; SPARC-NEXT: or %i1, %i4, %i1130; SPARC-NEXT: xor %i0, %g4, %i0131; SPARC-NEXT: xor %i5, %g4, %i4132; SPARC-NEXT: or %i4, %i0, %i0133; SPARC-NEXT: orcc %i0, %i1, %g0134; SPARC-NEXT: bne .LBB0_2135; SPARC-NEXT: nop136; SPARC-NEXT: ! %bb.1: ! %start137; SPARC-NEXT: ba .LBB0_3138; SPARC-NEXT: mov %g0, %i4139; SPARC-NEXT: .LBB0_2:140; SPARC-NEXT: mov 1, %i4141; SPARC-NEXT: .LBB0_3: ! %start142; SPARC-NEXT: mov %g3, %i0143; SPARC-NEXT: ret144; SPARC-NEXT: restore %g0, %g2, %o1145;146; SPARC64-LABEL: muloti_test:147; SPARC64: .register %g2, #scratch148; SPARC64-NEXT: .register %g3, #scratch149; SPARC64-NEXT: ! %bb.0: ! %start150; SPARC64-NEXT: save %sp, -176, %sp151; SPARC64-NEXT: mov %i3, %i4152; SPARC64-NEXT: mov %i1, %i5153; SPARC64-NEXT: mov %i0, %l2154; SPARC64-NEXT: srax %i0, 63, %i3155; SPARC64-NEXT: mov %i3, %o0156; SPARC64-NEXT: mov %i0, %o1157; SPARC64-NEXT: mov %g0, %o2158; SPARC64-NEXT: call __multi3159; SPARC64-NEXT: mov %i4, %o3160; SPARC64-NEXT: mov %o0, %l0161; SPARC64-NEXT: mov %o1, %l1162; SPARC64-NEXT: mov %g0, %o0163; SPARC64-NEXT: mov %i1, %o1164; SPARC64-NEXT: mov %g0, %o2165; SPARC64-NEXT: call __multi3166; SPARC64-NEXT: mov %i4, %o3167; SPARC64-NEXT: mov %o1, %i1168; SPARC64-NEXT: mov %g0, %i0169; SPARC64-NEXT: add %l1, %o0, %l3170; SPARC64-NEXT: cmp %l3, %l1171; SPARC64-NEXT: movcs %xcc, 1, %i0172; SPARC64-NEXT: srl %i0, 0, %i0173; SPARC64-NEXT: add %l0, %i0, %l0174; SPARC64-NEXT: srax %l0, 63, %l1175; SPARC64-NEXT: srax %i2, 63, %i4176; SPARC64-NEXT: mov %g0, %o0177; SPARC64-NEXT: mov %i5, %o1178; SPARC64-NEXT: mov %i4, %o2179; SPARC64-NEXT: call __multi3180; SPARC64-NEXT: mov %i2, %o3181; SPARC64-NEXT: mov %g0, %i5182; SPARC64-NEXT: mov %g0, %g2183; SPARC64-NEXT: add %o1, %l3, %i0184; SPARC64-NEXT: cmp %i0, %o1185; SPARC64-NEXT: movcs %xcc, 1, %i5186; SPARC64-NEXT: srl %i5, 0, %i5187; SPARC64-NEXT: add %o0, %i5, %i5188; SPARC64-NEXT: srax %i5, 63, %g3189; SPARC64-NEXT: add %l1, %g3, %g3190; SPARC64-NEXT: add %l0, %i5, %i5191; SPARC64-NEXT: cmp %i5, %l0192; SPARC64-NEXT: movcs %xcc, 1, %g2193; SPARC64-NEXT: srl %g2, 0, %g2194; SPARC64-NEXT: add %g3, %g2, %l0195; SPARC64-NEXT: mov %i3, %o0196; SPARC64-NEXT: mov %l2, %o1197; SPARC64-NEXT: mov %i4, %o2198; SPARC64-NEXT: call __multi3199; SPARC64-NEXT: mov %i2, %o3200; SPARC64-NEXT: mov %g0, %i2201; SPARC64-NEXT: mov %g0, %i3202; SPARC64-NEXT: add %o0, %l0, %i4203; SPARC64-NEXT: add %o1, %i5, %i5204; SPARC64-NEXT: cmp %i5, %o1205; SPARC64-NEXT: movcs %xcc, 1, %i2206; SPARC64-NEXT: srl %i2, 0, %i2207; SPARC64-NEXT: add %i4, %i2, %i2208; SPARC64-NEXT: srax %i0, 63, %i4209; SPARC64-NEXT: xor %i2, %i4, %i2210; SPARC64-NEXT: xor %i5, %i4, %i4211; SPARC64-NEXT: or %i4, %i2, %i2212; SPARC64-NEXT: movrnz %i2, 1, %i3213; SPARC64-NEXT: srl %i3, 0, %i2214; SPARC64-NEXT: ret215; SPARC64-NEXT: restore216;217; SPARC64-VIS3-LABEL: muloti_test:218; SPARC64-VIS3: .register %g2, #scratch219; SPARC64-VIS3-NEXT: .register %g3, #scratch220; SPARC64-VIS3-NEXT: ! %bb.0: ! %start221; SPARC64-VIS3-NEXT: save %sp, -128, %sp222; SPARC64-VIS3-NEXT: mov %g0, %i5223; SPARC64-VIS3-NEXT: umulxhi %i0, %i3, %i4224; SPARC64-VIS3-NEXT: srax %i0, 63, %g2225; SPARC64-VIS3-NEXT: mulx %g2, %i3, %g3226; SPARC64-VIS3-NEXT: add %i4, %g3, %i4227; SPARC64-VIS3-NEXT: umulxhi %i1, %i3, %g3228; SPARC64-VIS3-NEXT: mulx %i0, %i3, %g4229; SPARC64-VIS3-NEXT: addcc %g4, %g3, %g3230; SPARC64-VIS3-NEXT: addxccc %i4, %g0, %g4231; SPARC64-VIS3-NEXT: umulxhi %i1, %i2, %i4232; SPARC64-VIS3-NEXT: srax %i2, 63, %g5233; SPARC64-VIS3-NEXT: mulx %i1, %g5, %l0234; SPARC64-VIS3-NEXT: add %i4, %l0, %l0235; SPARC64-VIS3-NEXT: mulx %i1, %i2, %i4236; SPARC64-VIS3-NEXT: addcc %i4, %g3, %i4237; SPARC64-VIS3-NEXT: addxccc %l0, %g0, %g3238; SPARC64-VIS3-NEXT: srax %g3, 63, %l0239; SPARC64-VIS3-NEXT: addcc %g4, %g3, %g3240; SPARC64-VIS3-NEXT: srax %g4, 63, %g4241; SPARC64-VIS3-NEXT: addxccc %g4, %l0, %g4242; SPARC64-VIS3-NEXT: and %g5, %i0, %g5243; SPARC64-VIS3-NEXT: and %g2, %i2, %g2244; SPARC64-VIS3-NEXT: add %g2, %g5, %g2245; SPARC64-VIS3-NEXT: umulxhi %i0, %i2, %g5246; SPARC64-VIS3-NEXT: sub %g5, %g2, %g2247; SPARC64-VIS3-NEXT: mulx %i0, %i2, %i0248; SPARC64-VIS3-NEXT: addcc %i0, %g3, %i0249; SPARC64-VIS3-NEXT: addxccc %g2, %g4, %i2250; SPARC64-VIS3-NEXT: srax %i4, 63, %g2251; SPARC64-VIS3-NEXT: xor %i2, %g2, %i2252; SPARC64-VIS3-NEXT: xor %i0, %g2, %i0253; SPARC64-VIS3-NEXT: or %i0, %i2, %i0254; SPARC64-VIS3-NEXT: movrnz %i0, 1, %i5255; SPARC64-VIS3-NEXT: mulx %i1, %i3, %i1256; SPARC64-VIS3-NEXT: srl %i5, 0, %i2257; SPARC64-VIS3-NEXT: ret258; SPARC64-VIS3-NEXT: restore %g0, %i4, %o0259start:260 %0 = tail call { i128, i1 } @llvm.smul.with.overflow.i128(i128 %l, i128 %r)261 %1 = extractvalue { i128, i1 } %0, 0262 %2 = extractvalue { i128, i1 } %0, 1263 %3 = zext i1 %2 to i8264 %4 = insertvalue { i128, i8 } undef, i128 %1, 0265 %5 = insertvalue { i128, i8 } %4, i8 %3, 1266 ret { i128, i8 } %5267}268 269declare { i128, i1 } @llvm.smul.with.overflow.i128(i128, i128)270