summaryrefslogtreecommitdiffstats
path: root/llvm/test/MC/AArch64/armv8.1a-atomic.s
blob: bcfd3e7d166a5e18406417cfe76d1a9c3ca6367e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
// RUN: not llvm-mc -triple aarch64-none-linux-gnu -mattr=+v8.1a -show-encoding < %s 2> %t | FileCheck %s
// RUN: FileCheck --check-prefix=CHECK-ERROR <%t %s
  .text

  //8 bits
  casb   w0, w1, [x2]
  casab  w0, w1, [x2]
  caslb  w0, w1, [x2]
  casalb   w0, w1, [x2]

//CHECK:  casb   w0, w1, [x2]        //      encoding: [0x41,0x7c,0xa0,0x08]
//CHECK:  casab  w0, w1, [x2]        //      encoding: [0x41,0x7c,0xe0,0x08]
//CHECK:  caslb   w0, w1, [x2]       //      encoding: [0x41,0xfc,0xa0,0x08]
//CHECK:  casalb   w0, w1, [x2]      //      encoding: [0x41,0xfc,0xe0,0x08]

  casb w0, w1, [w2]
  casalb x0, x1, [x2]
//CHECK-ERROR: error: invalid operand for instruction
//CHECK-ERROR:   casb w0, w1, [w2]
//CHECK-ERROR:                 ^
//CHECK-ERROR: error: invalid operand for instruction
//CHECK-ERROR:   casalb x0, x1, [x2]
//CHECK-ERROR:          ^

  //16 bits
  cash   w0, w1, [x2]
  casah  w0, w1, [x2]
  caslh  w0, w1, [x2]
  casalh   w0, w1, [x2]

//CHECK:  cash   w0, w1, [x2]        //      encoding: [0x41,0x7c,0xa0,0x48]
//CHECK:  casah  w0, w1, [x2]        //      encoding: [0x41,0x7c,0xe0,0x48]
//CHECK:  caslh   w0, w1, [x2]       //      encoding: [0x41,0xfc,0xa0,0x48]
//CHECK:  casalh   w0, w1, [x2]      //      encoding: [0x41,0xfc,0xe0,0x48]

  //32 bits
  cas   w0, w1, [x2]
  casa  w0, w1, [x2]
  casl  w0, w1, [x2]
  casal   w0, w1, [x2]

//CHECK:  cas   w0, w1, [x2]        //      encoding: [0x41,0x7c,0xa0,0x88]
//CHECK:  casa  w0, w1, [x2]        //      encoding: [0x41,0x7c,0xe0,0x88]
//CHECK:  casl   w0, w1, [x2]       //      encoding: [0x41,0xfc,0xa0,0x88]
//CHECK:  casal   w0, w1, [x2]      //      encoding: [0x41,0xfc,0xe0,0x88]

  cas   w0, w1, [w2]
  casl  w0, x1, [x2]

//CHECK-ERROR: error: invalid operand for instruction
//CHECK-ERROR:   cas   w0, w1, [w2]
//CHECK-ERROR:                  ^
//CHECK-ERROR: error: invalid operand for instruction
//CHECK-ERROR:   casl  w0, x1, [x2]
//CHECK-ERROR:             ^

  //64 bits
  cas   x0, x1, [x2]
  casa  x0, x1, [x2]
  casl   x0, x1, [x2]
  casal   x0, x1, [x2]

//CHECK:  cas   x0, x1, [x2]        //      encoding: [0x41,0x7c,0xa0,0xc8]
//CHECK:  casa  x0, x1, [x2]        //      encoding: [0x41,0x7c,0xe0,0xc8]
//CHECK:  casl   x0, x1, [x2]       //      encoding: [0x41,0xfc,0xa0,0xc8]
//CHECK:  casal   x0, x1, [x2]      //      encoding: [0x41,0xfc,0xe0,0xc8]

  casa   x0, x1, [w2]
  casal  x0, w1, [x2]

//CHECK-ERROR: error: invalid operand for instruction
//CHECK-ERROR:   casa   x0, x1, [w2]
//CHECK-ERROR:                   ^
//CHECK-ERROR: error: invalid operand for instruction
//CHECK-ERROR:   casal  x0, w1, [x2]
//CHECK-ERROR:              ^

  // LD<OP> intructions
  ldadda x0, x1, [x2]
  ldclrl x0, x1, [x2]
  ldeoral x0, x1, [x2]
  ldset x0, x1, [x2]
  ldsmaxa w0, w1, [x2]
  ldsminlb w0, w1, [x2]
  ldumaxalh w0, w1, [x2]
  ldumin w0, w1, [x2]
  ldsminb w2, w3, [x5]
//CHECK: ldadda     x0, x1, [x2]  // encoding: [0x41,0x00,0xa0,0xf8]
//CHECK: ldclrl     x0, x1, [x2]  // encoding: [0x41,0x10,0x60,0xf8]
//CHECK: ldeoral    x0, x1, [x2]  // encoding: [0x41,0x20,0xe0,0xf8]
//CHECK: ldset      x0, x1, [x2]  // encoding: [0x41,0x30,0x20,0xf8]
//CHECK: ldsmaxa    w0, w1, [x2]  // encoding: [0x41,0x40,0xa0,0xb8]
//CHECK: ldsminlb   w0, w1, [x2]  // encoding: [0x41,0x50,0x60,0x38]
//CHECK: ldumaxalh  w0, w1, [x2]  // encoding: [0x41,0x60,0xe0,0x78]
//CHECK: ldumin     w0, w1, [x2]  // encoding: [0x41,0x70,0x20,0xb8]
//CHECK: ldsminb    w2, w3, [x5]  // encoding: [0xa3,0x50,0x22,0x38]

  // ST<OP> intructions: aliases to LD<OP>
  stADDlb w0, [x2]
  stclrlh w0, [x2]
  steorl  w0, [x2]
  stsetl  x0, [x2]
  stsmaxb  w0, [x2]
  stsminh  w0, [x2]
  stumax   w0, [x2]
  stumin   x0, [x2]
  stsminl x29, [sp]
