xref: /llvm-project/llvm/test/CodeGen/X86/rotate5.ll (revision b651fdff79027064071db7c1d0250553e3e6a232)
1*b651fdffSSimon Pilgrim; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2*b651fdffSSimon Pilgrim; RUN: llc < %s -mtriple=i686-unknown-unknown | FileCheck %s --check-prefixes=X86
3*b651fdffSSimon Pilgrim; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefixes=X64
4*b651fdffSSimon Pilgrim
5*b651fdffSSimon Pilgrim; Ensure that the (pre-extended) shift amount type is wide enough to take any mask.
6*b651fdffSSimon Pilgrimdefine void @PR56859() {
7*b651fdffSSimon Pilgrim; X86-LABEL: PR56859:
8*b651fdffSSimon Pilgrim; X86:       # %bb.0: # %entry
9*b651fdffSSimon Pilgrim; X86-NEXT:    movl (%eax), %ecx
10*b651fdffSSimon Pilgrim; X86-NEXT:    testl %ecx, %ecx
11*b651fdffSSimon Pilgrim; X86-NEXT:    setne %al
12*b651fdffSSimon Pilgrim; X86-NEXT:    movl $1, %edx
13*b651fdffSSimon Pilgrim; X86-NEXT:    # kill: def $cl killed $cl killed $ecx
14*b651fdffSSimon Pilgrim; X86-NEXT:    shrl %cl, %edx
15*b651fdffSSimon Pilgrim; X86-NEXT:    btsl %eax, %edx
16*b651fdffSSimon Pilgrim; X86-NEXT:    movl %edx, (%eax)
17*b651fdffSSimon Pilgrim; X86-NEXT:    retl
18*b651fdffSSimon Pilgrim;
19*b651fdffSSimon Pilgrim; X64-LABEL: PR56859:
20*b651fdffSSimon Pilgrim; X64:       # %bb.0: # %entry
21*b651fdffSSimon Pilgrim; X64-NEXT:    movl (%rax), %ecx
22*b651fdffSSimon Pilgrim; X64-NEXT:    testl %ecx, %ecx
23*b651fdffSSimon Pilgrim; X64-NEXT:    setne %al
24*b651fdffSSimon Pilgrim; X64-NEXT:    movl $1, %edx
25*b651fdffSSimon Pilgrim; X64-NEXT:    # kill: def $cl killed $cl killed $ecx
26*b651fdffSSimon Pilgrim; X64-NEXT:    shrl %cl, %edx
27*b651fdffSSimon Pilgrim; X64-NEXT:    btsl %eax, %edx
28*b651fdffSSimon Pilgrim; X64-NEXT:    movl %edx, (%rax)
29*b651fdffSSimon Pilgrim; X64-NEXT:    retq
30*b651fdffSSimon Pilgrimentry:
31*b651fdffSSimon Pilgrim  %0 = load i32, ptr undef, align 4
32*b651fdffSSimon Pilgrim  %tobool = icmp ne i32 %0, 0
33*b651fdffSSimon Pilgrim  %lor.ext = zext i1 %tobool to i32
34*b651fdffSSimon Pilgrim  %shr = lshr i32 1, %0
35*b651fdffSSimon Pilgrim  %shl = shl i32 1, %lor.ext
36*b651fdffSSimon Pilgrim  %or = or i32 %shl, %shr
37*b651fdffSSimon Pilgrim  store i32 %or, ptr undef, align 4
38*b651fdffSSimon Pilgrim  ret void
39*b651fdffSSimon Pilgrim}
40