-; RUN: llc -mtriple x86_64-apple-darwin -O0 -o - < %s | FileCheck %s
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s -mtriple=x86_64-apple-darwin -O0 | FileCheck %s
+
; Make sure we only use the less significant bit of the value that feeds the
; select. Otherwise, we may account for a non-zero value whereas the
; lsb is zero.
; <rdar://problem/15651765>
-; CHECK-LABEL: fastisel_select:
-; CHECK: subb {{%[a-z0-9]+}}, [[RES:%[a-z0-9]+]]
-; CHECK: testb $1, [[RES]]
-; CHECK: cmovnel %edi, %esi
define i32 @fastisel_select(i1 %exchSub2211_, i1 %trunc_8766) {
+; CHECK-LABEL: fastisel_select:
+; CHECK: ## %bb.0:
+; CHECK-NEXT: movb %sil, %al
+; CHECK-NEXT: movb %dil, %cl
+; CHECK-NEXT: xorl %esi, %esi
+; CHECK-NEXT: subb %al, %cl
+; CHECK-NEXT: testb $1, %cl
+; CHECK-NEXT: movl $1204476887, %edi ## imm = 0x47CADBD7
+; CHECK-NEXT: cmovnel %edi, %esi
+; CHECK-NEXT: movl %esi, %eax
+; CHECK-NEXT: retq
%shuffleInternal15257_8932 = sub i1 %exchSub2211_, %trunc_8766
%counter_diff1345 = select i1 %shuffleInternal15257_8932, i32 1204476887, i32 0
ret i32 %counter_diff1345
; X32-NEXT: andb $1, %al
; X32-NEXT: negb %al
; X32-NEXT: retl
-; X32-NEXT: ## -- End function
;
; X64-LABEL: test1:
; X64: ## %bb.0:
; X64-NEXT: negb %dil
; X64-NEXT: movl %edi, %eax
; X64-NEXT: retq
-; X64-NEXT: ## -- End function
%z = trunc i8 %x to i1
%u = sext i1 %z to i8
ret i8 %u
; X32-NEXT: movsbl %al, %eax
; X32-NEXT: ## kill: def $ax killed $ax killed $eax
; X32-NEXT: retl
-; X32-NEXT: ## -- End function
;
; X64-LABEL: test2:
; X64: ## %bb.0:
; X64-NEXT: movsbl %dil, %eax
; X64-NEXT: ## kill: def $ax killed $ax killed $eax
; X64-NEXT: retq
-; X64-NEXT: ## -- End function
%z = trunc i16 %x to i1
%u = sext i1 %z to i16
ret i16 %u
; X32-NEXT: negb %al
; X32-NEXT: movsbl %al, %eax
; X32-NEXT: retl
-; X32-NEXT: ## -- End function
;
; X64-LABEL: test3:
; X64: ## %bb.0:
; X64-NEXT: negb %dil
; X64-NEXT: movsbl %dil, %eax
; X64-NEXT: retq
-; X64-NEXT: ## -- End function
%z = trunc i32 %x to i1
%u = sext i1 %z to i32
ret i32 %u
; X32-NEXT: negb %al
; X32-NEXT: movsbl %al, %eax
; X32-NEXT: retl
-; X32-NEXT: ## -- End function
;
; X64-LABEL: test4:
; X64: ## %bb.0:
; X64-NEXT: negb %dil
; X64-NEXT: movsbl %dil, %eax
; X64-NEXT: retq
-; X64-NEXT: ## -- End function
%z = trunc i32 %x to i1
%u = sext i1 %z to i32
ret i32 %u
; X32-NEXT: movb {{[0-9]+}}(%esp), %al
; X32-NEXT: andb $1, %al
; X32-NEXT: retl
-; X32-NEXT: ## -- End function
;
; X64-LABEL: test5:
; X64: ## %bb.0:
; X64-NEXT: andb $1, %dil
; X64-NEXT: movl %edi, %eax
; X64-NEXT: retq
-; X64-NEXT: ## -- End function
%z = trunc i8 %x to i1
%u = zext i1 %z to i8
ret i8 %u
; X32-NEXT: movzbl %al, %eax
; X32-NEXT: ## kill: def $ax killed $ax killed $eax
; X32-NEXT: retl
-; X32-NEXT: ## -- End function
;
; X64-LABEL: test6:
; X64: ## %bb.0:
; X64-NEXT: movzbl %dil, %eax
; X64-NEXT: ## kill: def $ax killed $ax killed $eax
; X64-NEXT: retq
-; X64-NEXT: ## -- End function
%z = trunc i16 %x to i1
%u = zext i1 %z to i16
ret i16 %u
; X32-NEXT: andb $1, %al
; X32-NEXT: movzbl %al, %eax
; X32-NEXT: retl
-; X32-NEXT: ## -- End function
;
; X64-LABEL: test7:
; X64: ## %bb.0:
; X64-NEXT: andb $1, %dil
; X64-NEXT: movzbl %dil, %eax
; X64-NEXT: retq
-; X64-NEXT: ## -- End function
%z = trunc i32 %x to i1
%u = zext i1 %z to i32
ret i32 %u
; X32-NEXT: andb $1, %al
; X32-NEXT: movzbl %al, %eax
; X32-NEXT: retl
-; X32-NEXT: ## -- End function
;
; X64-LABEL: test8:
; X64: ## %bb.0:
; X64-NEXT: andb $1, %dil
; X64-NEXT: movzbl %dil, %eax
; X64-NEXT: retq
-; X64-NEXT: ## -- End function
%z = trunc i32 %x to i1
%u = zext i1 %z to i32
ret i32 %u
; X32-NEXT: movsbl {{[0-9]+}}(%esp), %eax
; X32-NEXT: ## kill: def $ax killed $ax killed $eax
; X32-NEXT: retl
-; X32-NEXT: ## -- End function
;
; X64-LABEL: test9:
; X64: ## %bb.0:
; X64-NEXT: movsbl %dil, %eax
; X64-NEXT: ## kill: def $ax killed $ax killed $eax
; X64-NEXT: retq
-; X64-NEXT: ## -- End function
%u = sext i8 %x to i16
ret i16 %u
}
; X32: ## %bb.0:
; X32-NEXT: movsbl {{[0-9]+}}(%esp), %eax
; X32-NEXT: retl
-; X32-NEXT: ## -- End function
;
; X64-LABEL: test10:
; X64: ## %bb.0:
; X64-NEXT: movsbl %dil, %eax
; X64-NEXT: retq
-; X64-NEXT: ## -- End function
%u = sext i8 %x to i32
ret i32 %u
}
; X32-NEXT: movl %eax, %edx
; X32-NEXT: sarl $31, %edx
; X32-NEXT: retl
-; X32-NEXT: ## -- End function
;
; X64-LABEL: test11:
; X64: ## %bb.0:
; X64-NEXT: movsbq %dil, %rax
; X64-NEXT: retq
-; X64-NEXT: ## -- End function
%u = sext i8 %x to i64
ret i64 %u
}
; X32-NEXT: movzbl {{[0-9]+}}(%esp), %eax
; X32-NEXT: ## kill: def $ax killed $ax killed $eax
; X32-NEXT: retl
-; X32-NEXT: ## -- End function
;
; X64-LABEL: test12:
; X64: ## %bb.0:
; X64-NEXT: movzbl %dil, %eax
; X64-NEXT: ## kill: def $ax killed $ax killed $eax
; X64-NEXT: retq
-; X64-NEXT: ## -- End function
%u = zext i8 %x to i16
ret i16 %u
}
; X32: ## %bb.0:
; X32-NEXT: movzbl {{[0-9]+}}(%esp), %eax
; X32-NEXT: retl
-; X32-NEXT: ## -- End function
;
; X64-LABEL: test13:
; X64: ## %bb.0:
; X64-NEXT: movzbl %dil, %eax
; X64-NEXT: retq
-; X64-NEXT: ## -- End function
%u = zext i8 %x to i32
ret i32 %u
}
; X32-NEXT: movzbl {{[0-9]+}}(%esp), %eax
; X32-NEXT: xorl %edx, %edx
; X32-NEXT: retl
-; X32-NEXT: ## -- End function
;
; X64-LABEL: test14:
; X64: ## %bb.0:
; X64-NEXT: movzbl %dil, %eax
; X64-NEXT: retq
-; X64-NEXT: ## -- End function
%u = zext i8 %x to i64
ret i64 %u
}
; X32: ## %bb.0:
; X32-NEXT: movswl {{[0-9]+}}(%esp), %eax
; X32-NEXT: retl
-; X32-NEXT: ## -- End function
;
; X64-LABEL: test15:
; X64: ## %bb.0:
; X64-NEXT: movswl %di, %eax
; X64-NEXT: retq
-; X64-NEXT: ## -- End function
%u = sext i16 %x to i32
ret i32 %u
}
; X32-NEXT: movl %eax, %edx
; X32-NEXT: sarl $31, %edx
; X32-NEXT: retl
-; X32-NEXT: ## -- End function
;
; X64-LABEL: test16:
; X64: ## %bb.0:
; X64-NEXT: movswq %di, %rax
; X64-NEXT: retq
-; X64-NEXT: ## -- End function
%u = sext i16 %x to i64
ret i64 %u
}
; X32: ## %bb.0:
; X32-NEXT: movzwl {{[0-9]+}}(%esp), %eax
; X32-NEXT: retl
-; X32-NEXT: ## -- End function
;
; X64-LABEL: test17:
; X64: ## %bb.0:
; X64-NEXT: movzwl %di, %eax
; X64-NEXT: retq
-; X64-NEXT: ## -- End function
%u = zext i16 %x to i32
ret i32 %u
}
; X32-NEXT: movzwl {{[0-9]+}}(%esp), %eax
; X32-NEXT: xorl %edx, %edx
; X32-NEXT: retl
-; X32-NEXT: ## -- End function
;
; X64-LABEL: test18:
; X64: ## %bb.0:
; X64-NEXT: movzwl %di, %eax
; X64-NEXT: retq
-; X64-NEXT: ## -- End function
%u = zext i16 %x to i64
ret i64 %u
}
; X32-NEXT: movl %eax, %edx
; X32-NEXT: sarl $31, %edx
; X32-NEXT: retl
-; X32-NEXT: ## -- End function
;
; X64-LABEL: test19:
; X64: ## %bb.0:
; X64-NEXT: movslq %edi, %rax
; X64-NEXT: retq
-; X64-NEXT: ## -- End function
%u = sext i32 %x to i64
ret i64 %u
}
; X32-NEXT: movl {{[0-9]+}}(%esp), %eax
; X32-NEXT: xorl %edx, %edx
; X32-NEXT: retl
-; X32-NEXT: ## -- End function
;
; X64-LABEL: test20:
; X64: ## %bb.0:
; X64-NEXT: movl %edi, %eax
; X64-NEXT: retq
-; X64-NEXT: ## -- End function
%u = zext i32 %x to i64
ret i64 %u
}