[FastISel][AArch64] Optimize compare-and-branch for i1 to use 'tbz'.
[oota-llvm.git] / test / CodeGen / AArch64 / movw-consts.ll
1 ; RUN: llc -verify-machineinstrs -o - %s -mtriple=arm64-apple-ios7.0 | FileCheck %s --check-prefix=CHECK
2
3 define i64 @test0() {
4 ; CHECK-LABEL: test0:
5 ; Not produced by move wide instructions, but good to make sure we can return 0 anyway:
6 ; CHECK: mov x0, xzr
7   ret i64 0
8 }
9
10 define i64 @test1() {
11 ; CHECK-LABEL: test1:
12 ; CHECK: orr w0, wzr, #0x1
13   ret i64 1
14 }
15
16 define i64 @test2() {
17 ; CHECK-LABEL: test2:
18 ; CHECK: orr w0, wzr, #0xffff
19   ret i64 65535
20 }
21
22 define i64 @test3() {
23 ; CHECK-LABEL: test3:
24 ; CHECK: orr w0, wzr, #0x10000
25   ret i64 65536
26 }
27
28 define i64 @test4() {
29 ; CHECK-LABEL: test4:
30 ; CHECK: orr w0, wzr, #0xffff0000
31   ret i64 4294901760
32 }
33
34 define i64 @test5() {
35 ; CHECK-LABEL: test5:
36 ; CHECK: orr x0, xzr, #0x100000000
37   ret i64 4294967296
38 }
39
40 define i64 @test6() {
41 ; CHECK-LABEL: test6:
42 ; CHECK: orr x0, xzr, #0xffff00000000
43   ret i64 281470681743360
44 }
45
46 define i64 @test7() {
47 ; CHECK-LABEL: test7:
48 ; CHECK: orr x0, xzr, #0x1000000000000
49   ret i64 281474976710656
50 }
51
52 ; A 32-bit MOVN can generate some 64-bit patterns that a 64-bit one
53 ; couldn't. Useful even for i64
54 define i64 @test8() {
55 ; CHECK-LABEL: test8:
56 ; CHECK: movn w0, #{{60875|0xedcb}}
57   ret i64 4294906420
58 }
59
60 define i64 @test9() {
61 ; CHECK-LABEL: test9:
62 ; CHECK: movn x0, #0
63   ret i64 -1
64 }
65
66 define i64 @test10() {
67 ; CHECK-LABEL: test10:
68 ; CHECK: movn x0, #{{60875|0xedcb}}, lsl #16
69   ret i64 18446744069720047615
70 }
71
72 ; For reasonably legitimate reasons returning an i32 results in the
73 ; selection of an i64 constant, so we need a different idiom to test that selection
74 @var32 = global i32 0
75
76 define void @test11() {
77 ; CHECK-LABEL: test11:
78 ; CHECK: str wzr
79   store i32 0, i32* @var32
80   ret void
81 }
82
83 define void @test12() {
84 ; CHECK-LABEL: test12:
85 ; CHECK: orr {{w[0-9]+}}, wzr, #0x1
86   store i32 1, i32* @var32
87   ret void
88 }
89
90 define void @test13() {
91 ; CHECK-LABEL: test13:
92 ; CHECK: orr {{w[0-9]+}}, wzr, #0xffff
93   store i32 65535, i32* @var32
94   ret void
95 }
96
97 define void @test14() {
98 ; CHECK-LABEL: test14:
99 ; CHECK: orr {{w[0-9]+}}, wzr, #0x10000
100   store i32 65536, i32* @var32
101   ret void
102 }
103
104 define void @test15() {
105 ; CHECK-LABEL: test15:
106 ; CHECK: orr {{w[0-9]+}}, wzr, #0xffff0000
107   store i32 4294901760, i32* @var32
108   ret void
109 }
110
111 define void @test16() {
112 ; CHECK-LABEL: test16:
113 ; CHECK: movn {{w[0-9]+}}, #0
114   store i32 -1, i32* @var32
115   ret void
116 }
117
118 define i64 @test17() {
119 ; CHECK-LABEL: test17:
120
121   ; Mustn't MOVN w0 here.
122 ; CHECK: orr x0, xzr, #0xfffffffffffffffd
123   ret i64 -3
124 }