• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: llc -O2 -verify-machineinstrs -march=mips64 -mcpu=mips64r2 \
2; RUN:   -target-abi=n64 < %s -o - | FileCheck %s -check-prefix=MIPS64R2
3; RUN: llc -O2 -verify-machineinstrs -march=mips -mcpu=mips32r2 < %s -o - \
4; RUN:   | FileCheck %s -check-prefix=MIPS32R2
5; RUN: llc -O2 -verify-machineinstrs -march=mips -mattr=mips16 < %s -o - \
6; RUN:   | FileCheck %s -check-prefix=MIPS16
7; RUN: llc -O2 -verify-machineinstrs -march=mips64 -mcpu=mips64r2 \
8; RUN:   -target-abi=n32 < %s -o - | FileCheck %s -check-prefix=MIPS64R2N32
9
10; #include <stdint.h>
11; #include <stdio.h>
12; struct cvmx_buf_ptr {
13
14;   struct {
15;     unsigned long long addr :37;
16;     unsigned long long addr1 :15;
17;     unsigned int length:14;
18;     uint64_t total_bytes:16;
19;     uint64_t segs : 6;
20;   } s;
21; }
22;
23; unsigned long long foo(volatile struct cvmx_buf_ptr bufptr) {
24;   bufptr.s.addr = 123;
25;   bufptr.s.segs = 4;
26;   bufptr.s.length = 5;
27;   bufptr.s.total_bytes = bufptr.s.length;
28;   return bufptr.s.addr;
29; }
30
31; Testing of selection INS/DINS instruction
32
33define i64 @f123(i64 inreg %bufptr.coerce0, i64 inreg %bufptr.coerce1) local_unnamed_addr #0 {
34entry:
35  %bufptr.sroa.0 = alloca i64, align 8
36  %bufptr.sroa.4 = alloca i64, align 8
37  store i64 %bufptr.coerce0, i64* %bufptr.sroa.0, align 8
38  store i64 %bufptr.coerce1, i64* %bufptr.sroa.4, align 8
39  %bufptr.sroa.0.0.bufptr.sroa.0.0.bufptr.sroa.0.0.bf.load = load volatile i64, i64* %bufptr.sroa.0, align 8
40  %bf.clear = and i64 %bufptr.sroa.0.0.bufptr.sroa.0.0.bufptr.sroa.0.0.bf.load, 134217727
41  %bf.set = or i64 %bf.clear, 16508780544
42  store volatile i64 %bf.set, i64* %bufptr.sroa.0, align 8
43  %bufptr.sroa.4.0.bufptr.sroa.4.0.bufptr.sroa.4.8.bf.load2 = load volatile i64, i64* %bufptr.sroa.4, align 8
44  %bf.clear3 = and i64 %bufptr.sroa.4.0.bufptr.sroa.4.0.bufptr.sroa.4.8.bf.load2, -16911433729
45  %bf.set4 = or i64 %bf.clear3, 1073741824
46  store volatile i64 %bf.set4, i64* %bufptr.sroa.4, align 8
47  %bufptr.sroa.4.0.bufptr.sroa.4.0.bufptr.sroa.4.8.bf.load6 = load volatile i64, i64* %bufptr.sroa.4, align 8
48  %bf.clear7 = and i64 %bufptr.sroa.4.0.bufptr.sroa.4.0.bufptr.sroa.4.8.bf.load6, 1125899906842623
49  %bf.set8 = or i64 %bf.clear7, 5629499534213120
50  store volatile i64 %bf.set8, i64* %bufptr.sroa.4, align 8
51  %bufptr.sroa.4.0.bufptr.sroa.4.0.bufptr.sroa.4.8.bf.load11 = load volatile i64, i64* %bufptr.sroa.4, align 8
52  %bf.lshr = lshr i64 %bufptr.sroa.4.0.bufptr.sroa.4.0.bufptr.sroa.4.8.bf.load11, 50
53  %bufptr.sroa.4.0.bufptr.sroa.4.0.bufptr.sroa.4.8.bf.load13 = load volatile i64, i64* %bufptr.sroa.4, align 8
54  %bf.shl = shl nuw nsw i64 %bf.lshr, 34
55  %bf.clear14 = and i64 %bufptr.sroa.4.0.bufptr.sroa.4.0.bufptr.sroa.4.8.bf.load13, -1125882726973441
56  %bf.set15 = or i64 %bf.clear14, %bf.shl
57  store volatile i64 %bf.set15, i64* %bufptr.sroa.4, align 8
58  %bufptr.sroa.0.0.bufptr.sroa.0.0.bufptr.sroa.0.0.bf.load17 = load volatile i64, i64* %bufptr.sroa.0, align 8
59  %bf.lshr18 = lshr i64 %bufptr.sroa.0.0.bufptr.sroa.0.0.bufptr.sroa.0.0.bf.load17, 27
60  ret i64 %bf.lshr18
61}
62
63; CHECK-LABEL: f123:
64; MIPS64R2: daddiu  $[[R0:[0-9]+]], $zero, 123
65; MIPS64R2: dinsm   $[[R0:[0-9]+]], $[[R1:[0-9]+]], 27, 37
66; MIPS64R2: daddiu  $[[R0:[0-9]+]], $zero, 4
67; MIPS64R2: dinsm   $[[R0:[0-9]+]], $[[R1:[0-9]+]], 28, 6
68; MIPS64R2: daddiu  $[[R0:[0-9]+]], $zero, 5
69; MIPS64R2: dinsu   $[[R0:[0-9]+]], $[[R1:[0-9]+]], 50, 14
70; MIPS64R2: dsrl    $[[R0:[0-9]+]], $[[R1:[0-9]+]], 50
71; MIPS64R2: dinsu   $[[R0:[0-9]+]], $[[R1:[0-9]+]], 34, 16
72; MIPS32R2: ins     $[[R0:[0-9]+]], $[[R1:[0-9]+]], 2, 16
73; MIPS32R2-NOT: ins $[[R0:[0-9]+]], $[[R1:[0-9]+]], 18, 46
74; MIPS16-NOT: ins{{[[:space:]].*}}
75
76
77; int foo(volatile int x) {
78;   int y = x;
79;   y = y & -4;
80;   x = y | 8;
81;   return y;
82; }
83
84define i32 @foo(i32 signext %x) {
85entry:
86  %x.addr = alloca i32, align 4
87  store volatile i32 %x, i32* %x.addr, align 4
88  %x.addr.0.x.addr.0. = load volatile i32, i32* %x.addr, align 4
89  %and = and i32 %x.addr.0.x.addr.0., -4
90  %or = or i32 %and, 8
91  store volatile i32 %or, i32* %x.addr, align 4
92  ret i32 %and
93}
94
95; CHECK-LABEL: foo:
96; MIPS64R2:        ori  $[[R0:[0-9]+]], $[[R0:[0-9]+]], 8
97; MIPS64R2-NOT:    ins {{[[:space:]].*}}
98; MIPS32R2:        ori  $[[R0:[0-9]+]], $[[R0:[0-9]+]], 8
99; MIPS32R2-NOT:    ins {{[[:space:]].*}}
100; MIPS64R2N32:     ori  $[[R0:[0-9]+]], $[[R0:[0-9]+]], 8
101; MIPS64R2N32-NOT: ins {{[[:space:]].*}}
102