1; RUN: llc --mtriple=loongarch64 < %s | FileCheck %s
2
3define i64 @imm0() {
4; CHECK-LABEL: imm0:
5; CHECK:       # %bb.0:
6; CHECK-NEXT:    move $a0, $zero
7; CHECK-NEXT:    jirl $zero, $ra, 0
8  ret i64 0
9}
10
11define i64 @imm7ff0000000000000() {
12; CHECK-LABEL: imm7ff0000000000000:
13; CHECK:       # %bb.0:
14; CHECK-NEXT:    lu52i.d $a0, $zero, 2047
15; CHECK-NEXT:    jirl $zero, $ra, 0
16  ret i64 9218868437227405312
17}
18
19define i64 @imm0000000000000fff() {
20; CHECK-LABEL: imm0000000000000fff:
21; CHECK:       # %bb.0:
22; CHECK-NEXT:    ori $a0, $zero, 4095
23; CHECK-NEXT:    jirl $zero, $ra, 0
24  ret i64 4095
25}
26
27define i64 @imm0007ffff00000800() {
28; CHECK-LABEL: imm0007ffff00000800:
29; CHECK:       # %bb.0:
30; CHECK-NEXT:    ori $a0, $zero, 2048
31; CHECK-NEXT:    lu32i.d $a0, 524287
32; CHECK-NEXT:    jirl $zero, $ra, 0
33  ret i64 2251795518720000
34}
35
36define i64 @immfff0000000000fff() {
37; CHECK-LABEL: immfff0000000000fff:
38; CHECK:       # %bb.0:
39; CHECK-NEXT:    ori $a0, $zero, 4095
40; CHECK-NEXT:    lu52i.d $a0, $a0, -1
41; CHECK-NEXT:    jirl $zero, $ra, 0
42  ret i64 -4503599627366401
43}
44
45define i64 @imm0008000000000fff() {
46; CHECK-LABEL: imm0008000000000fff:
47; CHECK:       # %bb.0:
48; CHECK-NEXT:    ori $a0, $zero, 4095
49; CHECK-NEXT:    lu32i.d $a0, -524288
50; CHECK-NEXT:    lu52i.d $a0, $a0, 0
51; CHECK-NEXT:    jirl $zero, $ra, 0
52  ret i64 2251799813689343
53}
54
55define i64 @immfffffffffffff800() {
56; CHECK-LABEL: immfffffffffffff800:
57; CHECK:       # %bb.0:
58; CHECK-NEXT:    addi.w $a0, $zero, -2048
59; CHECK-NEXT:    jirl $zero, $ra, 0
60  ret i64 -2048
61}
62
63define i64 @imm00000000fffff800() {
64; CHECK-LABEL: imm00000000fffff800:
65; CHECK:       # %bb.0:
66; CHECK-NEXT:    addi.w $a0, $zero, -2048
67; CHECK-NEXT:    lu32i.d $a0, 0
68; CHECK-NEXT:    jirl $zero, $ra, 0
69  ret i64 4294965248
70}
71
72define i64 @imm000ffffffffff800() {
73; CHECK-LABEL: imm000ffffffffff800:
74; CHECK:       # %bb.0:
75; CHECK-NEXT:    addi.w $a0, $zero, -2048
76; CHECK-NEXT:    lu52i.d $a0, $a0, 0
77; CHECK-NEXT:    jirl $zero, $ra, 0
78  ret i64 4503599627368448
79}
80
81define i64 @imm00080000fffff800() {
82; CHECK-LABEL: imm00080000fffff800:
83; CHECK:       # %bb.0:
84; CHECK-NEXT:    addi.w $a0, $zero, -2048
85; CHECK-NEXT:    lu32i.d $a0, -524288
86; CHECK-NEXT:    lu52i.d $a0, $a0, 0
87; CHECK-NEXT:    jirl $zero, $ra, 0
88  ret i64 2251804108650496
89}
90
91define i64 @imm000000007ffff000() {
92; CHECK-LABEL: imm000000007ffff000:
93; CHECK:       # %bb.0:
94; CHECK-NEXT:    lu12i.w $a0, 524287
95; CHECK-NEXT:    jirl $zero, $ra, 0
96  ret i64 2147479552
97}
98
99define i64 @imm0000000080000000() {
100; CHECK-LABEL: imm0000000080000000:
101; CHECK:       # %bb.0:
102; CHECK-NEXT:    lu12i.w $a0, -524288
103; CHECK-NEXT:    lu32i.d $a0, 0
104; CHECK-NEXT:    jirl $zero, $ra, 0
105  ret i64 2147483648
106}
107
108define i64 @imm000ffffffffff000() {
109; CHECK-LABEL: imm000ffffffffff000:
110; CHECK:       # %bb.0:
111; CHECK-NEXT:    lu12i.w $a0, -1
112; CHECK-NEXT:    lu52i.d $a0, $a0, 0
113; CHECK-NEXT:    jirl $zero, $ra, 0
114  ret i64 4503599627366400
115}
116
117define i64 @imm7ff0000080000000() {
118; CHECK-LABEL: imm7ff0000080000000:
119; CHECK:       # %bb.0:
120; CHECK-NEXT:    lu12i.w $a0, -524288
121; CHECK-NEXT:    lu32i.d $a0, 0
122; CHECK-NEXT:    lu52i.d $a0, $a0, 2047
123; CHECK-NEXT:    jirl $zero, $ra, 0
124  ret i64 9218868439374888960
125}
126
127define i64 @immffffffff80000800() {
128; CHECK-LABEL: immffffffff80000800:
129; CHECK:       # %bb.0:
130; CHECK-NEXT:    lu12i.w $a0, -524288
131; CHECK-NEXT:    ori $a0, $a0, 2048
132; CHECK-NEXT:    jirl $zero, $ra, 0
133  ret i64 -2147481600
134}
135
136define i64 @immffffffff7ffff800() {
137; CHECK-LABEL: immffffffff7ffff800:
138; CHECK:       # %bb.0:
139; CHECK-NEXT:    lu12i.w $a0, 524287
140; CHECK-NEXT:    ori $a0, $a0, 2048
141; CHECK-NEXT:    lu32i.d $a0, -1
142; CHECK-NEXT:    jirl $zero, $ra, 0
143  ret i64 -2147485696
144}
145
146define i64 @imm7fffffff800007ff() {
147; CHECK-LABEL: imm7fffffff800007ff:
148; CHECK:       # %bb.0:
149; CHECK-NEXT:    lu12i.w $a0, -524288
150; CHECK-NEXT:    ori $a0, $a0, 2047
151; CHECK-NEXT:    lu52i.d $a0, $a0, 2047
152; CHECK-NEXT:    jirl $zero, $ra, 0
153  ret i64 9223372034707294207
154}
155
156define i64 @imm0008000080000800() {
157; CHECK-LABEL: imm0008000080000800:
158; CHECK:       # %bb.0:
159; CHECK-NEXT:    lu12i.w $a0, -524288
160; CHECK-NEXT:    ori $a0, $a0, 2048
161; CHECK-NEXT:    lu32i.d $a0, -524288
162; CHECK-NEXT:    lu52i.d $a0, $a0, 0
163; CHECK-NEXT:    jirl $zero, $ra, 0
164  ret i64 2251801961170944
165}
166