1; RUN: llc < %s -mtriple=i686-unknown | FileCheck %s
2
3; These tests just check that the plumbing is in place for @llvm.bitreverse. The
4; actual output is massive at the moment as llvm.bitreverse is not yet legal.
5
6declare <2 x i16> @llvm.bitreverse.v2i16(<2 x i16>) readnone
7
8define <2 x i16> @f(<2 x i16> %a) {
9; CHECK-LABEL: f:
10; CHECK: shll
11  %b = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> %a)
12  ret <2 x i16> %b
13}
14
15declare i8 @llvm.bitreverse.i8(i8) readnone
16
17define i8 @g(i8 %a) {
18; CHECK-LABEL: g:
19; CHECK: shlb
20  %b = call i8 @llvm.bitreverse.i8(i8 %a)
21  ret i8 %b
22}
23
24; These tests check that bitreverse(constant) calls are folded
25
26define <2 x i16> @fold_v2i16() {
27; CHECK-LABEL: fold_v2i16:
28; CHECK:       # BB#0:
29; CHECK-NEXT:    movw $-4096, %ax # imm = 0xF000
30; CHECK-NEXT:    movw $240, %dx
31; CHECK-NEXT:    retl
32  %b = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> <i16 15, i16 3840>)
33  ret <2 x i16> %b
34}
35
36define i8 @fold_i8() {
37; CHECK-LABEL: fold_i8:
38; CHECK:       # BB#0:
39; CHECK-NEXT:    movb $-16, %al
40; CHECK-NEXT:    retl
41  %b = call i8 @llvm.bitreverse.i8(i8 15)
42  ret i8 %b
43}
44
45; These tests check that bitreverse(bitreverse()) calls are removed
46
47define i8 @identity_i8(i8 %a) {
48; CHECK-LABEL: identity_i8:
49; CHECK:       # BB#0:
50; CHECK-NEXT:    movb {{[0-9]+}}(%esp), %al
51; CHECK-NEXT:    retl
52  %b = call i8 @llvm.bitreverse.i8(i8 %a)
53  %c = call i8 @llvm.bitreverse.i8(i8 %b)
54  ret i8 %c
55}
56
57define <2 x i16> @identity_v2i16(<2 x i16> %a) {
58; CHECK-LABEL: identity_v2i16:
59; CHECK:       # BB#0:
60; CHECK-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
61; CHECK-NEXT:    movzwl {{[0-9]+}}(%esp), %edx
62; CHECK-NEXT:    retl
63  %b = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> %a)
64  %c = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> %b)
65  ret <2 x i16> %c
66}
67
68; These tests check that bitreverse(undef) calls are removed
69
70define i8 @undef_i8() {
71; CHECK-LABEL: undef_i8:
72; CHECK:       # BB#0:
73; CHECK-NEXT:    retl
74  %b = call i8 @llvm.bitreverse.i8(i8 undef)
75  ret i8 %b
76}
77
78define <2 x i16> @undef_v2i16() {
79; CHECK-LABEL: undef_v2i16:
80; CHECK:       # BB#0:
81; CHECK-NEXT:    retl
82  %b = call <2 x i16> @llvm.bitreverse.v2i16(<2 x i16> undef)
83  ret <2 x i16> %b
84}
85