170 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=x86_64-darwin-unknown < %s | FileCheck %s --check-prefix=X643; RUN: llc -mtriple=i686-darwin-unknown < %s | FileCheck %s --check-prefix=X864 5define zeroext i1 @saddoi128(i128 %v1, i128 %v2, ptr %res) nounwind {6; X64-LABEL: saddoi128:7; X64: ## %bb.0:8; X64-NEXT: addq %rdx, %rdi9; X64-NEXT: adcq %rcx, %rsi10; X64-NEXT: seto %al11; X64-NEXT: movq %rdi, (%r8)12; X64-NEXT: movq %rsi, 8(%r8)13; X64-NEXT: retq14;15; X86-LABEL: saddoi128:16; X86: ## %bb.0:17; X86-NEXT: pushl %ebx18; X86-NEXT: pushl %edi19; X86-NEXT: pushl %esi20; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx21; X86-NEXT: movl {{[0-9]+}}(%esp), %edx22; X86-NEXT: movl {{[0-9]+}}(%esp), %esi23; X86-NEXT: movl {{[0-9]+}}(%esp), %edi24; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx25; X86-NEXT: addl {{[0-9]+}}(%esp), %edi26; X86-NEXT: adcl {{[0-9]+}}(%esp), %ebx27; X86-NEXT: adcl {{[0-9]+}}(%esp), %esi28; X86-NEXT: adcl {{[0-9]+}}(%esp), %edx29; X86-NEXT: seto %al30; X86-NEXT: movl %edi, (%ecx)31; X86-NEXT: movl %ebx, 4(%ecx)32; X86-NEXT: movl %esi, 8(%ecx)33; X86-NEXT: movl %edx, 12(%ecx)34; X86-NEXT: popl %esi35; X86-NEXT: popl %edi36; X86-NEXT: popl %ebx37; X86-NEXT: retl38 %t = call {i128, i1} @llvm.sadd.with.overflow.i128(i128 %v1, i128 %v2)39 %val = extractvalue {i128, i1} %t, 040 %obit = extractvalue {i128, i1} %t, 141 store i128 %val, ptr %res42 ret i1 %obit43}44 45define zeroext i1 @uaddoi128(i128 %v1, i128 %v2, ptr %res) nounwind {46; X64-LABEL: uaddoi128:47; X64: ## %bb.0:48; X64-NEXT: addq %rdx, %rdi49; X64-NEXT: adcq %rcx, %rsi50; X64-NEXT: setb %al51; X64-NEXT: movq %rdi, (%r8)52; X64-NEXT: movq %rsi, 8(%r8)53; X64-NEXT: retq54;55; X86-LABEL: uaddoi128:56; X86: ## %bb.0:57; X86-NEXT: pushl %ebx58; X86-NEXT: pushl %edi59; X86-NEXT: pushl %esi60; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx61; X86-NEXT: movl {{[0-9]+}}(%esp), %edx62; X86-NEXT: movl {{[0-9]+}}(%esp), %esi63; X86-NEXT: movl {{[0-9]+}}(%esp), %edi64; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx65; X86-NEXT: addl {{[0-9]+}}(%esp), %edi66; X86-NEXT: adcl {{[0-9]+}}(%esp), %ebx67; X86-NEXT: adcl {{[0-9]+}}(%esp), %esi68; X86-NEXT: adcl {{[0-9]+}}(%esp), %edx69; X86-NEXT: setb %al70; X86-NEXT: movl %edi, (%ecx)71; X86-NEXT: movl %ebx, 4(%ecx)72; X86-NEXT: movl %esi, 8(%ecx)73; X86-NEXT: movl %edx, 12(%ecx)74; X86-NEXT: popl %esi75; X86-NEXT: popl %edi76; X86-NEXT: popl %ebx77; X86-NEXT: retl78 %t = call {i128, i1} @llvm.uadd.with.overflow.i128(i128 %v1, i128 %v2)79 %val = extractvalue {i128, i1} %t, 080 %obit = extractvalue {i128, i1} %t, 181 store i128 %val, ptr %res82 ret i1 %obit83}84 85 86define zeroext i1 @ssuboi128(i128 %v1, i128 %v2, ptr %res) nounwind {87; X64-LABEL: ssuboi128:88; X64: ## %bb.0:89; X64-NEXT: subq %rdx, %rdi90; X64-NEXT: sbbq %rcx, %rsi91; X64-NEXT: seto %al92; X64-NEXT: movq %rdi, (%r8)93; X64-NEXT: movq %rsi, 8(%r8)94; X64-NEXT: retq95;96; X86-LABEL: ssuboi128:97; X86: ## %bb.0:98; X86-NEXT: pushl %ebx99; X86-NEXT: pushl %edi100; X86-NEXT: pushl %esi101; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx102; X86-NEXT: movl {{[0-9]+}}(%esp), %edx103; X86-NEXT: movl {{[0-9]+}}(%esp), %esi104; X86-NEXT: movl {{[0-9]+}}(%esp), %edi105; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx106; X86-NEXT: subl {{[0-9]+}}(%esp), %edi107; X86-NEXT: sbbl {{[0-9]+}}(%esp), %ebx108; X86-NEXT: sbbl {{[0-9]+}}(%esp), %esi109; X86-NEXT: sbbl {{[0-9]+}}(%esp), %edx110; X86-NEXT: seto %al111; X86-NEXT: movl %edi, (%ecx)112; X86-NEXT: movl %ebx, 4(%ecx)113; X86-NEXT: movl %esi, 8(%ecx)114; X86-NEXT: movl %edx, 12(%ecx)115; X86-NEXT: popl %esi116; X86-NEXT: popl %edi117; X86-NEXT: popl %ebx118; X86-NEXT: retl119 %t = call {i128, i1} @llvm.ssub.with.overflow.i128(i128 %v1, i128 %v2)120 %val = extractvalue {i128, i1} %t, 0121 %obit = extractvalue {i128, i1} %t, 1122 store i128 %val, ptr %res123 ret i1 %obit124}125 126define zeroext i1 @usuboi128(i128 %v1, i128 %v2, ptr %res) nounwind {127; X64-LABEL: usuboi128:128; X64: ## %bb.0:129; X64-NEXT: subq %rdx, %rdi130; X64-NEXT: sbbq %rcx, %rsi131; X64-NEXT: setb %al132; X64-NEXT: movq %rdi, (%r8)133; X64-NEXT: movq %rsi, 8(%r8)134; X64-NEXT: retq135;136; X86-LABEL: usuboi128:137; X86: ## %bb.0:138; X86-NEXT: pushl %ebx139; X86-NEXT: pushl %edi140; X86-NEXT: pushl %esi141; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx142; X86-NEXT: movl {{[0-9]+}}(%esp), %edx143; X86-NEXT: movl {{[0-9]+}}(%esp), %esi144; X86-NEXT: movl {{[0-9]+}}(%esp), %edi145; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx146; X86-NEXT: subl {{[0-9]+}}(%esp), %edi147; X86-NEXT: sbbl {{[0-9]+}}(%esp), %ebx148; X86-NEXT: sbbl {{[0-9]+}}(%esp), %esi149; X86-NEXT: sbbl {{[0-9]+}}(%esp), %edx150; X86-NEXT: setb %al151; X86-NEXT: movl %edi, (%ecx)152; X86-NEXT: movl %ebx, 4(%ecx)153; X86-NEXT: movl %esi, 8(%ecx)154; X86-NEXT: movl %edx, 12(%ecx)155; X86-NEXT: popl %esi156; X86-NEXT: popl %edi157; X86-NEXT: popl %ebx158; X86-NEXT: retl159 %t = call {i128, i1} @llvm.usub.with.overflow.i128(i128 %v1, i128 %v2)160 %val = extractvalue {i128, i1} %t, 0161 %obit = extractvalue {i128, i1} %t, 1162 store i128 %val, ptr %res163 ret i1 %obit164}165 166declare {i128, i1} @llvm.sadd.with.overflow.i128(i128, i128) nounwind readnone167declare {i128, i1} @llvm.uadd.with.overflow.i128(i128, i128) nounwind readnone168declare {i128, i1} @llvm.ssub.with.overflow.i128(i128, i128) nounwind readnone169declare {i128, i1} @llvm.usub.with.overflow.i128(i128, i128) nounwind readnone170