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