• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: llc -verify-machineinstrs -O0 < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s
2
3define i64 @test0() {
4; CHECK: 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
10define i64 @test1() {
11; CHECK: test1:
12; CHECK: movz x0, #1
13  ret i64 1
14}
15
16define i64 @test2() {
17; CHECK: test2:
18; CHECK: movz x0, #65535
19  ret i64 65535
20}
21
22define i64 @test3() {
23; CHECK: test3:
24; CHECK: movz x0, #1, lsl #16
25  ret i64 65536
26}
27
28define i64 @test4() {
29; CHECK: test4:
30; CHECK: movz x0, #65535, lsl #16
31  ret i64 4294901760
32}
33
34define i64 @test5() {
35; CHECK: test5:
36; CHECK: movz x0, #1, lsl #32
37  ret i64 4294967296
38}
39
40define i64 @test6() {
41; CHECK: test6:
42; CHECK: movz x0, #65535, lsl #32
43  ret i64 281470681743360
44}
45
46define i64 @test7() {
47; CHECK: test7:
48; CHECK: movz x0, #1, lsl #48
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
54define i64 @test8() {
55; CHECK: test8:
56; CHECK: movn w0, #60875
57  ret i64 4294906420
58}
59
60define i64 @test9() {
61; CHECK: test9:
62; CHECK: movn x0, #0
63  ret i64 -1
64}
65
66define i64 @test10() {
67; CHECK: test10:
68; CHECK: movn x0, #60875, 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
76define void @test11() {
77; CHECK: test11:
78; CHECK: mov {{w[0-9]+}}, wzr
79  store i32 0, i32* @var32
80  ret void
81}
82
83define void @test12() {
84; CHECK: test12:
85; CHECK: movz {{w[0-9]+}}, #1
86  store i32 1, i32* @var32
87  ret void
88}
89
90define void @test13() {
91; CHECK: test13:
92; CHECK: movz {{w[0-9]+}}, #65535
93  store i32 65535, i32* @var32
94  ret void
95}
96
97define void @test14() {
98; CHECK: test14:
99; CHECK: movz {{w[0-9]+}}, #1, lsl #16
100  store i32 65536, i32* @var32
101  ret void
102}
103
104define void @test15() {
105; CHECK: test15:
106; CHECK: movz {{w[0-9]+}}, #65535, lsl #16
107  store i32 4294901760, i32* @var32
108  ret void
109}
110
111define void @test16() {
112; CHECK: test16:
113; CHECK: movn {{w[0-9]+}}, #0
114  store i32 -1, i32* @var32
115  ret void
116}
117
118define i64 @test17() {
119; CHECK: test17:
120
121  ; Mustn't MOVN w0 here.
122; CHECK: movn x0, #2
123  ret i64 -3
124}
125