//CHECK: staddlb    w0, [x2]  // encoding: [0x5f,0x00,0x60,0x38]
//CHECK: stclrlh    w0, [x2]  // encoding: [0x5f,0x10,0x60,0x78]
//CHECK: steorl     w0, [x2]  // encoding: [0x5f,0x20,0x60,0xb8]
//CHECK: stsetl     x0, [x2]  // encoding: [0x5f,0x30,0x60,0xf8]
//CHECK: stsmaxb     w0, [x2]  // encoding: [0x5f,0x40,0x20,0x38]
//CHECK: stsminh     w0, [x2]  // encoding: [0x5f,0x50,0x20,0x78]
//CHECK: stumax      w0, [x2]  // encoding: [0x5f,0x60,0x20,0xb8]
//CHECK: stumin      x0, [x2]  // encoding: [0x5f,0x70,0x20,0xf8]
//CHECK: stsminl     x29, [sp] // encoding: [0xff,0x53,0x7d,0xf8]


  ldsmax x0, x1, [w2]
  ldeorl w0, w1, [w2]
//CHECK-ERROR: error: invalid operand for instruction
//CHECK-ERROR:   ldsmax x0, x1, [w2]
//CHECK-ERROR:                   ^
//CHECK-ERROR: error: invalid operand for instruction
//CHECK-ERROR:   ldeorl w0, w1, [w2]
//CHECK-ERROR:                   ^

  //SWP instruction
  swp   x0, x1, [x2]
  swpb  w0, w1, [x2]
  swplh w0, w1, [x2]
  swpal x0, x1, [sp]
//CHECK: swp   x0, x1, [x2]       // encoding: [0x41,0x80,0x20,0xf8]
//CHECK: swpb  w0, w1, [x2]       // encoding: [0x41,0x80,0x20,0x38]
//CHECK: swplh w0, w1, [x2]       // encoding: [0x41,0x80,0x60,0x78]
//CHECK: swpal x0, x1, [sp]       // encoding: [0xe1,0x83,0xe0,0xf8]

  swp   x0, x1, [w2]
  swp   x0, x1, [xzr]
//CHECK-ERROR: error: invalid operand for instruction
//CHECK-ERROR:   swp   x0, x1, [w2]
//CHECK-ERROR:                  ^
//CHECK-ERROR: error: invalid operand for instruction
//CHECK-ERROR:   swp   x0, x1, [xzr]
//CHECK-ERROR:                  ^

  //CASP instruction
  casp x0, x1, x2, x3, [x4]
  casp w0, w1, w2, w3, [x4]
//CHECK: casp x0, x1, x2, x3, [x4]      // encoding: [0x82,0x7c,0x20,0x48]
//CHECK: casp w0, w1, w2, w3, [x4]      // encoding: [0x82,0x7c,0x20,0x08]

  casp x1, x2, x4, x5, [x6]
  casp x0, x1, x3, x4, [x5]
  casp x0, x2, x4, x5, [x6]
  casp x0, x1, x2, x4, [x5]
  casp x0, w1, x2, x3, [x5]
  casp w0, x1, x2, x3, [x5]
  casp w0, x1, w2, w3, [x5]
  casp x0, x1, w2, w3, [x5]
//CHECK-ERROR: error: expected first even register of a consecutive same-size even/odd register pair
//CHECK-ERROR:  casp x1, x2, x4, x5, [x6]
//CHECK-ERROR:       ^
//CHECK-ERROR: error: expected first even register of a consecutive same-size even/odd register pair
//CHECK-ERROR:  casp x0, x1, x3, x4, [x5]
//CHECK-ERROR:               ^
//CHECK-ERROR: error:  expected second odd register of a consecutive same-size even/odd register pair
//CHECK-ERROR:  casp x0, x2, x4, x5, [x6]
//CHECK-ERROR:           ^
//CHECK-ERROR: error: expected second odd register of a consecutive same-size even/odd register pair
//CHECK-ERROR:  casp x0, x1, x2, x4, [x5]
//CHECK-ERROR:                   ^
//CHECK-ERROR: error: expected second odd register of a consecutive same-size even/odd register pair
//CHECK-ERROR:  casp x0, w1, x2, x3, [x5]
//CHECK-ERROR:           ^
//CHECK-ERROR: error: expected second odd register of a consecutive same-size even/odd register pair
//CHECK-ERROR:  casp w0, x1, x2, x3, [x5]
//CHECK-ERROR:           ^
//CHECK-ERROR: error: expected second odd register of a consecutive same-size even/odd register pair
//CHECK-ERROR:  casp w0, x1, w2, w3, [x5]
//CHECK-ERROR:           ^
//CHECK-ERROR: error: invalid operand for instruction
//CHECK-ERROR:  casp x0, x1, w2, w3, [x5]
//CHECK-ERROR:               ^
OpenPOWER on IntegriCloud