180 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686 -mattr=cmov | FileCheck %s --check-prefix=X863; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s --check-prefix=X644 5declare i4 @llvm.ssub.sat.i4(i4, i4)6declare i8 @llvm.ssub.sat.i8(i8, i8)7declare i16 @llvm.ssub.sat.i16(i16, i16)8declare i32 @llvm.ssub.sat.i32(i32, i32)9declare i64 @llvm.ssub.sat.i64(i64, i64)10 11define i32 @func32(i32 %x, i32 %y, i32 %z) nounwind {12; X86-LABEL: func32:13; X86: # %bb.0:14; X86-NEXT: movl {{[0-9]+}}(%esp), %eax15; X86-NEXT: movl {{[0-9]+}}(%esp), %edx16; X86-NEXT: imull {{[0-9]+}}(%esp), %edx17; X86-NEXT: xorl %ecx, %ecx18; X86-NEXT: cmpl %edx, %eax19; X86-NEXT: setns %cl20; X86-NEXT: addl $2147483647, %ecx # imm = 0x7FFFFFFF21; X86-NEXT: subl %edx, %eax22; X86-NEXT: cmovol %ecx, %eax23; X86-NEXT: retl24;25; X64-LABEL: func32:26; X64: # %bb.0:27; X64-NEXT: imull %edx, %esi28; X64-NEXT: xorl %eax, %eax29; X64-NEXT: cmpl %esi, %edi30; X64-NEXT: setns %al31; X64-NEXT: addl $2147483647, %eax # imm = 0x7FFFFFFF32; X64-NEXT: subl %esi, %edi33; X64-NEXT: cmovnol %edi, %eax34; X64-NEXT: retq35 %a = mul i32 %y, %z36 %tmp = call i32 @llvm.ssub.sat.i32(i32 %x, i32 %a)37 ret i32 %tmp38}39 40define i64 @func64(i64 %x, i64 %y, i64 %z) nounwind {41; X86-LABEL: func64:42; X86: # %bb.0:43; X86-NEXT: pushl %ebx44; X86-NEXT: movl {{[0-9]+}}(%esp), %eax45; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx46; X86-NEXT: subl {{[0-9]+}}(%esp), %eax47; X86-NEXT: sbbl {{[0-9]+}}(%esp), %ecx48; X86-NEXT: seto %bl49; X86-NEXT: movl %ecx, %edx50; X86-NEXT: sarl $31, %edx51; X86-NEXT: testb %bl, %bl52; X86-NEXT: cmovnel %edx, %eax53; X86-NEXT: addl $-2147483648, %edx # imm = 0x8000000054; X86-NEXT: testb %bl, %bl55; X86-NEXT: cmovel %ecx, %edx56; X86-NEXT: popl %ebx57; X86-NEXT: retl58;59; X64-LABEL: func64:60; X64: # %bb.0:61; X64-NEXT: xorl %ecx, %ecx62; X64-NEXT: cmpq %rdx, %rdi63; X64-NEXT: setns %cl64; X64-NEXT: movabsq $9223372036854775807, %rax # imm = 0x7FFFFFFFFFFFFFFF65; X64-NEXT: addq %rcx, %rax66; X64-NEXT: subq %rdx, %rdi67; X64-NEXT: cmovnoq %rdi, %rax68; X64-NEXT: retq69 %a = mul i64 %y, %z70 %tmp = call i64 @llvm.ssub.sat.i64(i64 %x, i64 %z)71 ret i64 %tmp72}73 74define signext i16 @func16(i16 signext %x, i16 signext %y, i16 signext %z) nounwind {75; X86-LABEL: func16:76; X86: # %bb.0:77; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax78; X86-NEXT: movzwl {{[0-9]+}}(%esp), %edx79; X86-NEXT: imulw {{[0-9]+}}(%esp), %dx80; X86-NEXT: xorl %ecx, %ecx81; X86-NEXT: cmpw %dx, %ax82; X86-NEXT: setns %cl83; X86-NEXT: addl $32767, %ecx # imm = 0x7FFF84; X86-NEXT: subw %dx, %ax85; X86-NEXT: cmovol %ecx, %eax86; X86-NEXT: # kill: def $ax killed $ax killed $eax87; X86-NEXT: retl88;89; X64-LABEL: func16:90; X64: # %bb.0:91; X64-NEXT: imull %edx, %esi92; X64-NEXT: xorl %eax, %eax93; X64-NEXT: cmpw %si, %di94; X64-NEXT: setns %al95; X64-NEXT: addl $32767, %eax # imm = 0x7FFF96; X64-NEXT: subw %si, %di97; X64-NEXT: cmovnol %edi, %eax98; X64-NEXT: # kill: def $ax killed $ax killed $eax99; X64-NEXT: retq100 %a = mul i16 %y, %z101 %tmp = call i16 @llvm.ssub.sat.i16(i16 %x, i16 %a)102 ret i16 %tmp103}104 105define signext i8 @func8(i8 signext %x, i8 signext %y, i8 signext %z) nounwind {106; X86-LABEL: func8:107; X86: # %bb.0:108; X86-NEXT: movzbl {{[0-9]+}}(%esp), %edx109; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax110; X86-NEXT: mulb {{[0-9]+}}(%esp)111; X86-NEXT: xorl %ecx, %ecx112; X86-NEXT: cmpb %al, %dl113; X86-NEXT: setns %cl114; X86-NEXT: addl $127, %ecx115; X86-NEXT: subb %al, %dl116; X86-NEXT: movzbl %dl, %eax117; X86-NEXT: cmovol %ecx, %eax118; X86-NEXT: # kill: def $al killed $al killed $eax119; X86-NEXT: retl120;121; X64-LABEL: func8:122; X64: # %bb.0:123; X64-NEXT: movl %esi, %eax124; X64-NEXT: # kill: def $al killed $al killed $eax125; X64-NEXT: mulb %dl126; X64-NEXT: xorl %ecx, %ecx127; X64-NEXT: cmpb %al, %dil128; X64-NEXT: setns %cl129; X64-NEXT: addl $127, %ecx130; X64-NEXT: subb %al, %dil131; X64-NEXT: movzbl %dil, %eax132; X64-NEXT: cmovol %ecx, %eax133; X64-NEXT: # kill: def $al killed $al killed $eax134; X64-NEXT: retq135 %a = mul i8 %y, %z136 %tmp = call i8 @llvm.ssub.sat.i8(i8 %x, i8 %a)137 ret i8 %tmp138}139 140define signext i4 @func4(i4 signext %x, i4 signext %y, i4 signext %z) nounwind {141; X86-LABEL: func4:142; X86: # %bb.0:143; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx144; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax145; X86-NEXT: mulb {{[0-9]+}}(%esp)146; X86-NEXT: shlb $4, %al147; X86-NEXT: sarb $4, %al148; X86-NEXT: subb %al, %cl149; X86-NEXT: movzbl %cl, %eax150; X86-NEXT: cmpb $7, %cl151; X86-NEXT: movl $7, %ecx152; X86-NEXT: cmovll %eax, %ecx153; X86-NEXT: cmpb $-7, %cl154; X86-NEXT: movl $248, %eax155; X86-NEXT: cmovgel %ecx, %eax156; X86-NEXT: movsbl %al, %eax157; X86-NEXT: retl158;159; X64-LABEL: func4:160; X64: # %bb.0:161; X64-NEXT: movl %esi, %eax162; X64-NEXT: # kill: def $al killed $al killed $eax163; X64-NEXT: mulb %dl164; X64-NEXT: shlb $4, %al165; X64-NEXT: sarb $4, %al166; X64-NEXT: subb %al, %dil167; X64-NEXT: movzbl %dil, %eax168; X64-NEXT: cmpb $7, %al169; X64-NEXT: movl $7, %ecx170; X64-NEXT: cmovll %eax, %ecx171; X64-NEXT: cmpb $-7, %cl172; X64-NEXT: movl $248, %eax173; X64-NEXT: cmovgel %ecx, %eax174; X64-NEXT: movsbl %al, %eax175; X64-NEXT: retq176 %a = mul i4 %y, %z177 %tmp = call i4 @llvm.ssub.sat.i4(i4 %x, i4 %a)178 ret i4 %tmp179}180