summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/X86/ssub_sat.ll
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test/CodeGen/X86/ssub_sat.ll')
-rw-r--r--llvm/test/CodeGen/X86/ssub_sat.ll74
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:
OpenPOWER on IntegriCloud