diff options
Diffstat (limited to 'llvm/test/CodeGen/X86/ssub_sat.ll')
-rw-r--r-- | llvm/test/CodeGen/X86/ssub_sat.ll | 74 |
1 files changed, 70 insertions, 4 deletions
diff --git a/llvm/test/CodeGen/X86/ssub_sat.ll b/llvm/test/CodeGen/X86/ssub_sat.ll index dcfa086603b..62724e981f7 100644 --- a/llvm/test/CodeGen/X86/ssub_sat.ll +++ b/llvm/test/CodeGen/X86/ssub_sat.ll @@ -2,10 +2,12 @@ ; RUN: llc < %s -mtriple=i686 -mattr=cmov | FileCheck %s --check-prefixes=CHECK,X86 ; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s --check-prefixes=CHECK,X64 -declare i4 @llvm.ssub.sat.i4 (i4, i4) -declare i32 @llvm.ssub.sat.i32 (i32, i32) -declare i64 @llvm.ssub.sat.i64 (i64, i64) -declare <4 x i32> @llvm.ssub.sat.v4i32(<4 x i32>, <4 x i32>) +declare i4 @llvm.ssub.sat.i4(i4, i4) +declare i8 @llvm.ssub.sat.i8(i8, i8) +declare i16 @llvm.ssub.sat.i16(i16, i16) +declare i32 @llvm.ssub.sat.i32(i32, i32) +declare i64 @llvm.ssub.sat.i64(i64, i64) +declare <4 x i32> @llvm.ssub.sat.v4i32(<4 x i32>, <4 x i32>) define i32 @func(i32 %x, i32 %y) nounwind { ; X86-LABEL: func: @@ -89,6 +91,70 @@ define i64 @func2(i64 %x, i64 %y) nounwind { ret i64 %tmp } +define i16 @func16(i16 %x, i16 %y) nounwind { +; X86-LABEL: func16: +; X86: # %bb.0: +; X86-NEXT: pushl %esi +; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax +; X86-NEXT: movzwl {{[0-9]+}}(%esp), %edx +; X86-NEXT: xorl %ecx, %ecx +; X86-NEXT: movl %eax, %esi +; X86-NEXT: subw %dx, %si +; X86-NEXT: setns %cl +; X86-NEXT: addl $32767, %ecx # imm = 0x7FFF +; X86-NEXT: subw %dx, %ax +; X86-NEXT: cmovol %ecx, %eax +; X86-NEXT: # kill: def $ax killed $ax killed $eax +; X86-NEXT: popl %esi +; X86-NEXT: retl +; +; X64-LABEL: func16: +; X64: # %bb.0: +; X64-NEXT: xorl %eax, %eax +; X64-NEXT: movl %edi, %ecx +; X64-NEXT: subw %si, %cx +; X64-NEXT: setns %al +; X64-NEXT: addl $32767, %eax # imm = 0x7FFF +; X64-NEXT: subw %si, %di +; X64-NEXT: cmovnol %edi, %eax +; X64-NEXT: # kill: def $ax killed $ax killed $eax +; X64-NEXT: retq + %tmp = call i16 @llvm.ssub.sat.i16(i16 %x, i16 %y) + ret i16 %tmp +} + +define i8 @func8(i8 %x, i8 %y) nounwind { +; X86-LABEL: func8: +; X86: # %bb.0: +; X86-NEXT: movb {{[0-9]+}}(%esp), %al +; X86-NEXT: movb {{[0-9]+}}(%esp), %dl +; X86-NEXT: xorl %ecx, %ecx +; X86-NEXT: movb %al, %ah +; X86-NEXT: subb %dl, %ah +; X86-NEXT: setns %cl +; X86-NEXT: addl $127, %ecx +; X86-NEXT: subb %dl, %al +; X86-NEXT: movzbl %al, %eax +; X86-NEXT: cmovol %ecx, %eax +; X86-NEXT: # kill: def $al killed $al killed $eax +; X86-NEXT: retl +; +; X64-LABEL: func8: +; X64: # %bb.0: +; X64-NEXT: xorl %ecx, %ecx +; X64-NEXT: movl %edi, %eax +; X64-NEXT: subb %sil, %al +; X64-NEXT: setns %cl +; X64-NEXT: addl $127, %ecx +; X64-NEXT: subb %sil, %dil +; X64-NEXT: movzbl %dil, %eax +; X64-NEXT: cmovol %ecx, %eax +; X64-NEXT: # kill: def $al killed $al killed $eax +; X64-NEXT: retq + %tmp = call i8 @llvm.ssub.sat.i8(i8 %x, i8 %y) + ret i8 %tmp +} + define i4 @func3(i4 %x, i4 %y) nounwind { ; X86-LABEL: func3: ; X86: # %bb.0: |