brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.7 KiB · c275337 Raw
283 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=aarch64-- | FileCheck %s3 4declare { i256, i1 } @llvm.uadd.with.overflow.i256(i256, i256)5declare   i256       @llvm.uadd.sat.i256(i256, i256)6 7declare { i256, i1 } @llvm.usub.with.overflow.i256(i256, i256)8declare   i256       @llvm.usub.sat.i256(i256, i256)9 10declare { i256, i1 } @llvm.sadd.with.overflow.i256(i256, i256)11declare   i256       @llvm.sadd.sat.i256(i256, i256)12 13declare { i256, i1 } @llvm.ssub.with.overflow.i256(i256, i256)14declare   i256       @llvm.ssub.sat.i256(i256, i256)15 16define i256 @u256_add(i256 %x, i256 %y) {17; CHECK-LABEL: u256_add:18; CHECK:       // %bb.0:19; CHECK-NEXT:    adds x0, x0, x420; CHECK-NEXT:    adcs x1, x1, x521; CHECK-NEXT:    adcs x2, x2, x622; CHECK-NEXT:    adc x3, x3, x723; CHECK-NEXT:    ret24  %1 = add i256 %x, %y25  ret i256 %126}27 28define { i256, i8 } @u256_checked_add(i256 %x, i256 %y) {29; CHECK-LABEL: u256_checked_add:30; CHECK:       // %bb.0:31; CHECK-NEXT:    adds x0, x0, x432; CHECK-NEXT:    adcs x1, x1, x533; CHECK-NEXT:    adcs x2, x2, x634; CHECK-NEXT:    adcs x3, x3, x735; CHECK-NEXT:    cset w8, hs36; CHECK-NEXT:    eor w4, w8, #0x137; CHECK-NEXT:    ret38  %1 = tail call { i256, i1 } @llvm.uadd.with.overflow.i256(i256 %x, i256 %y)39  %2 = extractvalue { i256, i1 } %1, 040  %3 = extractvalue { i256, i1 } %1, 141  %4 = xor i1 %3, true42  %5 = zext i1 %4 to i843  %6 = insertvalue { i256, i8 } undef, i256 %2, 044  %7 = insertvalue { i256, i8 } %6, i8 %5, 145  ret { i256, i8 } %746}47 48define { i256, i8 } @u256_overflowing_add(i256 %x, i256 %y) {49; CHECK-LABEL: u256_overflowing_add:50; CHECK:       // %bb.0:51; CHECK-NEXT:    adds x0, x0, x452; CHECK-NEXT:    adcs x1, x1, x553; CHECK-NEXT:    adcs x2, x2, x654; CHECK-NEXT:    adcs x3, x3, x755; CHECK-NEXT:    cset w4, hs56; CHECK-NEXT:    ret57  %1 = tail call { i256, i1 } @llvm.uadd.with.overflow.i256(i256 %x, i256 %y)58  %2 = extractvalue { i256, i1 } %1, 059  %3 = extractvalue { i256, i1 } %1, 160  %4 = zext i1 %3 to i861  %5 = insertvalue { i256, i8 } undef, i256 %2, 062  %6 = insertvalue { i256, i8 } %5, i8 %4, 163  ret { i256, i8 } %664}65 66define i256 @u256_saturating_add(i256 %x, i256 %y) {67; CHECK-LABEL: u256_saturating_add:68; CHECK:       // %bb.0:69; CHECK-NEXT:    adds x8, x0, x470; CHECK-NEXT:    adcs x9, x1, x571; CHECK-NEXT:    adcs x10, x2, x672; CHECK-NEXT:    adcs x11, x3, x773; CHECK-NEXT:    csinv x0, x8, xzr, lo74; CHECK-NEXT:    csinv x1, x9, xzr, lo75; CHECK-NEXT:    csinv x2, x10, xzr, lo76; CHECK-NEXT:    csinv x3, x11, xzr, lo77; CHECK-NEXT:    ret78  %1 = tail call i256 @llvm.uadd.sat.i256(i256 %x, i256 %y)79  ret i256 %180}81 82define i256 @u256_sub(i256 %x, i256 %y) {83; CHECK-LABEL: u256_sub:84; CHECK:       // %bb.0:85; CHECK-NEXT:    subs x0, x0, x486; CHECK-NEXT:    sbcs x1, x1, x587; CHECK-NEXT:    sbcs x2, x2, x688; CHECK-NEXT:    sbc x3, x3, x789; CHECK-NEXT:    ret90  %1 = sub i256 %x, %y91  ret i256 %192}93 94define { i256, i8 } @u256_checked_sub(i256 %x, i256 %y) {95; CHECK-LABEL: u256_checked_sub:96; CHECK:       // %bb.0:97; CHECK-NEXT:    subs x0, x0, x498; CHECK-NEXT:    sbcs x1, x1, x599; CHECK-NEXT:    sbcs x2, x2, x6100; CHECK-NEXT:    sbcs x3, x3, x7101; CHECK-NEXT:    cset w8, lo102; CHECK-NEXT:    eor w4, w8, #0x1103; CHECK-NEXT:    ret104  %1 = tail call { i256, i1 } @llvm.usub.with.overflow.i256(i256 %x, i256 %y)105  %2 = extractvalue { i256, i1 } %1, 0106  %3 = extractvalue { i256, i1 } %1, 1107  %4 = xor i1 %3, true108  %5 = zext i1 %4 to i8109  %6 = insertvalue { i256, i8 } undef, i256 %2, 0110  %7 = insertvalue { i256, i8 } %6, i8 %5, 1111  ret { i256, i8 } %7112}113 114define { i256, i8 } @u256_overflowing_sub(i256 %x, i256 %y) {115; CHECK-LABEL: u256_overflowing_sub:116; CHECK:       // %bb.0:117; CHECK-NEXT:    subs x0, x0, x4118; CHECK-NEXT:    sbcs x1, x1, x5119; CHECK-NEXT:    sbcs x2, x2, x6120; CHECK-NEXT:    sbcs x3, x3, x7121; CHECK-NEXT:    cset w4, lo122; CHECK-NEXT:    ret123  %1 = tail call { i256, i1 } @llvm.usub.with.overflow.i256(i256 %x, i256 %y)124  %2 = extractvalue { i256, i1 } %1, 0125  %3 = extractvalue { i256, i1 } %1, 1126  %4 = zext i1 %3 to i8127  %5 = insertvalue { i256, i8 } undef, i256 %2, 0128  %6 = insertvalue { i256, i8 } %5, i8 %4, 1129  ret { i256, i8 } %6130}131 132define i256 @u256_saturating_sub(i256 %x, i256 %y) {133; CHECK-LABEL: u256_saturating_sub:134; CHECK:       // %bb.0:135; CHECK-NEXT:    subs x8, x0, x4136; CHECK-NEXT:    sbcs x9, x1, x5137; CHECK-NEXT:    sbcs x10, x2, x6138; CHECK-NEXT:    sbcs x11, x3, x7139; CHECK-NEXT:    csel x0, xzr, x8, lo140; CHECK-NEXT:    csel x1, xzr, x9, lo141; CHECK-NEXT:    csel x2, xzr, x10, lo142; CHECK-NEXT:    csel x3, xzr, x11, lo143; CHECK-NEXT:    ret144  %1 = tail call i256 @llvm.usub.sat.i256(i256 %x, i256 %y)145  ret i256 %1146}147 148define i256 @i256_add(i256 %x, i256 %y) {149; CHECK-LABEL: i256_add:150; CHECK:       // %bb.0:151; CHECK-NEXT:    adds x0, x0, x4152; CHECK-NEXT:    adcs x1, x1, x5153; CHECK-NEXT:    adcs x2, x2, x6154; CHECK-NEXT:    adc x3, x3, x7155; CHECK-NEXT:    ret156  %1 = add i256 %x, %y157  ret i256 %1158}159 160define { i256, i8 } @i256_checked_add(i256 %x, i256 %y) {161; CHECK-LABEL: i256_checked_add:162; CHECK:       // %bb.0:163; CHECK-NEXT:    adds x0, x0, x4164; CHECK-NEXT:    adcs x1, x1, x5165; CHECK-NEXT:    adcs x2, x2, x6166; CHECK-NEXT:    adcs x3, x3, x7167; CHECK-NEXT:    cset w8, vs168; CHECK-NEXT:    eor w4, w8, #0x1169; CHECK-NEXT:    ret170  %1 = tail call { i256, i1 } @llvm.sadd.with.overflow.i256(i256 %x, i256 %y)171  %2 = extractvalue { i256, i1 } %1, 0172  %3 = extractvalue { i256, i1 } %1, 1173  %4 = xor i1 %3, true174  %5 = zext i1 %4 to i8175  %6 = insertvalue { i256, i8 } undef, i256 %2, 0176  %7 = insertvalue { i256, i8 } %6, i8 %5, 1177  ret { i256, i8 } %7178}179 180define { i256, i8 } @i256_overflowing_add(i256 %x, i256 %y) {181; CHECK-LABEL: i256_overflowing_add:182; CHECK:       // %bb.0:183; CHECK-NEXT:    adds x0, x0, x4184; CHECK-NEXT:    adcs x1, x1, x5185; CHECK-NEXT:    adcs x2, x2, x6186; CHECK-NEXT:    adcs x3, x3, x7187; CHECK-NEXT:    cset w4, vs188; CHECK-NEXT:    ret189  %1 = tail call { i256, i1 } @llvm.sadd.with.overflow.i256(i256 %x, i256 %y)190  %2 = extractvalue { i256, i1 } %1, 0191  %3 = extractvalue { i256, i1 } %1, 1192  %4 = zext i1 %3 to i8193  %5 = insertvalue { i256, i8 } undef, i256 %2, 0194  %6 = insertvalue { i256, i8 } %5, i8 %4, 1195  ret { i256, i8 } %6196}197 198define i256 @i256_saturating_add(i256 %x, i256 %y) {199; CHECK-LABEL: i256_saturating_add:200; CHECK:       // %bb.0:201; CHECK-NEXT:    adds x8, x0, x4202; CHECK-NEXT:    adcs x9, x1, x5203; CHECK-NEXT:    adcs x10, x2, x6204; CHECK-NEXT:    adcs x11, x3, x7205; CHECK-NEXT:    asr x12, x11, #63206; CHECK-NEXT:    csel x0, x12, x8, vs207; CHECK-NEXT:    eor x8, x12, #0x8000000000000000208; CHECK-NEXT:    csel x1, x12, x9, vs209; CHECK-NEXT:    csel x2, x12, x10, vs210; CHECK-NEXT:    csel x3, x8, x11, vs211; CHECK-NEXT:    ret212  %1 = tail call i256 @llvm.sadd.sat.i256(i256 %x, i256 %y)213  ret i256 %1214}215 216define i256 @i256_sub(i256 %x, i256 %y) {217; CHECK-LABEL: i256_sub:218; CHECK:       // %bb.0:219; CHECK-NEXT:    subs x0, x0, x4220; CHECK-NEXT:    sbcs x1, x1, x5221; CHECK-NEXT:    sbcs x2, x2, x6222; CHECK-NEXT:    sbc x3, x3, x7223; CHECK-NEXT:    ret224  %1 = sub i256 %x, %y225  ret i256 %1226}227 228define { i256, i8 } @i256_checked_sub(i256 %x, i256 %y) {229; CHECK-LABEL: i256_checked_sub:230; CHECK:       // %bb.0:231; CHECK-NEXT:    subs x0, x0, x4232; CHECK-NEXT:    sbcs x1, x1, x5233; CHECK-NEXT:    sbcs x2, x2, x6234; CHECK-NEXT:    sbcs x3, x3, x7235; CHECK-NEXT:    cset w8, vs236; CHECK-NEXT:    eor w4, w8, #0x1237; CHECK-NEXT:    ret238  %1 = tail call { i256, i1 } @llvm.ssub.with.overflow.i256(i256 %x, i256 %y)239  %2 = extractvalue { i256, i1 } %1, 0240  %3 = extractvalue { i256, i1 } %1, 1241  %4 = xor i1 %3, true242  %5 = zext i1 %4 to i8243  %6 = insertvalue { i256, i8 } undef, i256 %2, 0244  %7 = insertvalue { i256, i8 } %6, i8 %5, 1245  ret { i256, i8 } %7246}247 248define { i256, i8 } @i256_overflowing_sub(i256 %x, i256 %y) {249; CHECK-LABEL: i256_overflowing_sub:250; CHECK:       // %bb.0:251; CHECK-NEXT:    subs x0, x0, x4252; CHECK-NEXT:    sbcs x1, x1, x5253; CHECK-NEXT:    sbcs x2, x2, x6254; CHECK-NEXT:    sbcs x3, x3, x7255; CHECK-NEXT:    cset w4, vs256; CHECK-NEXT:    ret257  %1 = tail call { i256, i1 } @llvm.ssub.with.overflow.i256(i256 %x, i256 %y)258  %2 = extractvalue { i256, i1 } %1, 0259  %3 = extractvalue { i256, i1 } %1, 1260  %4 = zext i1 %3 to i8261  %5 = insertvalue { i256, i8 } undef, i256 %2, 0262  %6 = insertvalue { i256, i8 } %5, i8 %4, 1263  ret { i256, i8 } %6264}265 266define i256 @i256_saturating_sub(i256 %x, i256 %y) {267; CHECK-LABEL: i256_saturating_sub:268; CHECK:       // %bb.0:269; CHECK-NEXT:    subs x8, x0, x4270; CHECK-NEXT:    sbcs x9, x1, x5271; CHECK-NEXT:    sbcs x10, x2, x6272; CHECK-NEXT:    sbcs x11, x3, x7273; CHECK-NEXT:    asr x12, x11, #63274; CHECK-NEXT:    csel x0, x12, x8, vs275; CHECK-NEXT:    eor x8, x12, #0x8000000000000000276; CHECK-NEXT:    csel x1, x12, x9, vs277; CHECK-NEXT:    csel x2, x12, x10, vs278; CHECK-NEXT:    csel x3, x8, x11, vs279; CHECK-NEXT:    ret280  %1 = tail call i256 @llvm.ssub.sat.i256(i256 %x, i256 %y)281  ret i256 %1282}283