brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.6 KiB · 3d90e09 Raw
351 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -mtriple=aarch64 -o - %s | FileCheck %s --check-prefixes=CHECK,CHECK-SD3; RUN: llc -mtriple=aarch64 -global-isel -global-isel-abort=2 -o - %s 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI4 5; CHECK-GI:       warning: Instruction selection used fallback path for test_umul_i1286; CHECK-GI-NEXT:  warning: Instruction selection used fallback path for test_smul_i1287 8define i128 @test_uadd_i128(i128 noundef %x, i128 noundef %y) {9; CHECK-SD-LABEL: test_uadd_i128:10; CHECK-SD:       // %bb.0: // %entry11; CHECK-SD-NEXT:    adds x0, x0, x212; CHECK-SD-NEXT:    adcs x1, x1, x313; CHECK-SD-NEXT:    b.lo .LBB0_214; CHECK-SD-NEXT:  // %bb.1: // %if.then15; CHECK-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill16; CHECK-SD-NEXT:    .cfi_def_cfa_offset 1617; CHECK-SD-NEXT:    .cfi_offset w30, -1618; CHECK-SD-NEXT:    bl error19; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x020; CHECK-SD-NEXT:    sxtw x0, w021; CHECK-SD-NEXT:    asr x1, x0, #6322; CHECK-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload23; CHECK-SD-NEXT:  .LBB0_2: // %cleanup24; CHECK-SD-NEXT:    ret25;26; CHECK-GI-LABEL: test_uadd_i128:27; CHECK-GI:       // %bb.0: // %entry28; CHECK-GI-NEXT:    adds x0, x0, x229; CHECK-GI-NEXT:    adcs x1, x1, x330; CHECK-GI-NEXT:    b.lo .LBB0_231; CHECK-GI-NEXT:  // %bb.1: // %if.then32; CHECK-GI-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill33; CHECK-GI-NEXT:    .cfi_def_cfa_offset 1634; CHECK-GI-NEXT:    .cfi_offset w30, -1635; CHECK-GI-NEXT:    bl error36; CHECK-GI-NEXT:    // kill: def $w0 killed $w0 def $x037; CHECK-GI-NEXT:    asr w1, w0, #3138; CHECK-GI-NEXT:    bfi x0, x1, #32, #3239; CHECK-GI-NEXT:    bfi x1, x1, #32, #3240; CHECK-GI-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload41; CHECK-GI-NEXT:  .LBB0_2: // %cleanup42; CHECK-GI-NEXT:    ret43entry:44  %0 = tail call { i128, i1 } @llvm.uadd.with.overflow.i128(i128 %x, i128 %y)45  %1 = extractvalue { i128, i1 } %0, 146  br i1 %1, label %if.then, label %if.end47 48if.then:49  %call = tail call i32 @error()50  %conv1 = sext i32 %call to i12851  br label %cleanup52 53if.end:54  %2 = extractvalue { i128, i1 } %0, 055  br label %cleanup56 57cleanup:58  %retval.0 = phi i128 [ %conv1, %if.then ], [ %2, %if.end ]59  ret i128 %retval.060}61 62define i128 @test_sadd_i128(i128 noundef %x, i128 noundef %y) {63; CHECK-SD-LABEL: test_sadd_i128:64; CHECK-SD:       // %bb.0: // %entry65; CHECK-SD-NEXT:    adds x0, x0, x266; CHECK-SD-NEXT:    adcs x1, x1, x367; CHECK-SD-NEXT:    b.vc .LBB1_268; CHECK-SD-NEXT:  // %bb.1: // %if.then69; CHECK-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill70; CHECK-SD-NEXT:    .cfi_def_cfa_offset 1671; CHECK-SD-NEXT:    .cfi_offset w30, -1672; CHECK-SD-NEXT:    bl error73; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x074; CHECK-SD-NEXT:    sxtw x0, w075; CHECK-SD-NEXT:    asr x1, x0, #6376; CHECK-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload77; CHECK-SD-NEXT:  .LBB1_2: // %cleanup78; CHECK-SD-NEXT:    ret79;80; CHECK-GI-LABEL: test_sadd_i128:81; CHECK-GI:       // %bb.0: // %entry82; CHECK-GI-NEXT:    adds x0, x0, x283; CHECK-GI-NEXT:    adcs x1, x1, x384; CHECK-GI-NEXT:    b.vc .LBB1_285; CHECK-GI-NEXT:  // %bb.1: // %if.then86; CHECK-GI-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill87; CHECK-GI-NEXT:    .cfi_def_cfa_offset 1688; CHECK-GI-NEXT:    .cfi_offset w30, -1689; CHECK-GI-NEXT:    bl error90; CHECK-GI-NEXT:    // kill: def $w0 killed $w0 def $x091; CHECK-GI-NEXT:    asr w1, w0, #3192; CHECK-GI-NEXT:    bfi x0, x1, #32, #3293; CHECK-GI-NEXT:    bfi x1, x1, #32, #3294; CHECK-GI-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload95; CHECK-GI-NEXT:  .LBB1_2: // %cleanup96; CHECK-GI-NEXT:    ret97entry:98  %0 = tail call { i128, i1 } @llvm.sadd.with.overflow.i128(i128 %x, i128 %y)99  %1 = extractvalue { i128, i1 } %0, 1100  br i1 %1, label %if.then, label %if.end101 102if.then:103  %call = tail call i32 @error()104  %conv1 = sext i32 %call to i128105  br label %cleanup106 107if.end:108  %2 = extractvalue { i128, i1 } %0, 0109  br label %cleanup110 111cleanup:112  %retval.0 = phi i128 [ %conv1, %if.then ], [ %2, %if.end ]113  ret i128 %retval.0114}115 116define i128 @test_usub_i128(i128 noundef %x, i128 noundef %y) {117; CHECK-SD-LABEL: test_usub_i128:118; CHECK-SD:       // %bb.0: // %entry119; CHECK-SD-NEXT:    subs x0, x0, x2120; CHECK-SD-NEXT:    sbcs x1, x1, x3121; CHECK-SD-NEXT:    b.hs .LBB2_2122; CHECK-SD-NEXT:  // %bb.1: // %if.then123; CHECK-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill124; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16125; CHECK-SD-NEXT:    .cfi_offset w30, -16126; CHECK-SD-NEXT:    bl error127; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x0128; CHECK-SD-NEXT:    sxtw x0, w0129; CHECK-SD-NEXT:    asr x1, x0, #63130; CHECK-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload131; CHECK-SD-NEXT:  .LBB2_2: // %cleanup132; CHECK-SD-NEXT:    ret133;134; CHECK-GI-LABEL: test_usub_i128:135; CHECK-GI:       // %bb.0: // %entry136; CHECK-GI-NEXT:    subs x0, x0, x2137; CHECK-GI-NEXT:    sbcs x1, x1, x3138; CHECK-GI-NEXT:    b.hs .LBB2_2139; CHECK-GI-NEXT:  // %bb.1: // %if.then140; CHECK-GI-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill141; CHECK-GI-NEXT:    .cfi_def_cfa_offset 16142; CHECK-GI-NEXT:    .cfi_offset w30, -16143; CHECK-GI-NEXT:    bl error144; CHECK-GI-NEXT:    // kill: def $w0 killed $w0 def $x0145; CHECK-GI-NEXT:    asr w1, w0, #31146; CHECK-GI-NEXT:    bfi x0, x1, #32, #32147; CHECK-GI-NEXT:    bfi x1, x1, #32, #32148; CHECK-GI-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload149; CHECK-GI-NEXT:  .LBB2_2: // %cleanup150; CHECK-GI-NEXT:    ret151entry:152  %0 = tail call { i128, i1 } @llvm.usub.with.overflow.i128(i128 %x, i128 %y)153  %1 = extractvalue { i128, i1 } %0, 1154  br i1 %1, label %if.then, label %if.end155 156if.then:157  %call = tail call i32 @error()158  %conv1 = sext i32 %call to i128159  br label %cleanup160 161if.end:162  %2 = extractvalue { i128, i1 } %0, 0163  br label %cleanup164 165cleanup:166  %retval.0 = phi i128 [ %conv1, %if.then ], [ %2, %if.end ]167  ret i128 %retval.0168}169 170define i128 @test_ssub_i128(i128 noundef %x, i128 noundef %y) {171; CHECK-SD-LABEL: test_ssub_i128:172; CHECK-SD:       // %bb.0: // %entry173; CHECK-SD-NEXT:    subs x0, x0, x2174; CHECK-SD-NEXT:    sbcs x1, x1, x3175; CHECK-SD-NEXT:    b.vc .LBB3_2176; CHECK-SD-NEXT:  // %bb.1: // %if.then177; CHECK-SD-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill178; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16179; CHECK-SD-NEXT:    .cfi_offset w30, -16180; CHECK-SD-NEXT:    bl error181; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x0182; CHECK-SD-NEXT:    sxtw x0, w0183; CHECK-SD-NEXT:    asr x1, x0, #63184; CHECK-SD-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload185; CHECK-SD-NEXT:  .LBB3_2: // %cleanup186; CHECK-SD-NEXT:    ret187;188; CHECK-GI-LABEL: test_ssub_i128:189; CHECK-GI:       // %bb.0: // %entry190; CHECK-GI-NEXT:    subs x0, x0, x2191; CHECK-GI-NEXT:    sbcs x1, x1, x3192; CHECK-GI-NEXT:    b.vc .LBB3_2193; CHECK-GI-NEXT:  // %bb.1: // %if.then194; CHECK-GI-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill195; CHECK-GI-NEXT:    .cfi_def_cfa_offset 16196; CHECK-GI-NEXT:    .cfi_offset w30, -16197; CHECK-GI-NEXT:    bl error198; CHECK-GI-NEXT:    // kill: def $w0 killed $w0 def $x0199; CHECK-GI-NEXT:    asr w1, w0, #31200; CHECK-GI-NEXT:    bfi x0, x1, #32, #32201; CHECK-GI-NEXT:    bfi x1, x1, #32, #32202; CHECK-GI-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload203; CHECK-GI-NEXT:  .LBB3_2: // %cleanup204; CHECK-GI-NEXT:    ret205entry:206  %0 = tail call { i128, i1 } @llvm.ssub.with.overflow.i128(i128 %x, i128 %y)207  %1 = extractvalue { i128, i1 } %0, 1208  br i1 %1, label %if.then, label %if.end209 210if.then:211  %call = tail call i32 @error()212  %conv1 = sext i32 %call to i128213  br label %cleanup214 215if.end:216  %2 = extractvalue { i128, i1 } %0, 0217  br label %cleanup218 219cleanup:220  %retval.0 = phi i128 [ %conv1, %if.then ], [ %2, %if.end ]221  ret i128 %retval.0222}223 224define i128 @test_umul_i128(i128 noundef %x, i128 noundef %y) {225; CHECK-LABEL: test_umul_i128:226; CHECK:       // %bb.0: // %entry227; CHECK-NEXT:    orr x8, x1, x3228; CHECK-NEXT:    cbz x8, .LBB4_2229; CHECK-NEXT:  // %bb.1: // %overflow230; CHECK-NEXT:    mul x9, x3, x0231; CHECK-NEXT:    cmp x1, #0232; CHECK-NEXT:    ccmp x3, #0, #4, ne233; CHECK-NEXT:    umulh x10, x1, x2234; CHECK-NEXT:    umulh x8, x3, x0235; CHECK-NEXT:    madd x9, x1, x2, x9236; CHECK-NEXT:    ccmp xzr, x10, #0, eq237; CHECK-NEXT:    umulh x11, x0, x2238; CHECK-NEXT:    ccmp xzr, x8, #0, eq239; CHECK-NEXT:    mul x0, x0, x2240; CHECK-NEXT:    cset w8, ne241; CHECK-NEXT:    adds x1, x11, x9242; CHECK-NEXT:    csinc w8, w8, wzr, lo243; CHECK-NEXT:    cbnz w8, .LBB4_3244; CHECK-NEXT:    b .LBB4_4245; CHECK-NEXT:  .LBB4_2: // %overflow.no246; CHECK-NEXT:    umulh x1, x0, x2247; CHECK-NEXT:    mul x0, x0, x2248; CHECK-NEXT:    cbz w8, .LBB4_4249; CHECK-NEXT:  .LBB4_3: // %if.then250; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill251; CHECK-NEXT:    .cfi_def_cfa_offset 16252; CHECK-NEXT:    .cfi_offset w30, -16253; CHECK-NEXT:    bl error254; CHECK-NEXT:    // kill: def $w0 killed $w0 def $x0255; CHECK-NEXT:    sxtw x0, w0256; CHECK-NEXT:    asr x1, x0, #63257; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload258; CHECK-NEXT:  .LBB4_4: // %cleanup259; CHECK-NEXT:    ret260entry:261  %0 = tail call { i128, i1 } @llvm.umul.with.overflow.i128(i128 %x, i128 %y)262  %1 = extractvalue { i128, i1 } %0, 1263  br i1 %1, label %if.then, label %if.end264 265if.then:266  %call = tail call i32 @error()267  %conv1 = sext i32 %call to i128268  br label %cleanup269 270if.end:271  %2 = extractvalue { i128, i1 } %0, 0272  br label %cleanup273 274cleanup:275  %retval.0 = phi i128 [ %conv1, %if.then ], [ %2, %if.end ]276  ret i128 %retval.0277}278 279define i128 @test_smul_i128(i128 noundef %x, i128 noundef %y) {280; CHECK-LABEL: test_smul_i128:281; CHECK:       // %bb.0: // %entry282; CHECK-NEXT:    eor x8, x3, x2, asr #63283; CHECK-NEXT:    eor x9, x1, x0, asr #63284; CHECK-NEXT:    orr x8, x9, x8285; CHECK-NEXT:    cbz x8, .LBB5_4286; CHECK-NEXT:  // %bb.1: // %overflow287; CHECK-NEXT:    asr x9, x1, #63288; CHECK-NEXT:    umulh x10, x0, x2289; CHECK-NEXT:    asr x13, x3, #63290; CHECK-NEXT:    mul x11, x1, x2291; CHECK-NEXT:    umulh x8, x1, x2292; CHECK-NEXT:    mul x9, x9, x2293; CHECK-NEXT:    adds x10, x11, x10294; CHECK-NEXT:    mul x14, x0, x3295; CHECK-NEXT:    umulh x12, x0, x3296; CHECK-NEXT:    adc x8, x8, x9297; CHECK-NEXT:    mov x9, x1298; CHECK-NEXT:    mul x13, x0, x13299; CHECK-NEXT:    asr x11, x8, #63300; CHECK-NEXT:    mul x15, x1, x3301; CHECK-NEXT:    adds x1, x14, x10302; CHECK-NEXT:    smulh x9, x9, x3303; CHECK-NEXT:    adc x10, x12, x13304; CHECK-NEXT:    asr x12, x10, #63305; CHECK-NEXT:    adds x8, x8, x10306; CHECK-NEXT:    asr x10, x1, #63307; CHECK-NEXT:    mul x0, x0, x2308; CHECK-NEXT:    adc x11, x11, x12309; CHECK-NEXT:    adds x8, x15, x8310; CHECK-NEXT:    adc x9, x9, x11311; CHECK-NEXT:    cmp x8, x10312; CHECK-NEXT:    ccmp x9, x10, #0, eq313; CHECK-NEXT:    cset w8, ne314; CHECK-NEXT:    cbz w8, .LBB5_3315; CHECK-NEXT:  .LBB5_2: // %if.then316; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill317; CHECK-NEXT:    .cfi_def_cfa_offset 16318; CHECK-NEXT:    .cfi_offset w30, -16319; CHECK-NEXT:    bl error320; CHECK-NEXT:    // kill: def $w0 killed $w0 def $x0321; CHECK-NEXT:    sxtw x0, w0322; CHECK-NEXT:    asr x1, x0, #63323; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload324; CHECK-NEXT:  .LBB5_3: // %cleanup325; CHECK-NEXT:    ret326; CHECK-NEXT:  .LBB5_4: // %overflow.no327; CHECK-NEXT:    smulh x1, x0, x2328; CHECK-NEXT:    mul x0, x0, x2329; CHECK-NEXT:    cbnz w8, .LBB5_2330; CHECK-NEXT:    b .LBB5_3331entry:332  %0 = tail call { i128, i1 } @llvm.smul.with.overflow.i128(i128 %x, i128 %y)333  %1 = extractvalue { i128, i1 } %0, 1334  br i1 %1, label %if.then, label %if.end335 336if.then:337  %call = tail call i32 @error()338  %conv1 = sext i32 %call to i128339  br label %cleanup340 341if.end:342  %2 = extractvalue { i128, i1 } %0, 0343  br label %cleanup344 345cleanup:346  %retval.0 = phi i128 [ %conv1, %if.then ], [ %2, %if.end ]347  ret i128 %retval.0348}349 350declare i32 @error()351