AArch64/ARM64: enable more AArch64 tests on ARM64.
[oota-llvm.git] / test / CodeGen / AArch64 / dp1.ll
1 ; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s
2 ; RUN: llc -verify-machineinstrs -o - %s -mtriple=arm64-linux-gnu | FileCheck %s
3
4 @var32 = global i32 0
5 @var64 = global i64 0
6
7 define void @rev_i32() {
8 ; CHECK-LABEL: rev_i32:
9     %val0_tmp = load i32* @var32
10     %val1_tmp = call i32 @llvm.bswap.i32(i32 %val0_tmp)
11 ; CHECK: rev    {{w[0-9]+}}, {{w[0-9]+}}
12     store volatile i32 %val1_tmp, i32* @var32
13     ret void
14 }
15
16 define void @rev_i64() {
17 ; CHECK-LABEL: rev_i64:
18     %val0_tmp = load i64* @var64
19     %val1_tmp = call i64 @llvm.bswap.i64(i64 %val0_tmp)
20 ; CHECK: rev    {{x[0-9]+}}, {{x[0-9]+}}
21     store volatile i64 %val1_tmp, i64* @var64
22     ret void
23 }
24
25 define void @rev32_i64() {
26 ; CHECK-LABEL: rev32_i64:
27     %val0_tmp = load i64* @var64
28     %val1_tmp = shl i64 %val0_tmp, 32
29     %val5_tmp = sub i64 64, 32
30     %val2_tmp = lshr i64 %val0_tmp, %val5_tmp
31     %val3_tmp = or i64 %val1_tmp, %val2_tmp
32     %val4_tmp = call i64 @llvm.bswap.i64(i64 %val3_tmp)
33 ; CHECK: rev32  {{x[0-9]+}}, {{x[0-9]+}}
34     store volatile i64 %val4_tmp, i64* @var64
35     ret void
36 }
37
38 define void @rev16_i32() {
39 ; CHECK-LABEL: rev16_i32:
40     %val0_tmp = load i32* @var32
41     %val1_tmp = shl i32 %val0_tmp, 16
42     %val2_tmp = lshr i32 %val0_tmp, 16
43     %val3_tmp = or i32 %val1_tmp, %val2_tmp
44     %val4_tmp = call i32 @llvm.bswap.i32(i32 %val3_tmp)
45 ; CHECK: rev16  {{w[0-9]+}}, {{w[0-9]+}}
46     store volatile i32 %val4_tmp, i32* @var32
47     ret void
48 }
49
50 define void @clz_zerodef_i32() {
51 ; CHECK-LABEL: clz_zerodef_i32:
52     %val0_tmp = load i32* @var32
53     %val4_tmp = call i32 @llvm.ctlz.i32(i32 %val0_tmp, i1 0)
54 ; CHECK: clz    {{w[0-9]+}}, {{w[0-9]+}}
55     store volatile i32 %val4_tmp, i32* @var32
56     ret void
57 }
58
59 define void @clz_zerodef_i64() {
60 ; CHECK-LABEL: clz_zerodef_i64:
61     %val0_tmp = load i64* @var64
62     %val4_tmp = call i64 @llvm.ctlz.i64(i64 %val0_tmp, i1 0)
63 ; CHECK: clz    {{x[0-9]+}}, {{x[0-9]+}}
64     store volatile i64 %val4_tmp, i64* @var64
65     ret void
66 }
67
68 define void @clz_zeroundef_i32() {
69 ; CHECK-LABEL: clz_zeroundef_i32:
70     %val0_tmp = load i32* @var32
71     %val4_tmp = call i32 @llvm.ctlz.i32(i32 %val0_tmp, i1 1)
72 ; CHECK: clz    {{w[0-9]+}}, {{w[0-9]+}}
73     store volatile i32 %val4_tmp, i32* @var32
74     ret void
75 }
76
77 define void @clz_zeroundef_i64() {
78 ; CHECK-LABEL: clz_zeroundef_i64:
79     %val0_tmp = load i64* @var64
80     %val4_tmp = call i64 @llvm.ctlz.i64(i64 %val0_tmp, i1 1)
81 ; CHECK: clz    {{x[0-9]+}}, {{x[0-9]+}}
82     store volatile i64 %val4_tmp, i64* @var64
83     ret void
84 }
85
86 define void @cttz_zerodef_i32() {
87 ; CHECK-LABEL: cttz_zerodef_i32:
88     %val0_tmp = load i32* @var32
89     %val4_tmp = call i32 @llvm.cttz.i32(i32 %val0_tmp, i1 0)
90 ; CHECK: rbit   [[REVERSED:w[0-9]+]], {{w[0-9]+}}
91 ; CHECK: clz    {{w[0-9]+}}, [[REVERSED]]
92     store volatile i32 %val4_tmp, i32* @var32
93     ret void
94 }
95
96 define void @cttz_zerodef_i64() {
97 ; CHECK-LABEL: cttz_zerodef_i64:
98     %val0_tmp = load i64* @var64
99     %val4_tmp = call i64 @llvm.cttz.i64(i64 %val0_tmp, i1 0)
100 ; CHECK: rbit   [[REVERSED:x[0-9]+]], {{x[0-9]+}}
101 ; CHECK: clz    {{x[0-9]+}}, [[REVERSED]]
102     store volatile i64 %val4_tmp, i64* @var64
103     ret void
104 }
105
106 define void @cttz_zeroundef_i32() {
107 ; CHECK-LABEL: cttz_zeroundef_i32:
108     %val0_tmp = load i32* @var32
109     %val4_tmp = call i32 @llvm.cttz.i32(i32 %val0_tmp, i1 1)
110 ; CHECK: rbit   [[REVERSED:w[0-9]+]], {{w[0-9]+}}
111 ; CHECK: clz    {{w[0-9]+}}, [[REVERSED]]
112     store volatile i32 %val4_tmp, i32* @var32
113     ret void
114 }
115
116 define void @cttz_zeroundef_i64() {
117 ; CHECK-LABEL: cttz_zeroundef_i64:
118     %val0_tmp = load i64* @var64
119     %val4_tmp = call i64 @llvm.cttz.i64(i64 %val0_tmp, i1 1)
120 ; CHECK: rbit   [[REVERSED:x[0-9]+]], {{x[0-9]+}}
121 ; CHECK: clz    {{x[0-9]+}}, [[REVERSED]]
122     store volatile i64 %val4_tmp, i64* @var64
123     ret void
124 }
125
126 ; These two are just compilation tests really: the operation's set to Expand in
127 ; ISelLowering.
128 define void @ctpop_i32() {
129 ; CHECK-LABEL: ctpop_i32:
130     %val0_tmp = load i32* @var32
131     %val4_tmp = call i32 @llvm.ctpop.i32(i32 %val0_tmp)
132     store volatile i32 %val4_tmp, i32* @var32
133     ret void
134 }
135
136 define void @ctpop_i64() {
137 ; CHECK-LABEL: ctpop_i64:
138     %val0_tmp = load i64* @var64
139     %val4_tmp = call i64 @llvm.ctpop.i64(i64 %val0_tmp)
140     store volatile i64 %val4_tmp, i64* @var64
141     ret void
142 }
143
144
145 declare i32 @llvm.bswap.i32(i32)
146 declare i64 @llvm.bswap.i64(i64)
147 declare i32  @llvm.ctlz.i32 (i32, i1)
148 declare i64  @llvm.ctlz.i64 (i64, i1)
149 declare i32  @llvm.cttz.i32 (i32, i1)
150 declare i64  @llvm.cttz.i64 (i64, i1)
151 declare i32  @llvm.ctpop.i32 (i32)
152 declare i64  @llvm.ctpop.i64 (i64)
153