| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| ; RUN: llc < %s -mtriple=i686-unknown -mattr=+sse2 | FileCheck %s --check-prefix=X86 |
| ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx | FileCheck %s --check-prefix=X64 |
| |
| ; These tests just check that the plumbing is in place for @llvm.bswap. The |
| ; actual output is massive at the moment as llvm.bswap is not yet legal. |
| |
| declare i32 @llvm.bswap.i32(i32) readnone |
| declare i32 @llvm.bswap.v4i32(i32) readnone |
| |
| ; fold (bswap undef) -> undef |
| define i32 @test_undef() nounwind { |
| ; X86-LABEL: test_undef: |
| ; X86: # %bb.0: |
| ; X86-NEXT: retl |
| ; |
| ; X64-LABEL: test_undef: |
| ; X64: # %bb.0: |
| ; X64-NEXT: retq |
| %b = call i32 @llvm.bswap.i32(i32 undef) |
| ret i32 %b |
| } |
| |
| ; fold (bswap (bswap x)) -> x |
| define i32 @test_bswap_bswap(i32 %a0) nounwind { |
| ; X86-LABEL: test_bswap_bswap: |
| ; X86: # %bb.0: |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax |
| ; X86-NEXT: retl |
| ; |
| ; X64-LABEL: test_bswap_bswap: |
| ; X64: # %bb.0: |
| ; X64-NEXT: movl %edi, %eax |
| ; X64-NEXT: retq |
| %b = call i32 @llvm.bswap.i32(i32 %a0) |
| %c = call i32 @llvm.bswap.i32(i32 %b) |
| ret i32 %c |
| } |
| |
| define i32 @test_demandedbits_bswap(i32 %a0) nounwind { |
| ; X86-LABEL: test_demandedbits_bswap: |
| ; X86: # %bb.0: |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax |
| ; X86-NEXT: bswapl %eax |
| ; X86-NEXT: andl $-65536, %eax # imm = 0xFFFF0000 |
| ; X86-NEXT: retl |
| ; |
| ; X64-LABEL: test_demandedbits_bswap: |
| ; X64: # %bb.0: |
| ; X64-NEXT: movl %edi, %eax |
| ; X64-NEXT: bswapl %eax |
| ; X64-NEXT: andl $-65536, %eax # imm = 0xFFFF0000 |
| ; X64-NEXT: retq |
| %b = or i32 %a0, 4278190080 |
| %c = call i32 @llvm.bswap.i32(i32 %b) |
| %d = and i32 %c, 4294901760 |
| ret i32 %d |
| } |