blob: 609cf0210c38bd4f415e918d4d0805645eb6c2d8 [file] [log] [blame]
Daniel Sanders0d972702016-06-24 12:23:17 +00001; RUN: llc < %s -march=mips -mcpu=mips2 | FileCheck %s -check-prefixes=ALL,GP32
2; RUN: llc < %s -march=mips -mcpu=mips32 | FileCheck %s -check-prefixes=ALL,GP32
3; RUN: llc < %s -march=mips -mcpu=mips32r2 | FileCheck %s -check-prefixes=ALL,GP32
4; RUN: llc < %s -march=mips -mcpu=mips32r3 | FileCheck %s -check-prefixes=ALL,GP32
5; RUN: llc < %s -march=mips -mcpu=mips32r5 | FileCheck %s -check-prefixes=ALL,GP32
6; RUN: llc < %s -march=mips -mcpu=mips32r6 | FileCheck %s -check-prefixes=ALL,GP32
7; RUN: llc < %s -march=mips64 -mcpu=mips3 | FileCheck %s -check-prefixes=ALL,GP64
8; RUN: llc < %s -march=mips64 -mcpu=mips4 | FileCheck %s -check-prefixes=ALL,GP64
9; RUN: llc < %s -march=mips64 -mcpu=mips64 | FileCheck %s -check-prefixes=ALL,GP64
10; RUN: llc < %s -march=mips64 -mcpu=mips64r2 | FileCheck %s -check-prefixes=ALL,GP64
11; RUN: llc < %s -march=mips64 -mcpu=mips64r3 | FileCheck %s -check-prefixes=ALL,GP64
12; RUN: llc < %s -march=mips64 -mcpu=mips64r5 | FileCheck %s -check-prefixes=ALL,GP64
13; RUN: llc < %s -march=mips64 -mcpu=mips64r6 | FileCheck %s -check-prefixes=ALL,GP64
Zlatko Buljand2ed9c62016-06-15 07:46:24 +000014; RUN: llc < %s -march=mips -mcpu=mips32r3 -mattr=+micromips | FileCheck %s \
Daniel Sanders0d972702016-06-24 12:23:17 +000015; RUN: -check-prefixes=ALL,MM,MM32
Zlatko Buljand2ed9c62016-06-15 07:46:24 +000016; RUN: llc < %s -march=mips -mcpu=mips32r6 -mattr=+micromips | FileCheck %s \
Daniel Sanders0d972702016-06-24 12:23:17 +000017; RUN: -check-prefixes=ALL,MM,MM32
Daniel Sandersde393322016-06-23 12:42:53 +000018; RUN: llc < %s -march=mips -mcpu=mips64r6 -target-abi n64 -mattr=+micromips | FileCheck %s \
Daniel Sanders0d972702016-06-24 12:23:17 +000019; RUN: -check-prefixes=ALL,MM,MM64
Vasileios Kalintiris2ed214f2015-01-26 12:04:40 +000020
21define signext i1 @or_i1(i1 signext %a, i1 signext %b) {
22entry:
23; ALL-LABEL: or_i1:
24
Zlatko Buljand2ed9c62016-06-15 07:46:24 +000025 ; GP32: or $2, $4, $5
26
Sanjay Patel2a61a822017-10-09 15:22:20 +000027 ; GP64: or $1, $4, $5
Zlatko Buljand2ed9c62016-06-15 07:46:24 +000028
Sanjay Patel2a61a822017-10-09 15:22:20 +000029 ; MM32: or16 $[[T0:[0-9]+]], $5
30 ; MM32 move $2, $[[T0]]
31
32 ; MM64: or $1, $4, $5
Vasileios Kalintiris2ed214f2015-01-26 12:04:40 +000033
34 %r = or i1 %a, %b
35 ret i1 %r
36}
37
38define signext i8 @or_i8(i8 signext %a, i8 signext %b) {
39entry:
40; ALL-LABEL: or_i8:
41
Zlatko Buljand2ed9c62016-06-15 07:46:24 +000042 ; GP32: or $2, $4, $5
43
Sanjay Patel2a61a822017-10-09 15:22:20 +000044 ; GP64: or $1, $4, $5
Zlatko Buljand2ed9c62016-06-15 07:46:24 +000045
Sanjay Patel2a61a822017-10-09 15:22:20 +000046 ; MM32: or16 $[[T0:[0-9]+]], $5
47 ; MM32 move $2, $[[T0]]
48
49 ; MM64: or $1, $4, $5
Vasileios Kalintiris2ed214f2015-01-26 12:04:40 +000050
51 %r = or i8 %a, %b
52 ret i8 %r
53}
54
55define signext i16 @or_i16(i16 signext %a, i16 signext %b) {
56entry:
57; ALL-LABEL: or_i16:
58
Zlatko Buljand2ed9c62016-06-15 07:46:24 +000059 ; GP32: or $2, $4, $5
60
Sanjay Patel2a61a822017-10-09 15:22:20 +000061 ; GP64: or $1, $4, $5
Zlatko Buljand2ed9c62016-06-15 07:46:24 +000062
Sanjay Patel2a61a822017-10-09 15:22:20 +000063 ; MM32: or16 $[[T0:[0-9]+]], $5
64 ; MM32 move $2, $[[T0]]
65
66 ; MM64: or $1, $4, $5
Vasileios Kalintiris2ed214f2015-01-26 12:04:40 +000067
68 %r = or i16 %a, %b
69 ret i16 %r
70}
71
72define signext i32 @or_i32(i32 signext %a, i32 signext %b) {
73entry:
74; ALL-LABEL: or_i32:
75
Zlatko Buljand2ed9c62016-06-15 07:46:24 +000076 ; GP32: or $2, $4, $5
Vasileios Kalintiris044e1722015-08-04 14:26:35 +000077
Zlatko Buljand2ed9c62016-06-15 07:46:24 +000078 ; GP64: or $[[T0:[0-9]+]], $4, $5
Vasileios Kalintiris044e1722015-08-04 14:26:35 +000079 ; FIXME: The sll instruction below is redundant.
80 ; GP64: sll $2, $[[T0]], 0
Vasileios Kalintiris2ed214f2015-01-26 12:04:40 +000081
Zlatko Buljand2ed9c62016-06-15 07:46:24 +000082 ; MM32: or16 $[[T0:[0-9]+]], $5
83 ; MM32: move $2, $[[T0]]
84
85 ; MM64: or $[[T0:[0-9]+]], $4, $5
86 ; MM64: sll $2, $[[T0]], 0
87
Vasileios Kalintiris2ed214f2015-01-26 12:04:40 +000088 %r = or i32 %a, %b
89 ret i32 %r
90}
91
92define signext i64 @or_i64(i64 signext %a, i64 signext %b) {
93entry:
94; ALL-LABEL: or_i64:
95
Zlatko Buljand2ed9c62016-06-15 07:46:24 +000096 ; GP32: or $2, $4, $6
97 ; GP32: or $3, $5, $7
Vasileios Kalintiris2ed214f2015-01-26 12:04:40 +000098
Zlatko Buljand2ed9c62016-06-15 07:46:24 +000099 ; GP64: or $2, $4, $5
100
101 ; MM32: or16 $[[T0:[0-9]+]], $6
102 ; MM32: or16 $[[T1:[0-9]+]], $7
103 ; MM32: move $2, $[[T0]]
104 ; MM32: move $3, $[[T1]]
105
106 ; MM64: or $2, $4, $5
Vasileios Kalintiris2ed214f2015-01-26 12:04:40 +0000107
108 %r = or i64 %a, %b
109 ret i64 %r
110}
Vasileios Kalintirisef96a8e2015-01-26 12:33:22 +0000111
112define signext i128 @or_i128(i128 signext %a, i128 signext %b) {
113entry:
114; ALL-LABEL: or_i128:
115
Zlatko Buljand2ed9c62016-06-15 07:46:24 +0000116 ; GP32: lw $[[T1:[0-9]+]], 20($sp)
117 ; GP32: lw $[[T2:[0-9]+]], 16($sp)
118 ; GP32: or $2, $4, $[[T2]]
119 ; GP32: or $3, $5, $[[T1]]
Simon Dardisbd271542016-09-01 14:53:53 +0000120 ; GP32: lw $[[T0:[0-9]+]], 24($sp)
Zlatko Buljand2ed9c62016-06-15 07:46:24 +0000121 ; GP32: or $4, $6, $[[T0]]
122 ; GP32: lw $[[T3:[0-9]+]], 28($sp)
123 ; GP32: or $5, $7, $[[T3]]
Vasileios Kalintirisef96a8e2015-01-26 12:33:22 +0000124
Zlatko Buljand2ed9c62016-06-15 07:46:24 +0000125 ; GP64: or $2, $4, $6
126 ; GP64: or $3, $5, $7
127
Simon Dardisbd271542016-09-01 14:53:53 +0000128 ; MM32: lw $[[T1:[0-9]+]], 20($sp)
129 ; MM32: lw $[[T2:[0-9]+]], 16($sp)
Simon Dardisf1148202016-08-24 13:00:47 +0000130 ; MM32: or16 $[[T2]], $4
131 ; MM32: or16 $[[T1]], $5
Simon Dardisbd271542016-09-01 14:53:53 +0000132 ; MM32: lw $[[T0:[0-9]+]], 24($sp)
Simon Dardisf1148202016-08-24 13:00:47 +0000133 ; MM32: or16 $[[T0]], $6
Simon Dardisbd271542016-09-01 14:53:53 +0000134 ; MM32: lw $[[T3:[0-9]+]], 28($sp)
Zlatko Buljand2ed9c62016-06-15 07:46:24 +0000135 ; MM32: or16 $[[T3]], $7
136
137 ; MM64: or $2, $4, $6
138 ; MM64: or $3, $5, $7
Vasileios Kalintirisef96a8e2015-01-26 12:33:22 +0000139
140 %r = or i128 %a, %b
141 ret i128 %r
142}
Zlatko Buljand2ed9c62016-06-15 07:46:24 +0000143
144define signext i1 @or_i1_4(i1 signext %b) {
145entry:
146; ALL-LABEL: or_i1_4:
147
148 ; ALL: move $2, $4
149
150 %r = or i1 4, %b
151 ret i1 %r
152}
153
154define signext i8 @or_i8_4(i8 signext %b) {
155entry:
156; ALL-LABEL: or_i8_4:
157
158 ; ALL: ori $2, $4, 4
159
160 %r = or i8 4, %b
161 ret i8 %r
162}
163
164define signext i16 @or_i16_4(i16 signext %b) {
165entry:
166; ALL-LABEL: or_i16_4:
167
168 ; ALL: ori $2, $4, 4
169
170 %r = or i16 4, %b
171 ret i16 %r
172}
173
174define signext i32 @or_i32_4(i32 signext %b) {
175entry:
176; ALL-LABEL: or_i32_4:
177
178 ; ALL: ori $2, $4, 4
179
180 %r = or i32 4, %b
181 ret i32 %r
182}
183
184define signext i64 @or_i64_4(i64 signext %b) {
185entry:
186; ALL-LABEL: or_i64_4:
187
188 ; GP32: ori $3, $5, 4
189 ; GP32: move $2, $4
190
191 ; GP64: ori $2, $4, 4
192
193 ; MM32: ori $3, $5, 4
194 ; MM32: move $2, $4
195
196 ; MM64: ori $2, $4, 4
197
198 %r = or i64 4, %b
199 ret i64 %r
200}
201
202define signext i128 @or_i128_4(i128 signext %b) {
203entry:
204; ALL-LABEL: or_i128_4:
205
206 ; GP32: ori $[[T0:[0-9]+]], $7, 4
207 ; GP32: move $2, $4
208 ; GP32: move $3, $5
209 ; GP32: move $4, $6
210 ; GP32: move $5, $[[T0]]
211
212 ; GP64: ori $3, $5, 4
213 ; GP64: move $2, $4
214
215 ; MM32: ori $[[T0:[0-9]+]], $7, 4
216 ; MM32: move $2, $4
217 ; MM32: move $3, $5
218 ; MM32: move $4, $6
219 ; MM32: move $5, $[[T0]]
220
221 ; MM64: ori $3, $5, 4
222 ; MM64: move $2, $4
223
224 %r = or i128 4, %b
225 ret i128 %r
226}
227
228define signext i1 @or_i1_31(i1 signext %b) {
229entry:
230; ALL-LABEL: or_i1_31:
231
232 ; GP32: addiu $2, $zero, -1
233
234 ; GP64: addiu $2, $zero, -1
235
236 ; MM: li16 $2, -1
237
238 %r = or i1 31, %b
239 ret i1 %r
240}
241
242define signext i8 @or_i8_31(i8 signext %b) {
243entry:
244; ALL-LABEL: or_i8_31:
245
246 ; ALL: ori $2, $4, 31
247
248 %r = or i8 31, %b
249 ret i8 %r
250}
251
252define signext i16 @or_i16_31(i16 signext %b) {
253entry:
254; ALL-LABEL: or_i16_31:
255
256 ; ALL: ori $2, $4, 31
257
258 %r = or i16 31, %b
259 ret i16 %r
260}
261
262define signext i32 @or_i32_31(i32 signext %b) {
263entry:
264; ALL-LABEL: or_i32_31:
265
266 ; ALL: ori $2, $4, 31
267
268 %r = or i32 31, %b
269 ret i32 %r
270}
271
272define signext i64 @or_i64_31(i64 signext %b) {
273entry:
274; ALL-LABEL: or_i64_31:
275
276 ; GP32: ori $3, $5, 31
277 ; GP32: move $2, $4
278
279 ; GP64: ori $2, $4, 31
280
281 ; MM32: ori $3, $5, 31
282 ; MM32: move $2, $4
283
284 ; MM64: ori $2, $4, 31
285
286 %r = or i64 31, %b
287 ret i64 %r
288}
289
290define signext i128 @or_i128_31(i128 signext %b) {
291entry:
292; ALL-LABEL: or_i128_31:
293
294 ; GP32: ori $[[T0:[0-9]+]], $7, 31
295 ; GP32: move $2, $4
296 ; GP32: move $3, $5
297 ; GP32: move $4, $6
298 ; GP32: move $5, $[[T0]]
299
300 ; GP64: ori $3, $5, 31
301 ; GP64: move $2, $4
302
303 ; MM32: ori $[[T0:[0-9]+]], $7, 31
304 ; MM32: move $2, $4
305 ; MM32: move $3, $5
306 ; MM32: move $4, $6
307 ; MM32: move $5, $[[T0]]
308
309 ; MM64: ori $3, $5, 31
310 ; MM64: move $2, $4
311
312 %r = or i128 31, %b
313 ret i128 %r
314}
315
316define signext i1 @or_i1_255(i1 signext %b) {
317entry:
318; ALL-LABEL: or_i1_255:
319
320 ; GP32: addiu $2, $zero, -1
321
322 ; GP64: addiu $2, $zero, -1
323
324 ; MM: li16 $2, -1
325
326 %r = or i1 255, %b
327 ret i1 %r
328}
329
330define signext i8 @or_i8_255(i8 signext %b) {
331entry:
332; ALL-LABEL: or_i8_255:
333
334 ; GP32: addiu $2, $zero, -1
335
336 ; GP64: addiu $2, $zero, -1
337
338 ; MM: li16 $2, -1
339
340 %r = or i8 255, %b
341 ret i8 %r
342}
343
344define signext i16 @or_i16_255(i16 signext %b) {
345entry:
346; ALL-LABEL: or_i16_255:
347
348 ; ALL: ori $2, $4, 255
349
350 %r = or i16 255, %b
351 ret i16 %r
352}
353
354define signext i32 @or_i32_255(i32 signext %b) {
355entry:
356; ALL-LABEL: or_i32_255:
357
358 ; ALL: ori $2, $4, 255
359
360 %r = or i32 255, %b
361 ret i32 %r
362}
363
364define signext i64 @or_i64_255(i64 signext %b) {
365entry:
366; ALL-LABEL: or_i64_255:
367
368 ; GP32: ori $3, $5, 255
369 ; GP32: move $2, $4
370
371 ; GP64: ori $2, $4, 255
372
373 ; MM32: ori $3, $5, 255
374 ; MM32: move $2, $4
375
376 ; MM64: ori $2, $4, 255
377
378 %r = or i64 255, %b
379 ret i64 %r
380}
381
382define signext i128 @or_i128_255(i128 signext %b) {
383entry:
384; ALL-LABEL: or_i128_255:
385
386 ; GP32: ori $[[T0:[0-9]+]], $7, 255
387 ; GP32: move $2, $4
388 ; GP32: move $3, $5
389 ; GP32: move $4, $6
390 ; GP32: move $5, $[[T0]]
391
392 ; GP64: ori $3, $5, 255
393 ; GP64: move $2, $4
394
395 ; MM32: ori $[[T0:[0-9]+]], $7, 255
396 ; MM32: move $2, $4
397 ; MM32: move $3, $5
398 ; MM32: move $4, $6
399 ; MM32: move $5, $[[T0]]
400
401 ; MM64: ori $3, $5, 255
402 ; MM64: move $2, $4
403
404 %r = or i128 255, %b
405 ret i128 %r
406}
407
408define signext i1 @or_i1_32768(i1 signext %b) {
409entry:
410; ALL-LABEL: or_i1_32768:
411
412 ; ALL: move $2, $4
413
414 %r = or i1 32768, %b
415 ret i1 %r
416}
417
418define signext i8 @or_i8_32768(i8 signext %b) {
419entry:
420; ALL-LABEL: or_i8_32768:
421
422 ; ALL: move $2, $4
423
424 %r = or i8 32768, %b
425 ret i8 %r
426}
427
428define signext i16 @or_i16_32768(i16 signext %b) {
429entry:
430; ALL-LABEL: or_i16_32768:
431
432 ; GP32: addiu $[[T0:[0-9]+]], $zero, -32768
433 ; GP32: or $2, $4, $[[T0]]
434
435 ; GP64: addiu $[[T0:[0-9]+]], $zero, -32768
436 ; GP64: or $2, $4, $[[T0]]
437
438 ; MM: addiu $2, $zero, -32768
439 ; MM: or16 $2, $4
440
441 %r = or i16 32768, %b
442 ret i16 %r
443}
444
445define signext i32 @or_i32_32768(i32 signext %b) {
446entry:
447; ALL-LABEL: or_i32_32768:
448
449 ; ALL: ori $2, $4, 32768
450
451 %r = or i32 32768, %b
452 ret i32 %r
453}
454
455define signext i64 @or_i64_32768(i64 signext %b) {
456entry:
457; ALL-LABEL: or_i64_32768:
458
459 ; GP32: ori $3, $5, 32768
460 ; GP32: move $2, $4
461
462 ; GP64: ori $2, $4, 32768
463
464 ; MM32: ori $3, $5, 32768
465 ; MM32: move $2, $4
466
467 ; MM64: ori $2, $4, 32768
468
469 %r = or i64 32768, %b
470 ret i64 %r
471}
472
473define signext i128 @or_i128_32768(i128 signext %b) {
474entry:
475; ALL-LABEL: or_i128_32768:
476
477 ; GP32: ori $[[T0:[0-9]+]], $7, 32768
478 ; GP32: move $2, $4
479 ; GP32: move $3, $5
480 ; GP32: move $4, $6
481 ; GP32: move $5, $[[T0]]
482
483 ; GP64: ori $3, $5, 32768
484 ; GP64: move $2, $4
485
486 ; MM32: ori $[[T0:[0-9]+]], $7, 32768
487 ; MM32: move $2, $4
488 ; MM32: move $3, $5
489 ; MM32: move $4, $6
490 ; MM32: move $5, $[[T0]]
491
492 ; MM64: ori $3, $5, 32768
493 ; MM64: move $2, $4
494
495 %r = or i128 32768, %b
496 ret i128 %r
497}
498
499define signext i1 @or_i1_65(i1 signext %b) {
500entry:
501; ALL-LABEL: or_i1_65:
502
503 ; GP32: addiu $2, $zero, -1
504
505 ; GP64: addiu $2, $zero, -1
506
507 ; MM: li16 $2, -1
508
509 %r = or i1 65, %b
510 ret i1 %r
511}
512
513define signext i8 @or_i8_65(i8 signext %b) {
514entry:
515; ALL-LABEL: or_i8_65:
516
517 ; ALL: ori $2, $4, 65
518
519 %r = or i8 65, %b
520 ret i8 %r
521}
522
523define signext i16 @or_i16_65(i16 signext %b) {
524entry:
525; ALL-LABEL: or_i16_65:
526
527 ; ALL: ori $2, $4, 65
528
529 %r = or i16 65, %b
530 ret i16 %r
531}
532
533define signext i32 @or_i32_65(i32 signext %b) {
534entry:
535; ALL-LABEL: or_i32_65:
536
537 ; ALL: ori $2, $4, 65
538
539 %r = or i32 65, %b
540 ret i32 %r
541}
542
543define signext i64 @or_i64_65(i64 signext %b) {
544entry:
545; ALL-LABEL: or_i64_65:
546
547 ; GP32: ori $3, $5, 65
548 ; GP32: move $2, $4
549
550 ; GP64: ori $2, $4, 65
551
552 ; MM32: ori $3, $5, 65
553 ; MM32: move $2, $4
554
555 ; MM64: ori $2, $4, 65
556
557 %r = or i64 65, %b
558 ret i64 %r
559}
560
561define signext i128 @or_i128_65(i128 signext %b) {
562entry:
563; ALL-LABEL: or_i128_65:
564
565 ; GP32: ori $[[T0:[0-9]+]], $7, 65
566 ; GP32: move $2, $4
567 ; GP32: move $3, $5
568 ; GP32: move $4, $6
569 ; GP32: move $5, $[[T0]]
570
571 ; GP64: ori $3, $5, 65
572 ; GP64: move $2, $4
573
574 ; MM32: ori $[[T0:[0-9]+]], $7, 65
575 ; MM32: move $2, $4
576 ; MM32: move $3, $5
577 ; MM32: move $4, $6
578 ; MM32: move $5, $[[T0]]
579
580 ; MM64: ori $3, $5, 65
581 ; MM64: move $2, $4
582
583 %r = or i128 65, %b
584 ret i128 %r
585}
586
587define signext i1 @or_i1_256(i1 signext %b) {
588entry:
589; ALL-LABEL: or_i1_256:
590
591 ; ALL: move $2, $4
592
593 %r = or i1 256, %b
594 ret i1 %r
595}
596
597define signext i8 @or_i8_256(i8 signext %b) {
598entry:
599; ALL-LABEL: or_i8_256:
600
601 ; ALL: move $2, $4
602
603 %r = or i8 256, %b
604 ret i8 %r
605}
606
607define signext i16 @or_i16_256(i16 signext %b) {
608entry:
609; ALL-LABEL: or_i16_256:
610
611 ; ALL: ori $2, $4, 256
612
613 %r = or i16 256, %b
614 ret i16 %r
615}
616
617define signext i32 @or_i32_256(i32 signext %b) {
618entry:
619; ALL-LABEL: or_i32_256:
620
621 ; ALL: ori $2, $4, 256
622
623 %r = or i32 256, %b
624 ret i32 %r
625}
626
627define signext i64 @or_i64_256(i64 signext %b) {
628entry:
629; ALL-LABEL: or_i64_256:
630
631 ; GP32: ori $3, $5, 256
632 ; GP32: move $2, $4
633
634 ; GP64: ori $2, $4, 256
635
636 ; MM32: ori $3, $5, 256
637 ; MM32: move $2, $4
638
639 ; MM64: ori $2, $4, 256
640
641 %r = or i64 256, %b
642 ret i64 %r
643}
644
645define signext i128 @or_i128_256(i128 signext %b) {
646entry:
647; ALL-LABEL: or_i128_256:
648
649 ; GP32: ori $[[T0:[0-9]+]], $7, 256
650 ; GP32: move $2, $4
651 ; GP32: move $3, $5
652 ; GP32: move $4, $6
653 ; GP32: move $5, $[[T0]]
654
655 ; GP64: ori $3, $5, 256
656 ; GP64: move $2, $4
657
658 ; MM32: ori $[[T0:[0-9]+]], $7, 256
659 ; MM32: move $2, $4
660 ; MM32: move $3, $5
661 ; MM32: move $4, $6
662 ; MM32: move $5, $[[T0]]
663
664 ; MM64: ori $3, $5, 256
665 ; MM64: move $2, $4
666
667 %r = or i128 256, %b
668 ret i128 %r
669}