175 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-apple-darwin -verify-machineinstrs | FileCheck %s --check-prefix=CHECK3 4define i1 @saddo_not_i32(i32 %v1, i32 %v2) {5; CHECK-LABEL: saddo_not_i32:6; CHECK: ## %bb.0: ## %entry7; CHECK-NEXT: addl %esi, %edi8; CHECK-NEXT: setno %al9; CHECK-NEXT: retq10entry:11 %t = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %v1, i32 %v2)12 %obit = extractvalue {i32, i1} %t, 113 %ret = xor i1 %obit, true14 ret i1 %ret15}16 17define i1 @saddo_not_i64(i64 %v1, i64 %v2) {18; CHECK-LABEL: saddo_not_i64:19; CHECK: ## %bb.0: ## %entry20; CHECK-NEXT: addq %rsi, %rdi21; CHECK-NEXT: setno %al22; CHECK-NEXT: retq23entry:24 %t = call {i64, i1} @llvm.sadd.with.overflow.i64(i64 %v1, i64 %v2)25 %obit = extractvalue {i64, i1} %t, 126 %ret = xor i1 %obit, true27 ret i1 %ret28}29 30define i1 @uaddo_not_i32(i32 %v1, i32 %v2) {31; CHECK-LABEL: uaddo_not_i32:32; CHECK: ## %bb.0: ## %entry33; CHECK-NEXT: addl %esi, %edi34; CHECK-NEXT: setae %al35; CHECK-NEXT: retq36entry:37 %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %v1, i32 %v2)38 %obit = extractvalue {i32, i1} %t, 139 %ret = xor i1 %obit, true40 ret i1 %ret41}42 43define i1 @uaddo_not_i64(i64 %v1, i64 %v2) {44; CHECK-LABEL: uaddo_not_i64:45; CHECK: ## %bb.0: ## %entry46; CHECK-NEXT: addq %rsi, %rdi47; CHECK-NEXT: setae %al48; CHECK-NEXT: retq49entry:50 %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %v1, i64 %v2)51 %obit = extractvalue {i64, i1} %t, 152 %ret = xor i1 %obit, true53 ret i1 %ret54}55 56define i1 @ssubo_not_i32(i32 %v1, i32 %v2) {57; CHECK-LABEL: ssubo_not_i32:58; CHECK: ## %bb.0: ## %entry59; CHECK-NEXT: cmpl %esi, %edi60; CHECK-NEXT: setno %al61; CHECK-NEXT: retq62entry:63 %t = call {i32, i1} @llvm.ssub.with.overflow.i32(i32 %v1, i32 %v2)64 %obit = extractvalue {i32, i1} %t, 165 %ret = xor i1 %obit, true66 ret i1 %ret67}68 69define i1 @ssub_not_i64(i64 %v1, i64 %v2) {70; CHECK-LABEL: ssub_not_i64:71; CHECK: ## %bb.0: ## %entry72; CHECK-NEXT: cmpq %rsi, %rdi73; CHECK-NEXT: setno %al74; CHECK-NEXT: retq75entry:76 %t = call {i64, i1} @llvm.ssub.with.overflow.i64(i64 %v1, i64 %v2)77 %obit = extractvalue {i64, i1} %t, 178 %ret = xor i1 %obit, true79 ret i1 %ret80}81 82define i1 @usubo_not_i32(i32 %v1, i32 %v2) {83; CHECK-LABEL: usubo_not_i32:84; CHECK: ## %bb.0: ## %entry85; CHECK-NEXT: cmpl %esi, %edi86; CHECK-NEXT: setae %al87; CHECK-NEXT: retq88entry:89 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %v1, i32 %v2)90 %obit = extractvalue {i32, i1} %t, 191 %ret = xor i1 %obit, true92 ret i1 %ret93}94 95define i1 @usubo_not_i64(i64 %v1, i64 %v2) {96; CHECK-LABEL: usubo_not_i64:97; CHECK: ## %bb.0: ## %entry98; CHECK-NEXT: cmpq %rsi, %rdi99; CHECK-NEXT: setae %al100; CHECK-NEXT: retq101entry:102 %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %v1, i64 %v2)103 %obit = extractvalue {i64, i1} %t, 1104 %ret = xor i1 %obit, true105 ret i1 %ret106}107 108define i1 @smulo_not_i32(i32 %v1, i32 %v2) {109; CHECK-LABEL: smulo_not_i32:110; CHECK: ## %bb.0: ## %entry111; CHECK-NEXT: imull %esi, %edi112; CHECK-NEXT: setno %al113; CHECK-NEXT: retq114entry:115 %t = call {i32, i1} @llvm.smul.with.overflow.i32(i32 %v1, i32 %v2)116 %obit = extractvalue {i32, i1} %t, 1117 %ret = xor i1 %obit, true118 ret i1 %ret119}120 121define i1 @smulo_not_i64(i64 %v1, i64 %v2) {122; CHECK-LABEL: smulo_not_i64:123; CHECK: ## %bb.0: ## %entry124; CHECK-NEXT: imulq %rsi, %rdi125; CHECK-NEXT: setno %al126; CHECK-NEXT: retq127entry:128 %t = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %v1, i64 %v2)129 %obit = extractvalue {i64, i1} %t, 1130 %ret = xor i1 %obit, true131 ret i1 %ret132}133 134define i1 @umulo_not_i32(i32 %v1, i32 %v2) {135; CHECK-LABEL: umulo_not_i32:136; CHECK: ## %bb.0: ## %entry137; CHECK-NEXT: movl %edi, %eax138; CHECK-NEXT: mull %esi139; CHECK-NEXT: setno %al140; CHECK-NEXT: retq141entry:142 %t = call {i32, i1} @llvm.umul.with.overflow.i32(i32 %v1, i32 %v2)143 %obit = extractvalue {i32, i1} %t, 1144 %ret = xor i1 %obit, true145 ret i1 %ret146}147 148define i1 @umulo_not_i64(i64 %v1, i64 %v2) {149; CHECK-LABEL: umulo_not_i64:150; CHECK: ## %bb.0: ## %entry151; CHECK-NEXT: movq %rdi, %rax152; CHECK-NEXT: mulq %rsi153; CHECK-NEXT: setno %al154; CHECK-NEXT: retq155entry:156 %t = call {i64, i1} @llvm.umul.with.overflow.i64(i64 %v1, i64 %v2)157 %obit = extractvalue {i64, i1} %t, 1158 %ret = xor i1 %obit, true159 ret i1 %ret160}161 162declare {i32, i1} @llvm.sadd.with.overflow.i32(i32, i32) nounwind readnone163declare {i64, i1} @llvm.sadd.with.overflow.i64(i64, i64) nounwind readnone164declare {i32, i1} @llvm.uadd.with.overflow.i32(i32, i32) nounwind readnone165declare {i64, i1} @llvm.uadd.with.overflow.i64(i64, i64) nounwind readnone166declare {i32, i1} @llvm.ssub.with.overflow.i32(i32, i32) nounwind readnone167declare {i64, i1} @llvm.ssub.with.overflow.i64(i64, i64) nounwind readnone168declare {i32, i1} @llvm.usub.with.overflow.i32(i32, i32) nounwind readnone169declare {i64, i1} @llvm.usub.with.overflow.i64(i64, i64) nounwind readnone170declare {i32, i1} @llvm.smul.with.overflow.i32(i32, i32) nounwind readnone171declare {i64, i1} @llvm.smul.with.overflow.i64(i64, i64) nounwind readnone172declare {i32, i1} @llvm.umul.with.overflow.i32(i32, i32) nounwind readnone173declare {i64, i1} @llvm.umul.with.overflow.i64(i64, i64) nounwind readnone174 175