; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc -mtriple=x86_64-darwin-unknown < %s | FileCheck %s --check-prefix=X64 ; RUN: llc -mtriple=i686-darwin-unknown < %s | FileCheck %s --check-prefix=X86 define zeroext i1 @saddoi128(i128 %v1, i128 %v2, i128* %res) nounwind { ; X64-LABEL: saddoi128: ; X64: ## %bb.0: ; X64-NEXT: addq %rdx, %rdi ; X64-NEXT: adcq %rcx, %rsi ; X64-NEXT: seto %al ; X64-NEXT: movq %rdi, (%r8) ; X64-NEXT: movq %rsi, 8(%r8) ; X64-NEXT: retq ; ; X86-LABEL: saddoi128: ; X86: ## %bb.0: ; X86-NEXT: pushl %ebx ; X86-NEXT: pushl %edi ; X86-NEXT: pushl %esi ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx ; X86-NEXT: movl {{[0-9]+}}(%esp), %edx ; X86-NEXT: movl {{[0-9]+}}(%esp), %esi ; X86-NEXT: movl {{[0-9]+}}(%esp), %edi ; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx ; X86-NEXT: addl {{[0-9]+}}(%esp), %edi ; X86-NEXT: adcl {{[0-9]+}}(%esp), %ebx ; X86-NEXT: adcl {{[0-9]+}}(%esp), %esi ; X86-NEXT: adcl {{[0-9]+}}(%esp), %edx ; X86-NEXT: seto %al ; X86-NEXT: movl %edi, (%ecx) ; X86-NEXT: movl %ebx, 4(%ecx) ; X86-NEXT: movl %esi, 8(%ecx) ; X86-NEXT: movl %edx, 12(%ecx) ; X86-NEXT: popl %esi ; X86-NEXT: popl %edi ; X86-NEXT: popl %ebx ; X86-NEXT: retl %t = call {i128, i1} @llvm.sadd.with.overflow.i128(i128 %v1, i128 %v2) %val = extractvalue {i128, i1} %t, 0 %obit = extractvalue {i128, i1} %t, 1 store i128 %val, i128* %res ret i1 %obit } define zeroext i1 @uaddoi128(i128 %v1, i128 %v2, i128* %res) nounwind { ; X64-LABEL: uaddoi128: ; X64: ## %bb.0: ; X64-NEXT: addq %rdx, %rdi ; X64-NEXT: adcq %rcx, %rsi ; X64-NEXT: setb %al ; X64-NEXT: movq %rdi, (%r8) ; X64-NEXT: movq %rsi, 8(%r8) ; X64-NEXT: retq ; ; X86-LABEL: uaddoi128: ; X86: ## %bb.0: ; X86-NEXT: pushl %ebx ; X86-NEXT: pushl %edi ; X86-NEXT: pushl %esi ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx ; X86-NEXT: movl {{[0-9]+}}(%esp), %edx ; X86-NEXT: movl {{[0-9]+}}(%esp), %esi ; X86-NEXT: movl {{[0-9]+}}(%esp), %edi ; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx ; X86-NEXT: addl {{[0-9]+}}(%esp), %edi ; X86-NEXT: adcl {{[0-9]+}}(%esp), %ebx ; X86-NEXT: adcl {{[0-9]+}}(%esp), %esi ; X86-NEXT: adcl {{[0-9]+}}(%esp), %edx ; X86-NEXT: setb %al ; X86-NEXT: movl %edi, (%ecx) ; X86-NEXT: movl %ebx, 4(%ecx) ; X86-NEXT: movl %esi, 8(%ecx) ; X86-NEXT: movl %edx, 12(%ecx) ; X86-NEXT: popl %esi ; X86-NEXT: popl %edi ; X86-NEXT: popl %ebx ; X86-NEXT: retl %t = call {i128, i1} @llvm.uadd.with.overflow.i128(i128 %v1, i128 %v2) %val = extractvalue {i128, i1} %t, 0 %obit = extractvalue {i128, i1} %t, 1 store i128 %val, i128* %res ret i1 %obit } define zeroext i1 @ssuboi128(i128 %v1, i128 %v2, i128* %res) nounwind { ; X64-LABEL: ssuboi128: ; X64: ## %bb.0: ; X64-NEXT: subq %rdx, %rdi ; X64-NEXT: sbbq %rcx, %rsi ; X64-NEXT: seto %al ; X64-NEXT: movq %rdi, (%r8) ; X64-NEXT: movq %rsi, 8(%r8) ; X64-NEXT: retq ; ; X86-LABEL: ssuboi128: ; X86: ## %bb.0: ; X86-NEXT: pushl %ebx ; X86-NEXT: pushl %edi ; X86-NEXT: pushl %esi ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx ; X86-NEXT: movl {{[0-9]+}}(%esp), %edx ; X86-NEXT: movl {{[0-9]+}}(%esp), %esi ; X86-NEXT: movl {{[0-9]+}}(%esp), %edi ; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx ; X86-NEXT: subl {{[0-9]+}}(%esp), %edi ; X86-NEXT: sbbl {{[0-9]+}}(%esp), %ebx ; X86-NEXT: sbbl {{[0-9]+}}(%esp), %esi ; X86-NEXT: sbbl {{[0-9]+}}(%esp), %edx ; X86-NEXT: seto %al ; X86-NEXT: movl %edi, (%ecx) ; X86-NEXT: movl %ebx, 4(%ecx) ; X86-NEXT: movl %esi, 8(%ecx) ; X86-NEXT: movl %edx, 12(%ecx) ; X86-NEXT: popl %esi ; X86-NEXT: popl %edi ; X86-NEXT: popl %ebx ; X86-NEXT: retl %t = call {i128, i1} @llvm.ssub.with.overflow.i128(i128 %v1, i128 %v2) %val = extractvalue {i128, i1} %t, 0 %obit = extractvalue {i128, i1} %t, 1 store i128 %val, i128* %res ret i1 %obit } define zeroext i1 @usuboi128(i128 %v1, i128 %v2, i128* %res) nounwind { ; X64-LABEL: usuboi128: ; X64: ## %bb.0: ; X64-NEXT: subq %rdx, %rdi ; X64-NEXT: sbbq %rcx, %rsi ; X64-NEXT: setb %al ; X64-NEXT: movq %rdi, (%r8) ; X64-NEXT: movq %rsi, 8(%r8) ; X64-NEXT: retq ; ; X86-LABEL: usuboi128: ; X86: ## %bb.0: ; X86-NEXT: pushl %ebx ; X86-NEXT: pushl %edi ; X86-NEXT: pushl %esi ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx ; X86-NEXT: movl {{[0-9]+}}(%esp), %edx ; X86-NEXT: movl {{[0-9]+}}(%esp), %esi ; X86-NEXT: movl {{[0-9]+}}(%esp), %edi ; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx ; X86-NEXT: subl {{[0-9]+}}(%esp), %edi ; X86-NEXT: sbbl {{[0-9]+}}(%esp), %ebx ; X86-NEXT: sbbl {{[0-9]+}}(%esp), %esi ; X86-NEXT: sbbl {{[0-9]+}}(%esp), %edx ; X86-NEXT: setb %al ; X86-NEXT: movl %edi, (%ecx) ; X86-NEXT: movl %ebx, 4(%ecx) ; X86-NEXT: movl %esi, 8(%ecx) ; X86-NEXT: movl %edx, 12(%ecx) ; X86-NEXT: popl %esi ; X86-NEXT: popl %edi ; X86-NEXT: popl %ebx ; X86-NEXT: retl %t = call {i128, i1} @llvm.usub.with.overflow.i128(i128 %v1, i128 %v2) %val = extractvalue {i128, i1} %t, 0 %obit = extractvalue {i128, i1} %t, 1 store i128 %val, i128* %res ret i1 %obit } declare {i128, i1} @llvm.sadd.with.overflow.i128(i128, i128) nounwind readnone declare {i128, i1} @llvm.uadd.with.overflow.i128(i128, i128) nounwind readnone declare {i128, i1} @llvm.ssub.with.overflow.i128(i128, i128) nounwind readnone declare {i128, i1} @llvm.usub.with.overflow.i128(i128, i128) nounwind readnone