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