217 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=thumb-eabi -mattr=+v6 | FileCheck %s --check-prefixes=THUMBV63 4define { i128, i8 } @muloti_test(i128 %l, i128 %r) unnamed_addr #0 {5; THUMBV6-LABEL: muloti_test:6; THUMBV6: @ %bb.0: @ %start7; THUMBV6-NEXT: .save {r4, r5, r6, r7, lr}8; THUMBV6-NEXT: push {r4, r5, r6, r7, lr}9; THUMBV6-NEXT: .pad #6010; THUMBV6-NEXT: sub sp, #6011; THUMBV6-NEXT: mov r6, r312; THUMBV6-NEXT: mov r1, r213; THUMBV6-NEXT: str r2, [sp, #52] @ 4-byte Spill14; THUMBV6-NEXT: mov r4, r015; THUMBV6-NEXT: str r0, [sp, #40] @ 4-byte Spill16; THUMBV6-NEXT: ldr r2, [sp, #88]17; THUMBV6-NEXT: str r2, [sp, #48] @ 4-byte Spill18; THUMBV6-NEXT: movs r5, #019; THUMBV6-NEXT: mov r0, r120; THUMBV6-NEXT: mov r1, r521; THUMBV6-NEXT: mov r3, r522; THUMBV6-NEXT: bl __aeabi_lmul23; THUMBV6-NEXT: str r1, [sp, #28] @ 4-byte Spill24; THUMBV6-NEXT: str r0, [r4]25; THUMBV6-NEXT: ldr r2, [sp, #96]26; THUMBV6-NEXT: str r2, [sp, #36] @ 4-byte Spill27; THUMBV6-NEXT: mov r4, r628; THUMBV6-NEXT: str r6, [sp, #56] @ 4-byte Spill29; THUMBV6-NEXT: mov r0, r630; THUMBV6-NEXT: mov r1, r531; THUMBV6-NEXT: mov r3, r532; THUMBV6-NEXT: bl __aeabi_lmul33; THUMBV6-NEXT: str r0, [sp, #44] @ 4-byte Spill34; THUMBV6-NEXT: mov r7, r135; THUMBV6-NEXT: subs r0, r1, #136; THUMBV6-NEXT: sbcs r7, r037; THUMBV6-NEXT: ldr r0, [sp, #100]38; THUMBV6-NEXT: str r0, [sp, #32] @ 4-byte Spill39; THUMBV6-NEXT: mov r1, r540; THUMBV6-NEXT: ldr r6, [sp, #52] @ 4-byte Reload41; THUMBV6-NEXT: mov r2, r642; THUMBV6-NEXT: mov r3, r543; THUMBV6-NEXT: bl __aeabi_lmul44; THUMBV6-NEXT: str r0, [sp, #24] @ 4-byte Spill45; THUMBV6-NEXT: subs r2, r1, #146; THUMBV6-NEXT: sbcs r1, r247; THUMBV6-NEXT: subs r2, r4, #148; THUMBV6-NEXT: mov r3, r449; THUMBV6-NEXT: sbcs r3, r250; THUMBV6-NEXT: ldr r4, [sp, #32] @ 4-byte Reload51; THUMBV6-NEXT: subs r2, r4, #152; THUMBV6-NEXT: sbcs r4, r253; THUMBV6-NEXT: ands r4, r354; THUMBV6-NEXT: orrs r4, r155; THUMBV6-NEXT: orrs r4, r756; THUMBV6-NEXT: ldr r0, [sp, #44] @ 4-byte Reload57; THUMBV6-NEXT: ldr r1, [sp, #24] @ 4-byte Reload58; THUMBV6-NEXT: adds r7, r1, r059; THUMBV6-NEXT: ldr r0, [sp, #36] @ 4-byte Reload60; THUMBV6-NEXT: mov r1, r561; THUMBV6-NEXT: mov r2, r662; THUMBV6-NEXT: mov r3, r563; THUMBV6-NEXT: bl __aeabi_lmul64; THUMBV6-NEXT: str r0, [sp, #24] @ 4-byte Spill65; THUMBV6-NEXT: adds r0, r1, r766; THUMBV6-NEXT: str r0, [sp, #20] @ 4-byte Spill67; THUMBV6-NEXT: mov r0, r568; THUMBV6-NEXT: adcs r0, r569; THUMBV6-NEXT: orrs r0, r470; THUMBV6-NEXT: str r0, [sp, #16] @ 4-byte Spill71; THUMBV6-NEXT: ldr r0, [sp, #92]72; THUMBV6-NEXT: str r0, [sp, #44] @ 4-byte Spill73; THUMBV6-NEXT: ldr r7, [sp, #80]74; THUMBV6-NEXT: mov r1, r575; THUMBV6-NEXT: mov r2, r776; THUMBV6-NEXT: mov r3, r577; THUMBV6-NEXT: bl __aeabi_lmul78; THUMBV6-NEXT: str r0, [sp, #12] @ 4-byte Spill79; THUMBV6-NEXT: mov r4, r180; THUMBV6-NEXT: subs r0, r1, #181; THUMBV6-NEXT: sbcs r4, r082; THUMBV6-NEXT: ldr r6, [sp, #84]83; THUMBV6-NEXT: mov r0, r684; THUMBV6-NEXT: mov r1, r585; THUMBV6-NEXT: ldr r2, [sp, #48] @ 4-byte Reload86; THUMBV6-NEXT: mov r3, r587; THUMBV6-NEXT: bl __aeabi_lmul88; THUMBV6-NEXT: str r0, [sp, #4] @ 4-byte Spill89; THUMBV6-NEXT: subs r2, r1, #190; THUMBV6-NEXT: sbcs r1, r291; THUMBV6-NEXT: ldr r3, [sp, #44] @ 4-byte Reload92; THUMBV6-NEXT: subs r2, r3, #193; THUMBV6-NEXT: sbcs r3, r294; THUMBV6-NEXT: str r6, [sp, #8] @ 4-byte Spill95; THUMBV6-NEXT: subs r2, r6, #196; THUMBV6-NEXT: sbcs r6, r297; THUMBV6-NEXT: ands r6, r398; THUMBV6-NEXT: orrs r6, r199; THUMBV6-NEXT: orrs r6, r4100; THUMBV6-NEXT: ldr r0, [sp, #12] @ 4-byte Reload101; THUMBV6-NEXT: ldr r1, [sp, #4] @ 4-byte Reload102; THUMBV6-NEXT: adds r0, r1, r0103; THUMBV6-NEXT: str r0, [sp, #4] @ 4-byte Spill104; THUMBV6-NEXT: mov r0, r7105; THUMBV6-NEXT: mov r1, r5106; THUMBV6-NEXT: ldr r4, [sp, #48] @ 4-byte Reload107; THUMBV6-NEXT: mov r2, r4108; THUMBV6-NEXT: mov r3, r5109; THUMBV6-NEXT: bl __aeabi_lmul110; THUMBV6-NEXT: str r0, [sp, #12] @ 4-byte Spill111; THUMBV6-NEXT: ldr r0, [sp, #4] @ 4-byte Reload112; THUMBV6-NEXT: adds r0, r1, r0113; THUMBV6-NEXT: mov r1, r5114; THUMBV6-NEXT: adcs r1, r5115; THUMBV6-NEXT: orrs r1, r6116; THUMBV6-NEXT: ldr r3, [sp, #36] @ 4-byte Reload117; THUMBV6-NEXT: ldr r2, [sp, #32] @ 4-byte Reload118; THUMBV6-NEXT: orrs r3, r2119; THUMBV6-NEXT: subs r2, r3, #1120; THUMBV6-NEXT: sbcs r3, r2121; THUMBV6-NEXT: ldr r2, [sp, #8] @ 4-byte Reload122; THUMBV6-NEXT: orrs r7, r2123; THUMBV6-NEXT: subs r2, r7, #1124; THUMBV6-NEXT: sbcs r7, r2125; THUMBV6-NEXT: ands r7, r3126; THUMBV6-NEXT: orrs r7, r1127; THUMBV6-NEXT: ldr r1, [sp, #16] @ 4-byte Reload128; THUMBV6-NEXT: orrs r7, r1129; THUMBV6-NEXT: ldr r1, [sp, #24] @ 4-byte Reload130; THUMBV6-NEXT: ldr r2, [sp, #12] @ 4-byte Reload131; THUMBV6-NEXT: adds r1, r2, r1132; THUMBV6-NEXT: str r1, [sp, #32] @ 4-byte Spill133; THUMBV6-NEXT: ldr r1, [sp, #20] @ 4-byte Reload134; THUMBV6-NEXT: adcs r0, r1135; THUMBV6-NEXT: str r0, [sp, #36] @ 4-byte Spill136; THUMBV6-NEXT: ldr r0, [sp, #56] @ 4-byte Reload137; THUMBV6-NEXT: mov r1, r5138; THUMBV6-NEXT: mov r2, r4139; THUMBV6-NEXT: mov r3, r5140; THUMBV6-NEXT: bl __aeabi_lmul141; THUMBV6-NEXT: mov r4, r1142; THUMBV6-NEXT: ldr r1, [sp, #28] @ 4-byte Reload143; THUMBV6-NEXT: adds r6, r0, r1144; THUMBV6-NEXT: adcs r4, r5145; THUMBV6-NEXT: ldr r0, [sp, #52] @ 4-byte Reload146; THUMBV6-NEXT: mov r1, r5147; THUMBV6-NEXT: ldr r2, [sp, #44] @ 4-byte Reload148; THUMBV6-NEXT: mov r3, r5149; THUMBV6-NEXT: bl __aeabi_lmul150; THUMBV6-NEXT: adds r0, r0, r6151; THUMBV6-NEXT: ldr r2, [sp, #40] @ 4-byte Reload152; THUMBV6-NEXT: str r0, [r2, #4]153; THUMBV6-NEXT: adcs r1, r5154; THUMBV6-NEXT: adds r0, r4, r1155; THUMBV6-NEXT: str r0, [sp, #28] @ 4-byte Spill156; THUMBV6-NEXT: mov r6, r5157; THUMBV6-NEXT: adcs r6, r5158; THUMBV6-NEXT: ldr r0, [sp, #56] @ 4-byte Reload159; THUMBV6-NEXT: mov r1, r5160; THUMBV6-NEXT: ldr r4, [sp, #44] @ 4-byte Reload161; THUMBV6-NEXT: mov r2, r4162; THUMBV6-NEXT: mov r3, r5163; THUMBV6-NEXT: bl __aeabi_lmul164; THUMBV6-NEXT: ldr r2, [sp, #28] @ 4-byte Reload165; THUMBV6-NEXT: adds r0, r0, r2166; THUMBV6-NEXT: str r0, [sp, #28] @ 4-byte Spill167; THUMBV6-NEXT: adcs r1, r6168; THUMBV6-NEXT: str r1, [sp, #24] @ 4-byte Spill169; THUMBV6-NEXT: ldr r0, [sp, #48] @ 4-byte Reload170; THUMBV6-NEXT: mov r1, r4171; THUMBV6-NEXT: mov r2, r5172; THUMBV6-NEXT: mov r3, r5173; THUMBV6-NEXT: bl __aeabi_lmul174; THUMBV6-NEXT: mov r6, r0175; THUMBV6-NEXT: mov r4, r1176; THUMBV6-NEXT: ldr r0, [sp, #52] @ 4-byte Reload177; THUMBV6-NEXT: ldr r1, [sp, #56] @ 4-byte Reload178; THUMBV6-NEXT: mov r2, r5179; THUMBV6-NEXT: mov r3, r5180; THUMBV6-NEXT: bl __aeabi_lmul181; THUMBV6-NEXT: adds r0, r0, r6182; THUMBV6-NEXT: adcs r1, r4183; THUMBV6-NEXT: ldr r2, [sp, #28] @ 4-byte Reload184; THUMBV6-NEXT: adds r0, r2, r0185; THUMBV6-NEXT: ldr r2, [sp, #24] @ 4-byte Reload186; THUMBV6-NEXT: adcs r1, r2187; THUMBV6-NEXT: ldr r2, [sp, #32] @ 4-byte Reload188; THUMBV6-NEXT: adds r0, r0, r2189; THUMBV6-NEXT: ldr r2, [sp, #40] @ 4-byte Reload190; THUMBV6-NEXT: str r0, [r2, #8]191; THUMBV6-NEXT: ldr r0, [sp, #36] @ 4-byte Reload192; THUMBV6-NEXT: adcs r1, r0193; THUMBV6-NEXT: str r1, [r2, #12]194; THUMBV6-NEXT: adcs r5, r5195; THUMBV6-NEXT: orrs r5, r7196; THUMBV6-NEXT: movs r0, #1197; THUMBV6-NEXT: ands r0, r5198; THUMBV6-NEXT: strb r0, [r2, #16]199; THUMBV6-NEXT: add sp, #60200; THUMBV6-NEXT: pop {r4, r5, r6, r7, pc}201start:202 %0 = tail call { i128, i1 } @llvm.umul.with.overflow.i128(i128 %l, i128 %r) #2203 %1 = extractvalue { i128, i1 } %0, 0204 %2 = extractvalue { i128, i1 } %0, 1205 %3 = zext i1 %2 to i8206 %4 = insertvalue { i128, i8 } undef, i128 %1, 0207 %5 = insertvalue { i128, i8 } %4, i8 %3, 1208 ret { i128, i8 } %5209}210 211; Function Attrs: nounwind readnone speculatable212declare { i128, i1 } @llvm.umul.with.overflow.i128(i128, i128) #1213 214attributes #0 = { nounwind readnone uwtable }215attributes #1 = { nounwind readnone speculatable }216attributes #2 = { nounwind }217