ARMInstrThumb2.td (200581) | ARMInstrThumb2.td (201360) |
---|---|
1//===- ARMInstrThumb2.td - Thumb2 support for ARM -------------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// --- 151 unchanged lines hidden (view full) --- 160 161//===----------------------------------------------------------------------===// 162// Multiclass helpers... 163// 164 165/// T2I_un_irs - Defines a set of (op reg, {so_imm|r|so_reg}) patterns for a 166/// unary operation that produces a value. These are predicable and can be 167/// changed to modify CPSR. | 1//===- ARMInstrThumb2.td - Thumb2 support for ARM -------------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// --- 151 unchanged lines hidden (view full) --- 160 161//===----------------------------------------------------------------------===// 162// Multiclass helpers... 163// 164 165/// T2I_un_irs - Defines a set of (op reg, {so_imm|r|so_reg}) patterns for a 166/// unary operation that produces a value. These are predicable and can be 167/// changed to modify CPSR. |
168multiclass T2I_un_irs<string opc, PatFrag opnode, bit Cheap = 0, bit ReMat = 0>{ | 168multiclass T2I_un_irs<bits<4> opcod, string opc, PatFrag opnode, 169 bit Cheap = 0, bit ReMat = 0> { |
169 // shifted imm 170 def i : T2sI<(outs GPR:$dst), (ins t2_so_imm:$src), IIC_iMOVi, 171 opc, "\t$dst, $src", 172 [(set GPR:$dst, (opnode t2_so_imm:$src))]> { 173 let isAsCheapAsAMove = Cheap; 174 let isReMaterializable = ReMat; | 170 // shifted imm 171 def i : T2sI<(outs GPR:$dst), (ins t2_so_imm:$src), IIC_iMOVi, 172 opc, "\t$dst, $src", 173 [(set GPR:$dst, (opnode t2_so_imm:$src))]> { 174 let isAsCheapAsAMove = Cheap; 175 let isReMaterializable = ReMat; |
176 let Inst{31-27} = 0b11110; 177 let Inst{25} = 0; 178 let Inst{24-21} = opcod; 179 let Inst{20} = ?; // The S bit. 180 let Inst{19-16} = 0b1111; // Rn 181 let Inst{15} = 0; |
|
175 } 176 // register 177 def r : T2I<(outs GPR:$dst), (ins GPR:$src), IIC_iMOVr, 178 opc, ".w\t$dst, $src", | 182 } 183 // register 184 def r : T2I<(outs GPR:$dst), (ins GPR:$src), IIC_iMOVr, 185 opc, ".w\t$dst, $src", |
179 [(set GPR:$dst, (opnode GPR:$src))]>; | 186 [(set GPR:$dst, (opnode GPR:$src))]> { 187 let Inst{31-27} = 0b11101; 188 let Inst{26-25} = 0b01; 189 let Inst{24-21} = opcod; 190 let Inst{20} = ?; // The S bit. 191 let Inst{19-16} = 0b1111; // Rn 192 let Inst{14-12} = 0b000; // imm3 193 let Inst{7-6} = 0b00; // imm2 194 let Inst{5-4} = 0b00; // type 195 } |
180 // shifted register 181 def s : T2I<(outs GPR:$dst), (ins t2_so_reg:$src), IIC_iMOVsi, 182 opc, ".w\t$dst, $src", | 196 // shifted register 197 def s : T2I<(outs GPR:$dst), (ins t2_so_reg:$src), IIC_iMOVsi, 198 opc, ".w\t$dst, $src", |
183 [(set GPR:$dst, (opnode t2_so_reg:$src))]>; | 199 [(set GPR:$dst, (opnode t2_so_reg:$src))]> { 200 let Inst{31-27} = 0b11101; 201 let Inst{26-25} = 0b01; 202 let Inst{24-21} = opcod; 203 let Inst{20} = ?; // The S bit. 204 let Inst{19-16} = 0b1111; // Rn 205 } |
184} 185 186/// T2I_bin_irs - Defines a set of (op reg, {so_imm|r|so_reg}) patterns for a 187// binary operation that produces a value. These are predicable and can be 188/// changed to modify CPSR. | 206} 207 208/// T2I_bin_irs - Defines a set of (op reg, {so_imm|r|so_reg}) patterns for a 209// binary operation that produces a value. These are predicable and can be 210/// changed to modify CPSR. |
189multiclass T2I_bin_irs | 211multiclass T2I_bin_irs<bits<4> opcod, string opc, PatFrag opnode, |
190 bit Commutable = 0, string wide =""> { 191 // shifted imm 192 def ri : T2sI<(outs GPR:$dst), (ins GPR:$lhs, t2_so_imm:$rhs), IIC_iALUi, 193 opc, "\t$dst, $lhs, $rhs", | 212 bit Commutable = 0, string wide =""> { 213 // shifted imm 214 def ri : T2sI<(outs GPR:$dst), (ins GPR:$lhs, t2_so_imm:$rhs), IIC_iALUi, 215 opc, "\t$dst, $lhs, $rhs", |
194 [(set GPR:$dst, (opnode GPR:$lhs, t2_so_imm:$rhs))]>; | 216 [(set GPR:$dst, (opnode GPR:$lhs, t2_so_imm:$rhs))]> { 217 let Inst{31-27} = 0b11110; 218 let Inst{25} = 0; 219 let Inst{24-21} = opcod; 220 let Inst{20} = ?; // The S bit. 221 let Inst{15} = 0; 222 } |
195 // register 196 def rr : T2sI<(outs GPR:$dst), (ins GPR:$lhs, GPR:$rhs), IIC_iALUr, 197 opc, !strconcat(wide, "\t$dst, $lhs, $rhs"), 198 [(set GPR:$dst, (opnode GPR:$lhs, GPR:$rhs))]> { 199 let isCommutable = Commutable; | 223 // register 224 def rr : T2sI<(outs GPR:$dst), (ins GPR:$lhs, GPR:$rhs), IIC_iALUr, 225 opc, !strconcat(wide, "\t$dst, $lhs, $rhs"), 226 [(set GPR:$dst, (opnode GPR:$lhs, GPR:$rhs))]> { 227 let isCommutable = Commutable; |
228 let Inst{31-27} = 0b11101; 229 let Inst{26-25} = 0b01; 230 let Inst{24-21} = opcod; 231 let Inst{20} = ?; // The S bit. 232 let Inst{14-12} = 0b000; // imm3 233 let Inst{7-6} = 0b00; // imm2 234 let Inst{5-4} = 0b00; // type |
|
200 } 201 // shifted register 202 def rs : T2sI<(outs GPR:$dst), (ins GPR:$lhs, t2_so_reg:$rhs), IIC_iALUsi, 203 opc, !strconcat(wide, "\t$dst, $lhs, $rhs"), | 235 } 236 // shifted register 237 def rs : T2sI<(outs GPR:$dst), (ins GPR:$lhs, t2_so_reg:$rhs), IIC_iALUsi, 238 opc, !strconcat(wide, "\t$dst, $lhs, $rhs"), |
204 [(set GPR:$dst, (opnode GPR:$lhs, t2_so_reg:$rhs))]>; | 239 [(set GPR:$dst, (opnode GPR:$lhs, t2_so_reg:$rhs))]> { 240 let Inst{31-27} = 0b11101; 241 let Inst{26-25} = 0b01; 242 let Inst{24-21} = opcod; 243 let Inst{20} = ?; // The S bit. 244 } |
205} 206 207/// T2I_bin_w_irs - Same as T2I_bin_irs except these operations need 208// the ".w" prefix to indicate that they are wide. | 245} 246 247/// T2I_bin_w_irs - Same as T2I_bin_irs except these operations need 248// the ".w" prefix to indicate that they are wide. |
209multiclass T2I_bin_w_irs<string opc, PatFrag opnode, bit Commutable = 0> : 210 T2I_bin_irs<opc, opnode, Commutable, ".w">; | 249multiclass T2I_bin_w_irs<bits<4> opcod, string opc, PatFrag opnode, 250 bit Commutable = 0> : 251 T2I_bin_irs<opcod, opc, opnode, Commutable, ".w">; |
211 212/// T2I_rbin_is - Same as T2I_bin_irs except the order of operands are 213/// reversed. It doesn't define the 'rr' form since it's handled by its 214/// T2I_bin_irs counterpart. | 252 253/// T2I_rbin_is - Same as T2I_bin_irs except the order of operands are 254/// reversed. It doesn't define the 'rr' form since it's handled by its 255/// T2I_bin_irs counterpart. |
215multiclass T2I_rbin_is | 256multiclass T2I_rbin_is<bits<4> opcod, string opc, PatFrag opnode> { |
216 // shifted imm 217 def ri : T2I<(outs GPR:$dst), (ins GPR:$rhs, t2_so_imm:$lhs), IIC_iALUi, 218 opc, ".w\t$dst, $rhs, $lhs", | 257 // shifted imm 258 def ri : T2I<(outs GPR:$dst), (ins GPR:$rhs, t2_so_imm:$lhs), IIC_iALUi, 259 opc, ".w\t$dst, $rhs, $lhs", |
219 [(set GPR:$dst, (opnode t2_so_imm:$lhs, GPR:$rhs))]>; | 260 [(set GPR:$dst, (opnode t2_so_imm:$lhs, GPR:$rhs))]> { 261 let Inst{31-27} = 0b11110; 262 let Inst{25} = 0; 263 let Inst{24-21} = opcod; 264 let Inst{20} = 0; // The S bit. 265 let Inst{15} = 0; 266 } |
220 // shifted register 221 def rs : T2I<(outs GPR:$dst), (ins GPR:$rhs, t2_so_reg:$lhs), IIC_iALUsi, 222 opc, "\t$dst, $rhs, $lhs", | 267 // shifted register 268 def rs : T2I<(outs GPR:$dst), (ins GPR:$rhs, t2_so_reg:$lhs), IIC_iALUsi, 269 opc, "\t$dst, $rhs, $lhs", |
223 [(set GPR:$dst, (opnode t2_so_reg:$lhs, GPR:$rhs))]>; | 270 [(set GPR:$dst, (opnode t2_so_reg:$lhs, GPR:$rhs))]> { 271 let Inst{31-27} = 0b11101; 272 let Inst{26-25} = 0b01; 273 let Inst{24-21} = opcod; 274 let Inst{20} = 0; // The S bit. 275 } |
224} 225 226/// T2I_bin_s_irs - Similar to T2I_bin_irs except it sets the 's' bit so the 227/// instruction modifies the CPSR register. 228let Defs = [CPSR] in { | 276} 277 278/// T2I_bin_s_irs - Similar to T2I_bin_irs except it sets the 's' bit so the 279/// instruction modifies the CPSR register. 280let Defs = [CPSR] in { |
229multiclass T2I_bin_s_irs<string opc, PatFrag opnode, bit Commutable = 0> { | 281multiclass T2I_bin_s_irs<bits<4> opcod, string opc, PatFrag opnode, 282 bit Commutable = 0> { |
230 // shifted imm 231 def ri : T2I<(outs GPR:$dst), (ins GPR:$lhs, t2_so_imm:$rhs), IIC_iALUi, 232 !strconcat(opc, "s"), ".w\t$dst, $lhs, $rhs", | 283 // shifted imm 284 def ri : T2I<(outs GPR:$dst), (ins GPR:$lhs, t2_so_imm:$rhs), IIC_iALUi, 285 !strconcat(opc, "s"), ".w\t$dst, $lhs, $rhs", |
233 [(set GPR:$dst, (opnode GPR:$lhs, t2_so_imm:$rhs))]>; | 286 [(set GPR:$dst, (opnode GPR:$lhs, t2_so_imm:$rhs))]> { 287 let Inst{31-27} = 0b11110; 288 let Inst{25} = 0; 289 let Inst{24-21} = opcod; 290 let Inst{20} = 1; // The S bit. 291 let Inst{15} = 0; 292 } |
234 // register 235 def rr : T2I<(outs GPR:$dst), (ins GPR:$lhs, GPR:$rhs), IIC_iALUr, 236 !strconcat(opc, "s"), ".w\t$dst, $lhs, $rhs", 237 [(set GPR:$dst, (opnode GPR:$lhs, GPR:$rhs))]> { 238 let isCommutable = Commutable; | 293 // register 294 def rr : T2I<(outs GPR:$dst), (ins GPR:$lhs, GPR:$rhs), IIC_iALUr, 295 !strconcat(opc, "s"), ".w\t$dst, $lhs, $rhs", 296 [(set GPR:$dst, (opnode GPR:$lhs, GPR:$rhs))]> { 297 let isCommutable = Commutable; |
298 let Inst{31-27} = 0b11101; 299 let Inst{26-25} = 0b01; 300 let Inst{24-21} = opcod; 301 let Inst{20} = 1; // The S bit. 302 let Inst{14-12} = 0b000; // imm3 303 let Inst{7-6} = 0b00; // imm2 304 let Inst{5-4} = 0b00; // type |
|
239 } 240 // shifted register 241 def rs : T2I<(outs GPR:$dst), (ins GPR:$lhs, t2_so_reg:$rhs), IIC_iALUsi, 242 !strconcat(opc, "s"), ".w\t$dst, $lhs, $rhs", | 305 } 306 // shifted register 307 def rs : T2I<(outs GPR:$dst), (ins GPR:$lhs, t2_so_reg:$rhs), IIC_iALUsi, 308 !strconcat(opc, "s"), ".w\t$dst, $lhs, $rhs", |
243 [(set GPR:$dst, (opnode GPR:$lhs, t2_so_reg:$rhs))]>; | 309 [(set GPR:$dst, (opnode GPR:$lhs, t2_so_reg:$rhs))]> { 310 let Inst{31-27} = 0b11101; 311 let Inst{26-25} = 0b01; 312 let Inst{24-21} = opcod; 313 let Inst{20} = 1; // The S bit. 314 } |
244} 245} 246 247/// T2I_bin_ii12rs - Defines a set of (op reg, {so_imm|imm0_4095|r|so_reg}) 248/// patterns for a binary operation that produces a value. | 315} 316} 317 318/// T2I_bin_ii12rs - Defines a set of (op reg, {so_imm|imm0_4095|r|so_reg}) 319/// patterns for a binary operation that produces a value. |
249multiclass T2I_bin_ii12rs<string opc, PatFrag opnode, bit Commutable = 0> { | 320multiclass T2I_bin_ii12rs<bits<3> op23_21, string opc, PatFrag opnode, 321 bit Commutable = 0> { |
250 // shifted imm 251 def ri : T2sI<(outs GPR:$dst), (ins GPR:$lhs, t2_so_imm:$rhs), IIC_iALUi, 252 opc, ".w\t$dst, $lhs, $rhs", | 322 // shifted imm 323 def ri : T2sI<(outs GPR:$dst), (ins GPR:$lhs, t2_so_imm:$rhs), IIC_iALUi, 324 opc, ".w\t$dst, $lhs, $rhs", |
253 [(set GPR:$dst, (opnode GPR:$lhs, t2_so_imm:$rhs))]>; | 325 [(set GPR:$dst, (opnode GPR:$lhs, t2_so_imm:$rhs))]> { 326 let Inst{31-27} = 0b11110; 327 let Inst{25} = 0; 328 let Inst{24} = 1; 329 let Inst{23-21} = op23_21; 330 let Inst{20} = 0; // The S bit. 331 let Inst{15} = 0; 332 } |
254 // 12-bit imm 255 def ri12 : T2sI<(outs GPR:$dst), (ins GPR:$lhs, imm0_4095:$rhs), IIC_iALUi, 256 !strconcat(opc, "w"), "\t$dst, $lhs, $rhs", | 333 // 12-bit imm 334 def ri12 : T2sI<(outs GPR:$dst), (ins GPR:$lhs, imm0_4095:$rhs), IIC_iALUi, 335 !strconcat(opc, "w"), "\t$dst, $lhs, $rhs", |
257 [(set GPR:$dst, (opnode GPR:$lhs, imm0_4095:$rhs))]>; | 336 [(set GPR:$dst, (opnode GPR:$lhs, imm0_4095:$rhs))]> { 337 let Inst{31-27} = 0b11110; 338 let Inst{25} = 1; 339 let Inst{24} = 0; 340 let Inst{23-21} = op23_21; 341 let Inst{20} = 0; // The S bit. 342 let Inst{15} = 0; 343 } |
258 // register 259 def rr : T2sI<(outs GPR:$dst), (ins GPR:$lhs, GPR:$rhs), IIC_iALUr, 260 opc, ".w\t$dst, $lhs, $rhs", 261 [(set GPR:$dst, (opnode GPR:$lhs, GPR:$rhs))]> { 262 let isCommutable = Commutable; | 344 // register 345 def rr : T2sI<(outs GPR:$dst), (ins GPR:$lhs, GPR:$rhs), IIC_iALUr, 346 opc, ".w\t$dst, $lhs, $rhs", 347 [(set GPR:$dst, (opnode GPR:$lhs, GPR:$rhs))]> { 348 let isCommutable = Commutable; |
349 let Inst{31-27} = 0b11101; 350 let Inst{26-25} = 0b01; 351 let Inst{24} = 1; 352 let Inst{23-21} = op23_21; 353 let Inst{20} = 0; // The S bit. 354 let Inst{14-12} = 0b000; // imm3 355 let Inst{7-6} = 0b00; // imm2 356 let Inst{5-4} = 0b00; // type |
|
263 } 264 // shifted register 265 def rs : T2sI<(outs GPR:$dst), (ins GPR:$lhs, t2_so_reg:$rhs), IIC_iALUsi, 266 opc, ".w\t$dst, $lhs, $rhs", | 357 } 358 // shifted register 359 def rs : T2sI<(outs GPR:$dst), (ins GPR:$lhs, t2_so_reg:$rhs), IIC_iALUsi, 360 opc, ".w\t$dst, $lhs, $rhs", |
267 [(set GPR:$dst, (opnode GPR:$lhs, t2_so_reg:$rhs))]>; | 361 [(set GPR:$dst, (opnode GPR:$lhs, t2_so_reg:$rhs))]> { 362 let Inst{31-27} = 0b11101; 363 let Inst{24} = 1; 364 let Inst{26-25} = 0b01; 365 let Inst{23-21} = op23_21; 366 let Inst{20} = 0; // The S bit. 367 } |
268} 269 270/// T2I_adde_sube_irs - Defines a set of (op reg, {so_imm|r|so_reg}) patterns 271/// for a binary operation that produces a value and use and define the carry 272/// bit. It's not predicable. 273let Uses = [CPSR] in { | 368} 369 370/// T2I_adde_sube_irs - Defines a set of (op reg, {so_imm|r|so_reg}) patterns 371/// for a binary operation that produces a value and use and define the carry 372/// bit. It's not predicable. 373let Uses = [CPSR] in { |
274multiclass T2I_adde_sube_irs | 374multiclass T2I_adde_sube_irs<bits<4> opcod, string opc, PatFrag opnode, bit Commutable = 0> { |
275 // shifted imm 276 def ri : T2sI<(outs GPR:$dst), (ins GPR:$lhs, t2_so_imm:$rhs), IIC_iALUi, 277 opc, "\t$dst, $lhs, $rhs", 278 [(set GPR:$dst, (opnode GPR:$lhs, t2_so_imm:$rhs))]>, | 375 // shifted imm 376 def ri : T2sI<(outs GPR:$dst), (ins GPR:$lhs, t2_so_imm:$rhs), IIC_iALUi, 377 opc, "\t$dst, $lhs, $rhs", 378 [(set GPR:$dst, (opnode GPR:$lhs, t2_so_imm:$rhs))]>, |
279 Requires<[IsThumb2, CarryDefIsUnused]>; | 379 Requires<[IsThumb2, CarryDefIsUnused]> { 380 let Inst{31-27} = 0b11110; 381 let Inst{25} = 0; 382 let Inst{24-21} = opcod; 383 let Inst{20} = 0; // The S bit. 384 let Inst{15} = 0; 385 } |
280 // register 281 def rr : T2sI<(outs GPR:$dst), (ins GPR:$lhs, GPR:$rhs), IIC_iALUr, 282 opc, ".w\t$dst, $lhs, $rhs", 283 [(set GPR:$dst, (opnode GPR:$lhs, GPR:$rhs))]>, 284 Requires<[IsThumb2, CarryDefIsUnused]> { 285 let isCommutable = Commutable; | 386 // register 387 def rr : T2sI<(outs GPR:$dst), (ins GPR:$lhs, GPR:$rhs), IIC_iALUr, 388 opc, ".w\t$dst, $lhs, $rhs", 389 [(set GPR:$dst, (opnode GPR:$lhs, GPR:$rhs))]>, 390 Requires<[IsThumb2, CarryDefIsUnused]> { 391 let isCommutable = Commutable; |
392 let Inst{31-27} = 0b11101; 393 let Inst{26-25} = 0b01; 394 let Inst{24-21} = opcod; 395 let Inst{20} = 0; // The S bit. 396 let Inst{14-12} = 0b000; // imm3 397 let Inst{7-6} = 0b00; // imm2 398 let Inst{5-4} = 0b00; // type |
|
286 } 287 // shifted register 288 def rs : T2sI<(outs GPR:$dst), (ins GPR:$lhs, t2_so_reg:$rhs), IIC_iALUsi, 289 opc, ".w\t$dst, $lhs, $rhs", 290 [(set GPR:$dst, (opnode GPR:$lhs, t2_so_reg:$rhs))]>, | 399 } 400 // shifted register 401 def rs : T2sI<(outs GPR:$dst), (ins GPR:$lhs, t2_so_reg:$rhs), IIC_iALUsi, 402 opc, ".w\t$dst, $lhs, $rhs", 403 [(set GPR:$dst, (opnode GPR:$lhs, t2_so_reg:$rhs))]>, |
291 Requires<[IsThumb2, CarryDefIsUnused]>; | 404 Requires<[IsThumb2, CarryDefIsUnused]> { 405 let Inst{31-27} = 0b11101; 406 let Inst{26-25} = 0b01; 407 let Inst{24-21} = opcod; 408 let Inst{20} = 0; // The S bit. 409 } |
292 // Carry setting variants 293 // shifted imm 294 def Sri : T2XI<(outs GPR:$dst), (ins GPR:$lhs, t2_so_imm:$rhs), IIC_iALUi, 295 !strconcat(opc, "s\t$dst, $lhs, $rhs"), 296 [(set GPR:$dst, (opnode GPR:$lhs, t2_so_imm:$rhs))]>, 297 Requires<[IsThumb2, CarryDefIsUsed]> { | 410 // Carry setting variants 411 // shifted imm 412 def Sri : T2XI<(outs GPR:$dst), (ins GPR:$lhs, t2_so_imm:$rhs), IIC_iALUi, 413 !strconcat(opc, "s\t$dst, $lhs, $rhs"), 414 [(set GPR:$dst, (opnode GPR:$lhs, t2_so_imm:$rhs))]>, 415 Requires<[IsThumb2, CarryDefIsUsed]> { |
298 let Defs = [CPSR]; 299 } | 416 let Defs = [CPSR]; 417 let Inst{31-27} = 0b11110; 418 let Inst{25} = 0; 419 let Inst{24-21} = opcod; 420 let Inst{20} = 1; // The S bit. 421 let Inst{15} = 0; 422 } |
300 // register 301 def Srr : T2XI<(outs GPR:$dst), (ins GPR:$lhs, GPR:$rhs), IIC_iALUr, 302 !strconcat(opc, "s.w\t$dst, $lhs, $rhs"), 303 [(set GPR:$dst, (opnode GPR:$lhs, GPR:$rhs))]>, 304 Requires<[IsThumb2, CarryDefIsUsed]> { | 423 // register 424 def Srr : T2XI<(outs GPR:$dst), (ins GPR:$lhs, GPR:$rhs), IIC_iALUr, 425 !strconcat(opc, "s.w\t$dst, $lhs, $rhs"), 426 [(set GPR:$dst, (opnode GPR:$lhs, GPR:$rhs))]>, 427 Requires<[IsThumb2, CarryDefIsUsed]> { |
305 let Defs = [CPSR]; 306 let isCommutable = Commutable; | 428 let Defs = [CPSR]; 429 let isCommutable = Commutable; 430 let Inst{31-27} = 0b11101; 431 let Inst{26-25} = 0b01; 432 let Inst{24-21} = opcod; 433 let Inst{20} = 1; // The S bit. 434 let Inst{14-12} = 0b000; // imm3 435 let Inst{7-6} = 0b00; // imm2 436 let Inst{5-4} = 0b00; // type |
307 } 308 // shifted register 309 def Srs : T2XI<(outs GPR:$dst), (ins GPR:$lhs, t2_so_reg:$rhs), IIC_iALUsi, 310 !strconcat(opc, "s.w\t$dst, $lhs, $rhs"), 311 [(set GPR:$dst, (opnode GPR:$lhs, t2_so_reg:$rhs))]>, 312 Requires<[IsThumb2, CarryDefIsUsed]> { | 437 } 438 // shifted register 439 def Srs : T2XI<(outs GPR:$dst), (ins GPR:$lhs, t2_so_reg:$rhs), IIC_iALUsi, 440 !strconcat(opc, "s.w\t$dst, $lhs, $rhs"), 441 [(set GPR:$dst, (opnode GPR:$lhs, t2_so_reg:$rhs))]>, 442 Requires<[IsThumb2, CarryDefIsUsed]> { |
313 let Defs = [CPSR]; | 443 let Defs = [CPSR]; 444 let Inst{31-27} = 0b11101; 445 let Inst{26-25} = 0b01; 446 let Inst{24-21} = opcod; 447 let Inst{20} = 1; // The S bit. |
314 } 315} 316} 317 318/// T2I_rbin_s_is - Same as T2I_rbin_is except sets 's' bit. 319let Defs = [CPSR] in { | 448 } 449} 450} 451 452/// T2I_rbin_s_is - Same as T2I_rbin_is except sets 's' bit. 453let Defs = [CPSR] in { |
320multiclass T2I_rbin_s_is | 454multiclass T2I_rbin_s_is<bits<4> opcod, string opc, PatFrag opnode> { |
321 // shifted imm 322 def ri : T2XI<(outs GPR:$dst), (ins GPR:$rhs, t2_so_imm:$lhs, cc_out:$s), 323 IIC_iALUi, 324 !strconcat(opc, "${s}.w\t$dst, $rhs, $lhs"), | 455 // shifted imm 456 def ri : T2XI<(outs GPR:$dst), (ins GPR:$rhs, t2_so_imm:$lhs, cc_out:$s), 457 IIC_iALUi, 458 !strconcat(opc, "${s}.w\t$dst, $rhs, $lhs"), |
325 [(set GPR:$dst, (opnode t2_so_imm:$lhs, GPR:$rhs))]>; | 459 [(set GPR:$dst, (opnode t2_so_imm:$lhs, GPR:$rhs))]> { 460 let Inst{31-27} = 0b11110; 461 let Inst{25} = 0; 462 let Inst{24-21} = opcod; 463 let Inst{20} = 1; // The S bit. 464 let Inst{15} = 0; 465 } |
326 // shifted register 327 def rs : T2XI<(outs GPR:$dst), (ins GPR:$rhs, t2_so_reg:$lhs, cc_out:$s), 328 IIC_iALUsi, 329 !strconcat(opc, "${s}\t$dst, $rhs, $lhs"), | 466 // shifted register 467 def rs : T2XI<(outs GPR:$dst), (ins GPR:$rhs, t2_so_reg:$lhs, cc_out:$s), 468 IIC_iALUsi, 469 !strconcat(opc, "${s}\t$dst, $rhs, $lhs"), |
330 [(set GPR:$dst, (opnode t2_so_reg:$lhs, GPR:$rhs))]>; | 470 [(set GPR:$dst, (opnode t2_so_reg:$lhs, GPR:$rhs))]> { 471 let Inst{31-27} = 0b11101; 472 let Inst{26-25} = 0b01; 473 let Inst{24-21} = opcod; 474 let Inst{20} = 1; // The S bit. 475 } |
331} 332} 333 334/// T2I_sh_ir - Defines a set of (op reg, {so_imm|r}) patterns for a shift / 335// rotate operation that produces a value. | 476} 477} 478 479/// T2I_sh_ir - Defines a set of (op reg, {so_imm|r}) patterns for a shift / 480// rotate operation that produces a value. |
336multiclass T2I_sh_ir | 481multiclass T2I_sh_ir<bits<2> opcod, string opc, PatFrag opnode> { |
337 // 5-bit imm 338 def ri : T2sI<(outs GPR:$dst), (ins GPR:$lhs, i32imm:$rhs), IIC_iMOVsi, 339 opc, ".w\t$dst, $lhs, $rhs", | 482 // 5-bit imm 483 def ri : T2sI<(outs GPR:$dst), (ins GPR:$lhs, i32imm:$rhs), IIC_iMOVsi, 484 opc, ".w\t$dst, $lhs, $rhs", |
340 [(set GPR:$dst, (opnode GPR:$lhs, imm1_31:$rhs))]>; | 485 [(set GPR:$dst, (opnode GPR:$lhs, imm1_31:$rhs))]> { 486 let Inst{31-27} = 0b11101; 487 let Inst{26-21} = 0b010010; 488 let Inst{19-16} = 0b1111; // Rn 489 let Inst{5-4} = opcod; 490 } |
341 // register 342 def rr : T2sI<(outs GPR:$dst), (ins GPR:$lhs, GPR:$rhs), IIC_iMOVsr, 343 opc, ".w\t$dst, $lhs, $rhs", | 491 // register 492 def rr : T2sI<(outs GPR:$dst), (ins GPR:$lhs, GPR:$rhs), IIC_iMOVsr, 493 opc, ".w\t$dst, $lhs, $rhs", |
344 [(set GPR:$dst, (opnode GPR:$lhs, GPR:$rhs))]>; | 494 [(set GPR:$dst, (opnode GPR:$lhs, GPR:$rhs))]> { 495 let Inst{31-27} = 0b11111; 496 let Inst{26-23} = 0b0100; 497 let Inst{22-21} = opcod; 498 let Inst{15-12} = 0b1111; 499 let Inst{7-4} = 0b0000; 500 } |
345} 346 | 501} 502 |
347/// T2I_cmp_is - Defines a set of (op r, {so_imm|r|so_reg}) cmp / test | 503/// T2I_cmp_irs - Defines a set of (op r, {so_imm|r|so_reg}) cmp / test |
348/// patterns. Similar to T2I_bin_irs except the instruction does not produce 349/// a explicit result, only implicitly set CPSR. 350let Defs = [CPSR] in { | 504/// patterns. Similar to T2I_bin_irs except the instruction does not produce 505/// a explicit result, only implicitly set CPSR. 506let Defs = [CPSR] in { |
351multiclass T2I_cmp_is<string opc, PatFrag opnode> { | 507multiclass T2I_cmp_irs<bits<4> opcod, string opc, PatFrag opnode> { |
352 // shifted imm 353 def ri : T2I<(outs), (ins GPR:$lhs, t2_so_imm:$rhs), IIC_iCMPi, 354 opc, ".w\t$lhs, $rhs", | 508 // shifted imm 509 def ri : T2I<(outs), (ins GPR:$lhs, t2_so_imm:$rhs), IIC_iCMPi, 510 opc, ".w\t$lhs, $rhs", |
355 [(opnode GPR:$lhs, t2_so_imm:$rhs)]>; | 511 [(opnode GPR:$lhs, t2_so_imm:$rhs)]> { 512 let Inst{31-27} = 0b11110; 513 let Inst{25} = 0; 514 let Inst{24-21} = opcod; 515 let Inst{20} = 1; // The S bit. 516 let Inst{15} = 0; 517 let Inst{11-8} = 0b1111; // Rd 518 } |
356 // register 357 def rr : T2I<(outs), (ins GPR:$lhs, GPR:$rhs), IIC_iCMPr, 358 opc, ".w\t$lhs, $rhs", | 519 // register 520 def rr : T2I<(outs), (ins GPR:$lhs, GPR:$rhs), IIC_iCMPr, 521 opc, ".w\t$lhs, $rhs", |
359 [(opnode GPR:$lhs, GPR:$rhs)]>; | 522 [(opnode GPR:$lhs, GPR:$rhs)]> { 523 let Inst{31-27} = 0b11101; 524 let Inst{26-25} = 0b01; 525 let Inst{24-21} = opcod; 526 let Inst{20} = 1; // The S bit. 527 let Inst{14-12} = 0b000; // imm3 528 let Inst{11-8} = 0b1111; // Rd 529 let Inst{7-6} = 0b00; // imm2 530 let Inst{5-4} = 0b00; // type 531 } |
360 // shifted register 361 def rs : T2I<(outs), (ins GPR:$lhs, t2_so_reg:$rhs), IIC_iCMPsi, 362 opc, ".w\t$lhs, $rhs", | 532 // shifted register 533 def rs : T2I<(outs), (ins GPR:$lhs, t2_so_reg:$rhs), IIC_iCMPsi, 534 opc, ".w\t$lhs, $rhs", |
363 [(opnode GPR:$lhs, t2_so_reg:$rhs)]>; | 535 [(opnode GPR:$lhs, t2_so_reg:$rhs)]> { 536 let Inst{31-27} = 0b11101; 537 let Inst{26-25} = 0b01; 538 let Inst{24-21} = opcod; 539 let Inst{20} = 1; // The S bit. 540 let Inst{11-8} = 0b1111; // Rd 541 } |
364} 365} 366 367/// T2I_ld - Defines a set of (op r, {imm12|imm8|so_reg}) load patterns. | 542} 543} 544 545/// T2I_ld - Defines a set of (op r, {imm12|imm8|so_reg}) load patterns. |
368multiclass T2I_ld | 546multiclass T2I_ld<bit signed, bits<2> opcod, string opc, PatFrag opnode> { |
369 def i12 : T2Ii12<(outs GPR:$dst), (ins t2addrmode_imm12:$addr), IIC_iLoadi, 370 opc, ".w\t$dst, $addr", | 547 def i12 : T2Ii12<(outs GPR:$dst), (ins t2addrmode_imm12:$addr), IIC_iLoadi, 548 opc, ".w\t$dst, $addr", |
371 [(set GPR:$dst, (opnode t2addrmode_imm12:$addr))]>; | 549 [(set GPR:$dst, (opnode t2addrmode_imm12:$addr))]> { 550 let Inst{31-27} = 0b11111; 551 let Inst{26-25} = 0b00; 552 let Inst{24} = signed; 553 let Inst{23} = 1; 554 let Inst{22-21} = opcod; 555 let Inst{20} = 1; // load 556 } |
372 def i8 : T2Ii8 <(outs GPR:$dst), (ins t2addrmode_imm8:$addr), IIC_iLoadi, 373 opc, "\t$dst, $addr", | 557 def i8 : T2Ii8 <(outs GPR:$dst), (ins t2addrmode_imm8:$addr), IIC_iLoadi, 558 opc, "\t$dst, $addr", |
374 [(set GPR:$dst, (opnode t2addrmode_imm8:$addr))]>; | 559 [(set GPR:$dst, (opnode t2addrmode_imm8:$addr))]> { 560 let Inst{31-27} = 0b11111; 561 let Inst{26-25} = 0b00; 562 let Inst{24} = signed; 563 let Inst{23} = 0; 564 let Inst{22-21} = opcod; 565 let Inst{20} = 1; // load 566 let Inst{11} = 1; 567 // Offset: index==TRUE, wback==FALSE 568 let Inst{10} = 1; // The P bit. 569 let Inst{8} = 0; // The W bit. 570 } |
375 def s : T2Iso <(outs GPR:$dst), (ins t2addrmode_so_reg:$addr), IIC_iLoadr, 376 opc, ".w\t$dst, $addr", | 571 def s : T2Iso <(outs GPR:$dst), (ins t2addrmode_so_reg:$addr), IIC_iLoadr, 572 opc, ".w\t$dst, $addr", |
377 [(set GPR:$dst, (opnode t2addrmode_so_reg:$addr))]>; | 573 [(set GPR:$dst, (opnode t2addrmode_so_reg:$addr))]> { 574 let Inst{31-27} = 0b11111; 575 let Inst{26-25} = 0b00; 576 let Inst{24} = signed; 577 let Inst{23} = 0; 578 let Inst{22-21} = opcod; 579 let Inst{20} = 1; // load 580 let Inst{11-6} = 0b000000; 581 } |
378 def pci : T2Ipc <(outs GPR:$dst), (ins i32imm:$addr), IIC_iLoadi, 379 opc, ".w\t$dst, $addr", 380 [(set GPR:$dst, (opnode (ARMWrapper tconstpool:$addr)))]> { 381 let isReMaterializable = 1; | 582 def pci : T2Ipc <(outs GPR:$dst), (ins i32imm:$addr), IIC_iLoadi, 583 opc, ".w\t$dst, $addr", 584 [(set GPR:$dst, (opnode (ARMWrapper tconstpool:$addr)))]> { 585 let isReMaterializable = 1; |
586 let Inst{31-27} = 0b11111; 587 let Inst{26-25} = 0b00; 588 let Inst{24} = signed; 589 let Inst{23} = ?; // add = (U == '1') 590 let Inst{22-21} = opcod; 591 let Inst{20} = 1; // load 592 let Inst{19-16} = 0b1111; // Rn |
|
382 } 383} 384 385/// T2I_st - Defines a set of (op r, {imm12|imm8|so_reg}) store patterns. | 593 } 594} 595 596/// T2I_st - Defines a set of (op r, {imm12|imm8|so_reg}) store patterns. |
386multiclass T2I_st | 597multiclass T2I_st<bits<2> opcod, string opc, PatFrag opnode> { |
387 def i12 : T2Ii12<(outs), (ins GPR:$src, t2addrmode_imm12:$addr), IIC_iStorei, 388 opc, ".w\t$src, $addr", | 598 def i12 : T2Ii12<(outs), (ins GPR:$src, t2addrmode_imm12:$addr), IIC_iStorei, 599 opc, ".w\t$src, $addr", |
389 [(opnode GPR:$src, t2addrmode_imm12:$addr)]>; | 600 [(opnode GPR:$src, t2addrmode_imm12:$addr)]> { 601 let Inst{31-27} = 0b11111; 602 let Inst{26-23} = 0b0001; 603 let Inst{22-21} = opcod; 604 let Inst{20} = 0; // !load 605 } |
390 def i8 : T2Ii8 <(outs), (ins GPR:$src, t2addrmode_imm8:$addr), IIC_iStorei, 391 opc, "\t$src, $addr", | 606 def i8 : T2Ii8 <(outs), (ins GPR:$src, t2addrmode_imm8:$addr), IIC_iStorei, 607 opc, "\t$src, $addr", |
392 [(opnode GPR:$src, t2addrmode_imm8:$addr)]>; | 608 [(opnode GPR:$src, t2addrmode_imm8:$addr)]> { 609 let Inst{31-27} = 0b11111; 610 let Inst{26-23} = 0b0000; 611 let Inst{22-21} = opcod; 612 let Inst{20} = 0; // !load 613 let Inst{11} = 1; 614 // Offset: index==TRUE, wback==FALSE 615 let Inst{10} = 1; // The P bit. 616 let Inst{8} = 0; // The W bit. 617 } |
393 def s : T2Iso <(outs), (ins GPR:$src, t2addrmode_so_reg:$addr), IIC_iStorer, 394 opc, ".w\t$src, $addr", | 618 def s : T2Iso <(outs), (ins GPR:$src, t2addrmode_so_reg:$addr), IIC_iStorer, 619 opc, ".w\t$src, $addr", |
395 [(opnode GPR:$src, t2addrmode_so_reg:$addr)]>; | 620 [(opnode GPR:$src, t2addrmode_so_reg:$addr)]> { 621 let Inst{31-27} = 0b11111; 622 let Inst{26-23} = 0b0000; 623 let Inst{22-21} = opcod; 624 let Inst{20} = 0; // !load 625 let Inst{11-6} = 0b000000; 626 } |
396} 397 398/// T2I_picld - Defines the PIC load pattern. 399class T2I_picld<string opc, PatFrag opnode> : 400 T2I<(outs GPR:$dst), (ins addrmodepc:$addr), IIC_iLoadi, 401 !strconcat("\n${addr:label}:\n\t", opc), "\t$dst, $addr", 402 [(set GPR:$dst, (opnode addrmodepc:$addr))]>; 403 404/// T2I_picst - Defines the PIC store pattern. 405class T2I_picst<string opc, PatFrag opnode> : 406 T2I<(outs), (ins GPR:$src, addrmodepc:$addr), IIC_iStorer, 407 !strconcat("\n${addr:label}:\n\t", opc), "\t$src, $addr", 408 [(opnode GPR:$src, addrmodepc:$addr)]>; 409 410 411/// T2I_unary_rrot - A unary operation with two forms: one whose operand is a 412/// register and one whose operand is a register rotated by 8/16/24. | 627} 628 629/// T2I_picld - Defines the PIC load pattern. 630class T2I_picld<string opc, PatFrag opnode> : 631 T2I<(outs GPR:$dst), (ins addrmodepc:$addr), IIC_iLoadi, 632 !strconcat("\n${addr:label}:\n\t", opc), "\t$dst, $addr", 633 [(set GPR:$dst, (opnode addrmodepc:$addr))]>; 634 635/// T2I_picst - Defines the PIC store pattern. 636class T2I_picst<string opc, PatFrag opnode> : 637 T2I<(outs), (ins GPR:$src, addrmodepc:$addr), IIC_iStorer, 638 !strconcat("\n${addr:label}:\n\t", opc), "\t$src, $addr", 639 [(opnode GPR:$src, addrmodepc:$addr)]>; 640 641 642/// T2I_unary_rrot - A unary operation with two forms: one whose operand is a 643/// register and one whose operand is a register rotated by 8/16/24. |
413multiclass T2I_unary_rrot | 644multiclass T2I_unary_rrot<bits<3> opcod, string opc, PatFrag opnode> { |
414 def r : T2I<(outs GPR:$dst), (ins GPR:$src), IIC_iUNAr, 415 opc, ".w\t$dst, $src", | 645 def r : T2I<(outs GPR:$dst), (ins GPR:$src), IIC_iUNAr, 646 opc, ".w\t$dst, $src", |
416 [(set GPR:$dst, (opnode GPR:$src))]>; | 647 [(set GPR:$dst, (opnode GPR:$src))]> { 648 let Inst{31-27} = 0b11111; 649 let Inst{26-23} = 0b0100; 650 let Inst{22-20} = opcod; 651 let Inst{19-16} = 0b1111; // Rn 652 let Inst{15-12} = 0b1111; 653 let Inst{7} = 1; 654 let Inst{5-4} = 0b00; // rotate 655 } |
417 def r_rot : T2I<(outs GPR:$dst), (ins GPR:$src, i32imm:$rot), IIC_iUNAsi, 418 opc, ".w\t$dst, $src, ror $rot", | 656 def r_rot : T2I<(outs GPR:$dst), (ins GPR:$src, i32imm:$rot), IIC_iUNAsi, 657 opc, ".w\t$dst, $src, ror $rot", |
419 [(set GPR:$dst, (opnode (rotr GPR:$src, rot_imm:$rot)))]>; | 658 [(set GPR:$dst, (opnode (rotr GPR:$src, rot_imm:$rot)))]> { 659 let Inst{31-27} = 0b11111; 660 let Inst{26-23} = 0b0100; 661 let Inst{22-20} = opcod; 662 let Inst{19-16} = 0b1111; // Rn 663 let Inst{15-12} = 0b1111; 664 let Inst{7} = 1; 665 let Inst{5-4} = {?,?}; // rotate 666 } |
420} 421 422/// T2I_bin_rrot - A binary operation with two forms: one whose operand is a 423/// register and one whose operand is a register rotated by 8/16/24. | 667} 668 669/// T2I_bin_rrot - A binary operation with two forms: one whose operand is a 670/// register and one whose operand is a register rotated by 8/16/24. |
424multiclass T2I_bin_rrot | 671multiclass T2I_bin_rrot<bits<3> opcod, string opc, PatFrag opnode> { |
425 def rr : T2I<(outs GPR:$dst), (ins GPR:$LHS, GPR:$RHS), IIC_iALUr, 426 opc, "\t$dst, $LHS, $RHS", | 672 def rr : T2I<(outs GPR:$dst), (ins GPR:$LHS, GPR:$RHS), IIC_iALUr, 673 opc, "\t$dst, $LHS, $RHS", |
427 [(set GPR:$dst, (opnode GPR:$LHS, GPR:$RHS))]>; | 674 [(set GPR:$dst, (opnode GPR:$LHS, GPR:$RHS))]> { 675 let Inst{31-27} = 0b11111; 676 let Inst{26-23} = 0b0100; 677 let Inst{22-20} = opcod; 678 let Inst{15-12} = 0b1111; 679 let Inst{7} = 1; 680 let Inst{5-4} = 0b00; // rotate 681 } |
428 def rr_rot : T2I<(outs GPR:$dst), (ins GPR:$LHS, GPR:$RHS, i32imm:$rot), 429 IIC_iALUsr, opc, "\t$dst, $LHS, $RHS, ror $rot", 430 [(set GPR:$dst, (opnode GPR:$LHS, | 682 def rr_rot : T2I<(outs GPR:$dst), (ins GPR:$LHS, GPR:$RHS, i32imm:$rot), 683 IIC_iALUsr, opc, "\t$dst, $LHS, $RHS, ror $rot", 684 [(set GPR:$dst, (opnode GPR:$LHS, |
431 (rotr GPR:$RHS, rot_imm:$rot)))]>; | 685 (rotr GPR:$RHS, rot_imm:$rot)))]> { 686 let Inst{31-27} = 0b11111; 687 let Inst{26-23} = 0b0100; 688 let Inst{22-20} = opcod; 689 let Inst{15-12} = 0b1111; 690 let Inst{7} = 1; 691 let Inst{5-4} = {?,?}; // rotate 692 } |
432} 433 434//===----------------------------------------------------------------------===// 435// Instructions 436//===----------------------------------------------------------------------===// 437 438//===----------------------------------------------------------------------===// 439// Miscellaneous Instructions. 440// 441 442// LEApcrel - Load a pc-relative address into a register without offending the 443// assembler. 444def t2LEApcrel : T2XI<(outs GPR:$dst), (ins i32imm:$label, pred:$p), IIC_iALUi, | 693} 694 695//===----------------------------------------------------------------------===// 696// Instructions 697//===----------------------------------------------------------------------===// 698 699//===----------------------------------------------------------------------===// 700// Miscellaneous Instructions. 701// 702 703// LEApcrel - Load a pc-relative address into a register without offending the 704// assembler. 705def t2LEApcrel : T2XI<(outs GPR:$dst), (ins i32imm:$label, pred:$p), IIC_iALUi, |
445 "adr$p.w\t$dst, #$label", []>; 446 | 706 "adr$p.w\t$dst, #$label", []> { 707 let Inst{31-27} = 0b11110; 708 let Inst{25-24} = 0b10; 709 // Inst{23:21} = '11' (add = FALSE) or '00' (add = TRUE) 710 let Inst{22} = 0; 711 let Inst{20} = 0; 712 let Inst{19-16} = 0b1111; // Rn 713 let Inst{15} = 0; 714} |
447def t2LEApcrelJT : T2XI<(outs GPR:$dst), 448 (ins i32imm:$label, nohash_imm:$id, pred:$p), IIC_iALUi, | 715def t2LEApcrelJT : T2XI<(outs GPR:$dst), 716 (ins i32imm:$label, nohash_imm:$id, pred:$p), IIC_iALUi, |
449 "adr$p.w\t$dst, #${label}_${id}", []>; | 717 "adr$p.w\t$dst, #${label}_${id}", []> { 718 let Inst{31-27} = 0b11110; 719 let Inst{25-24} = 0b10; 720 // Inst{23:21} = '11' (add = FALSE) or '00' (add = TRUE) 721 let Inst{22} = 0; 722 let Inst{20} = 0; 723 let Inst{19-16} = 0b1111; // Rn 724 let Inst{15} = 0; 725} |
450 451// ADD r, sp, {so_imm|i12} 452def t2ADDrSPi : T2sI<(outs GPR:$dst), (ins GPR:$sp, t2_so_imm:$imm), | 726 727// ADD r, sp, {so_imm|i12} 728def t2ADDrSPi : T2sI<(outs GPR:$dst), (ins GPR:$sp, t2_so_imm:$imm), |
453 IIC_iALUi, "add", ".w\t$dst, $sp, $imm", []>; | 729 IIC_iALUi, "add", ".w\t$dst, $sp, $imm", []> { 730 let Inst{31-27} = 0b11110; 731 let Inst{25} = 0; 732 let Inst{24-21} = 0b1000; 733 let Inst{20} = ?; // The S bit. 734 let Inst{19-16} = 0b1101; // Rn = sp 735 let Inst{15} = 0; 736} |
454def t2ADDrSPi12 : T2I<(outs GPR:$dst), (ins GPR:$sp, imm0_4095:$imm), | 737def t2ADDrSPi12 : T2I<(outs GPR:$dst), (ins GPR:$sp, imm0_4095:$imm), |
455 IIC_iALUi, "addw", "\t$dst, $sp, $imm", []>; | 738 IIC_iALUi, "addw", "\t$dst, $sp, $imm", []> { 739 let Inst{31-27} = 0b11110; 740 let Inst{25} = 1; 741 let Inst{24-21} = 0b0000; 742 let Inst{20} = 0; // The S bit. 743 let Inst{19-16} = 0b1101; // Rn = sp 744 let Inst{15} = 0; 745} |
456 457// ADD r, sp, so_reg 458def t2ADDrSPs : T2sI<(outs GPR:$dst), (ins GPR:$sp, t2_so_reg:$rhs), | 746 747// ADD r, sp, so_reg 748def t2ADDrSPs : T2sI<(outs GPR:$dst), (ins GPR:$sp, t2_so_reg:$rhs), |
459 IIC_iALUsi, "add", ".w\t$dst, $sp, $rhs", []>; | 749 IIC_iALUsi, "add", ".w\t$dst, $sp, $rhs", []> { 750 let Inst{31-27} = 0b11101; 751 let Inst{26-25} = 0b01; 752 let Inst{24-21} = 0b1000; 753 let Inst{20} = ?; // The S bit. 754 let Inst{19-16} = 0b1101; // Rn = sp 755 let Inst{15} = 0; 756} |
460 461// SUB r, sp, {so_imm|i12} 462def t2SUBrSPi : T2sI<(outs GPR:$dst), (ins GPR:$sp, t2_so_imm:$imm), | 757 758// SUB r, sp, {so_imm|i12} 759def t2SUBrSPi : T2sI<(outs GPR:$dst), (ins GPR:$sp, t2_so_imm:$imm), |
463 IIC_iALUi, "sub", ".w\t$dst, $sp, $imm", []>; | 760 IIC_iALUi, "sub", ".w\t$dst, $sp, $imm", []> { 761 let Inst{31-27} = 0b11110; 762 let Inst{25} = 0; 763 let Inst{24-21} = 0b1101; 764 let Inst{20} = ?; // The S bit. 765 let Inst{19-16} = 0b1101; // Rn = sp 766 let Inst{15} = 0; 767} |
464def t2SUBrSPi12 : T2I<(outs GPR:$dst), (ins GPR:$sp, imm0_4095:$imm), | 768def t2SUBrSPi12 : T2I<(outs GPR:$dst), (ins GPR:$sp, imm0_4095:$imm), |
465 IIC_iALUi, "subw", "\t$dst, $sp, $imm", []>; | 769 IIC_iALUi, "subw", "\t$dst, $sp, $imm", []> { 770 let Inst{31-27} = 0b11110; 771 let Inst{25} = 1; 772 let Inst{24-21} = 0b0101; 773 let Inst{20} = 0; // The S bit. 774 let Inst{19-16} = 0b1101; // Rn = sp 775 let Inst{15} = 0; 776} |
466 467// SUB r, sp, so_reg 468def t2SUBrSPs : T2sI<(outs GPR:$dst), (ins GPR:$sp, t2_so_reg:$rhs), 469 IIC_iALUsi, | 777 778// SUB r, sp, so_reg 779def t2SUBrSPs : T2sI<(outs GPR:$dst), (ins GPR:$sp, t2_so_reg:$rhs), 780 IIC_iALUsi, |
470 "sub", "\t$dst, $sp, $rhs", []>; | 781 "sub", "\t$dst, $sp, $rhs", []> { 782 let Inst{31-27} = 0b11101; 783 let Inst{26-25} = 0b01; 784 let Inst{24-21} = 0b1101; 785 let Inst{20} = ?; // The S bit. 786 let Inst{19-16} = 0b1101; // Rn = sp 787 let Inst{15} = 0; 788} |
471 | 789 |
472 | |
473// Pseudo instruction that will expand into a t2SUBrSPi + a copy. 474let usesCustomInserter = 1 in { // Expanded after instruction selection. 475def t2SUBrSPi_ : PseudoInst<(outs GPR:$dst), (ins GPR:$sp, t2_so_imm:$imm), 476 NoItinerary, "@ sub.w\t$dst, $sp, $imm", []>; 477def t2SUBrSPi12_ : PseudoInst<(outs GPR:$dst), (ins GPR:$sp, imm0_4095:$imm), 478 NoItinerary, "@ subw\t$dst, $sp, $imm", []>; 479def t2SUBrSPs_ : PseudoInst<(outs GPR:$dst), (ins GPR:$sp, t2_so_reg:$rhs), 480 NoItinerary, "@ sub\t$dst, $sp, $rhs", []>; 481} // usesCustomInserter 482 483 484//===----------------------------------------------------------------------===// 485// Load / store Instructions. 486// 487 488// Load 489let canFoldAsLoad = 1, isReMaterializable = 1, mayHaveSideEffects = 1 in | 790// Pseudo instruction that will expand into a t2SUBrSPi + a copy. 791let usesCustomInserter = 1 in { // Expanded after instruction selection. 792def t2SUBrSPi_ : PseudoInst<(outs GPR:$dst), (ins GPR:$sp, t2_so_imm:$imm), 793 NoItinerary, "@ sub.w\t$dst, $sp, $imm", []>; 794def t2SUBrSPi12_ : PseudoInst<(outs GPR:$dst), (ins GPR:$sp, imm0_4095:$imm), 795 NoItinerary, "@ subw\t$dst, $sp, $imm", []>; 796def t2SUBrSPs_ : PseudoInst<(outs GPR:$dst), (ins GPR:$sp, t2_so_reg:$rhs), 797 NoItinerary, "@ sub\t$dst, $sp, $rhs", []>; 798} // usesCustomInserter 799 800 801//===----------------------------------------------------------------------===// 802// Load / store Instructions. 803// 804 805// Load 806let canFoldAsLoad = 1, isReMaterializable = 1, mayHaveSideEffects = 1 in |
490defm t2LDR : T2I_ld<"ldr", UnOpFrag<(load node:$Src)>>; | 807defm t2LDR : T2I_ld<0, 0b10, "ldr", UnOpFrag<(load node:$Src)>>; |
491 492// Loads with zero extension | 808 809// Loads with zero extension |
493defm t2LDRH : T2I_ld<"ldrh", UnOpFrag<(zextloadi16 node:$Src)>>; 494defm t2LDRB : T2I_ld<"ldrb", UnOpFrag<(zextloadi8 node:$Src)>>; | 810defm t2LDRH : T2I_ld<0, 0b01, "ldrh", UnOpFrag<(zextloadi16 node:$Src)>>; 811defm t2LDRB : T2I_ld<0, 0b00, "ldrb", UnOpFrag<(zextloadi8 node:$Src)>>; |
495 496// Loads with sign extension | 812 813// Loads with sign extension |
497defm t2LDRSH : T2I_ld<"ldrsh", UnOpFrag<(sextloadi16 node:$Src)>>; 498defm t2LDRSB : T2I_ld<"ldrsb", UnOpFrag<(sextloadi8 node:$Src)>>; | 814defm t2LDRSH : T2I_ld<1, 0b01, "ldrsh", UnOpFrag<(sextloadi16 node:$Src)>>; 815defm t2LDRSB : T2I_ld<1, 0b00, "ldrsb", UnOpFrag<(sextloadi8 node:$Src)>>; |
499 500let mayLoad = 1, hasExtraDefRegAllocReq = 1 in { 501// Load doubleword | 816 817let mayLoad = 1, hasExtraDefRegAllocReq = 1 in { 818// Load doubleword |
502def t2LDRDi8 : T2Ii8s4<(outs GPR:$dst1, GPR:$dst2), | 819def t2LDRDi8 : T2Ii8s4<1, 0, 1, (outs GPR:$dst1, GPR:$dst2), |
503 (ins t2addrmode_imm8s4:$addr), 504 IIC_iLoadi, "ldrd", "\t$dst1, $addr", []>; | 820 (ins t2addrmode_imm8s4:$addr), 821 IIC_iLoadi, "ldrd", "\t$dst1, $addr", []>; |
505def t2LDRDpci : T2Ii8s4<(outs GPR:$dst1, GPR:$dst2), | 822def t2LDRDpci : T2Ii8s4<?, ?, 1, (outs GPR:$dst1, GPR:$dst2), |
506 (ins i32imm:$addr), IIC_iLoadi, | 823 (ins i32imm:$addr), IIC_iLoadi, |
507 "ldrd", "\t$dst1, $addr", []>; | 824 "ldrd", "\t$dst1, $addr", []> { 825 let Inst{19-16} = 0b1111; // Rn |
508} | 826} |
827} |
|
509 510// zextload i1 -> zextload i8 511def : T2Pat<(zextloadi1 t2addrmode_imm12:$addr), 512 (t2LDRBi12 t2addrmode_imm12:$addr)>; 513def : T2Pat<(zextloadi1 t2addrmode_imm8:$addr), 514 (t2LDRBi8 t2addrmode_imm8:$addr)>; 515def : T2Pat<(zextloadi1 t2addrmode_so_reg:$addr), 516 (t2LDRBs t2addrmode_so_reg:$addr)>; --- 27 unchanged lines hidden (view full) --- 544 (t2LDRHi8 t2addrmode_imm8:$addr)>; 545def : T2Pat<(extloadi16 t2addrmode_so_reg:$addr), 546 (t2LDRHs t2addrmode_so_reg:$addr)>; 547def : T2Pat<(extloadi16 (ARMWrapper tconstpool:$addr)), 548 (t2LDRHpci tconstpool:$addr)>; 549 550// Indexed loads 551let mayLoad = 1 in { | 828 829// zextload i1 -> zextload i8 830def : T2Pat<(zextloadi1 t2addrmode_imm12:$addr), 831 (t2LDRBi12 t2addrmode_imm12:$addr)>; 832def : T2Pat<(zextloadi1 t2addrmode_imm8:$addr), 833 (t2LDRBi8 t2addrmode_imm8:$addr)>; 834def : T2Pat<(zextloadi1 t2addrmode_so_reg:$addr), 835 (t2LDRBs t2addrmode_so_reg:$addr)>; --- 27 unchanged lines hidden (view full) --- 863 (t2LDRHi8 t2addrmode_imm8:$addr)>; 864def : T2Pat<(extloadi16 t2addrmode_so_reg:$addr), 865 (t2LDRHs t2addrmode_so_reg:$addr)>; 866def : T2Pat<(extloadi16 (ARMWrapper tconstpool:$addr)), 867 (t2LDRHpci tconstpool:$addr)>; 868 869// Indexed loads 870let mayLoad = 1 in { |
552def t2LDR_PRE : T2Iidxldst<(outs GPR:$dst, GPR:$base_wb), | 871def t2LDR_PRE : T2Iidxldst<0, 0b10, 1, 1, (outs GPR:$dst, GPR:$base_wb), |
553 (ins t2addrmode_imm8:$addr), 554 AddrModeT2_i8, IndexModePre, IIC_iLoadiu, 555 "ldr", "\t$dst, $addr!", "$addr.base = $base_wb", 556 []>; 557 | 872 (ins t2addrmode_imm8:$addr), 873 AddrModeT2_i8, IndexModePre, IIC_iLoadiu, 874 "ldr", "\t$dst, $addr!", "$addr.base = $base_wb", 875 []>; 876 |
558def t2LDR_POST : T2Iidxldst<(outs GPR:$dst, GPR:$base_wb), | 877def t2LDR_POST : T2Iidxldst<0, 0b10, 1, 0, (outs GPR:$dst, GPR:$base_wb), |
559 (ins GPR:$base, t2am_imm8_offset:$offset), 560 AddrModeT2_i8, IndexModePost, IIC_iLoadiu, 561 "ldr", "\t$dst, [$base], $offset", "$base = $base_wb", 562 []>; 563 | 878 (ins GPR:$base, t2am_imm8_offset:$offset), 879 AddrModeT2_i8, IndexModePost, IIC_iLoadiu, 880 "ldr", "\t$dst, [$base], $offset", "$base = $base_wb", 881 []>; 882 |
564def t2LDRB_PRE : T2Iidxldst<(outs GPR:$dst, GPR:$base_wb), | 883def t2LDRB_PRE : T2Iidxldst<0, 0b00, 1, 1, (outs GPR:$dst, GPR:$base_wb), |
565 (ins t2addrmode_imm8:$addr), 566 AddrModeT2_i8, IndexModePre, IIC_iLoadiu, 567 "ldrb", "\t$dst, $addr!", "$addr.base = $base_wb", 568 []>; | 884 (ins t2addrmode_imm8:$addr), 885 AddrModeT2_i8, IndexModePre, IIC_iLoadiu, 886 "ldrb", "\t$dst, $addr!", "$addr.base = $base_wb", 887 []>; |
569def t2LDRB_POST : T2Iidxldst<(outs GPR:$dst, GPR:$base_wb), | 888def t2LDRB_POST : T2Iidxldst<0, 0b00, 1, 0, (outs GPR:$dst, GPR:$base_wb), |
570 (ins GPR:$base, t2am_imm8_offset:$offset), 571 AddrModeT2_i8, IndexModePost, IIC_iLoadiu, 572 "ldrb", "\t$dst, [$base], $offset", "$base = $base_wb", 573 []>; 574 | 889 (ins GPR:$base, t2am_imm8_offset:$offset), 890 AddrModeT2_i8, IndexModePost, IIC_iLoadiu, 891 "ldrb", "\t$dst, [$base], $offset", "$base = $base_wb", 892 []>; 893 |
575def t2LDRH_PRE : T2Iidxldst<(outs GPR:$dst, GPR:$base_wb), | 894def t2LDRH_PRE : T2Iidxldst<0, 0b01, 1, 1, (outs GPR:$dst, GPR:$base_wb), |
576 (ins t2addrmode_imm8:$addr), 577 AddrModeT2_i8, IndexModePre, IIC_iLoadiu, 578 "ldrh", "\t$dst, $addr!", "$addr.base = $base_wb", 579 []>; | 895 (ins t2addrmode_imm8:$addr), 896 AddrModeT2_i8, IndexModePre, IIC_iLoadiu, 897 "ldrh", "\t$dst, $addr!", "$addr.base = $base_wb", 898 []>; |
580def t2LDRH_POST : T2Iidxldst<(outs GPR:$dst, GPR:$base_wb), | 899def t2LDRH_POST : T2Iidxldst<0, 0b01, 1, 0, (outs GPR:$dst, GPR:$base_wb), |
581 (ins GPR:$base, t2am_imm8_offset:$offset), 582 AddrModeT2_i8, IndexModePost, IIC_iLoadiu, 583 "ldrh", "\t$dst, [$base], $offset", "$base = $base_wb", 584 []>; 585 | 900 (ins GPR:$base, t2am_imm8_offset:$offset), 901 AddrModeT2_i8, IndexModePost, IIC_iLoadiu, 902 "ldrh", "\t$dst, [$base], $offset", "$base = $base_wb", 903 []>; 904 |
586def t2LDRSB_PRE : T2Iidxldst<(outs GPR:$dst, GPR:$base_wb), | 905def t2LDRSB_PRE : T2Iidxldst<1, 0b00, 1, 1, (outs GPR:$dst, GPR:$base_wb), |
587 (ins t2addrmode_imm8:$addr), 588 AddrModeT2_i8, IndexModePre, IIC_iLoadiu, 589 "ldrsb", "\t$dst, $addr!", "$addr.base = $base_wb", 590 []>; | 906 (ins t2addrmode_imm8:$addr), 907 AddrModeT2_i8, IndexModePre, IIC_iLoadiu, 908 "ldrsb", "\t$dst, $addr!", "$addr.base = $base_wb", 909 []>; |
591def t2LDRSB_POST : T2Iidxldst<(outs GPR:$dst, GPR:$base_wb), | 910def t2LDRSB_POST : T2Iidxldst<1, 0b00, 1, 0, (outs GPR:$dst, GPR:$base_wb), |
592 (ins GPR:$base, t2am_imm8_offset:$offset), 593 AddrModeT2_i8, IndexModePost, IIC_iLoadiu, 594 "ldrsb", "\t$dst, [$base], $offset", "$base = $base_wb", 595 []>; 596 | 911 (ins GPR:$base, t2am_imm8_offset:$offset), 912 AddrModeT2_i8, IndexModePost, IIC_iLoadiu, 913 "ldrsb", "\t$dst, [$base], $offset", "$base = $base_wb", 914 []>; 915 |
597def t2LDRSH_PRE : T2Iidxldst<(outs GPR:$dst, GPR:$base_wb), | 916def t2LDRSH_PRE : T2Iidxldst<1, 0b01, 1, 1, (outs GPR:$dst, GPR:$base_wb), |
598 (ins t2addrmode_imm8:$addr), 599 AddrModeT2_i8, IndexModePre, IIC_iLoadiu, 600 "ldrsh", "\t$dst, $addr!", "$addr.base = $base_wb", 601 []>; | 917 (ins t2addrmode_imm8:$addr), 918 AddrModeT2_i8, IndexModePre, IIC_iLoadiu, 919 "ldrsh", "\t$dst, $addr!", "$addr.base = $base_wb", 920 []>; |
602def t2LDRSH_POST : T2Iidxldst<(outs GPR:$dst, GPR:$base_wb), | 921def t2LDRSH_POST : T2Iidxldst<1, 0b01, 1, 0, (outs GPR:$dst, GPR:$base_wb), |
603 (ins GPR:$base, t2am_imm8_offset:$offset), 604 AddrModeT2_i8, IndexModePost, IIC_iLoadiu, 605 "ldrsh", "\t$dst, [$base], $offset", "$base = $base_wb", 606 []>; 607} 608 609// Store | 922 (ins GPR:$base, t2am_imm8_offset:$offset), 923 AddrModeT2_i8, IndexModePost, IIC_iLoadiu, 924 "ldrsh", "\t$dst, [$base], $offset", "$base = $base_wb", 925 []>; 926} 927 928// Store |
610defm t2STR : T2I_st<"str", BinOpFrag<(store node:$LHS, node:$RHS)>>; 611defm t2STRB : T2I_st<"strb", BinOpFrag<(truncstorei8 node:$LHS, node:$RHS)>>; 612defm t2STRH : T2I_st<"strh", BinOpFrag<(truncstorei16 node:$LHS, node:$RHS)>>; | 929defm t2STR : T2I_st<0b10, "str", BinOpFrag<(store node:$LHS, node:$RHS)>>; 930defm t2STRB : T2I_st<0b00, "strb", BinOpFrag<(truncstorei8 node:$LHS, node:$RHS)>>; 931defm t2STRH : T2I_st<0b01, "strh", BinOpFrag<(truncstorei16 node:$LHS, node:$RHS)>>; |
613 614// Store doubleword 615let mayLoad = 1, hasExtraSrcRegAllocReq = 1 in | 932 933// Store doubleword 934let mayLoad = 1, hasExtraSrcRegAllocReq = 1 in |
616def t2STRDi8 : T2Ii8s4<(outs), | 935def t2STRDi8 : T2Ii8s4<1, 0, 0, (outs), |
617 (ins GPR:$src1, GPR:$src2, t2addrmode_imm8s4:$addr), 618 IIC_iStorer, "strd", "\t$src1, $addr", []>; 619 620// Indexed stores | 936 (ins GPR:$src1, GPR:$src2, t2addrmode_imm8s4:$addr), 937 IIC_iStorer, "strd", "\t$src1, $addr", []>; 938 939// Indexed stores |
621def t2STR_PRE : T2Iidxldst<(outs GPR:$base_wb), | 940def t2STR_PRE : T2Iidxldst<0, 0b10, 0, 1, (outs GPR:$base_wb), |
622 (ins GPR:$src, GPR:$base, t2am_imm8_offset:$offset), 623 AddrModeT2_i8, IndexModePre, IIC_iStoreiu, 624 "str", "\t$src, [$base, $offset]!", "$base = $base_wb", 625 [(set GPR:$base_wb, 626 (pre_store GPR:$src, GPR:$base, t2am_imm8_offset:$offset))]>; 627 | 941 (ins GPR:$src, GPR:$base, t2am_imm8_offset:$offset), 942 AddrModeT2_i8, IndexModePre, IIC_iStoreiu, 943 "str", "\t$src, [$base, $offset]!", "$base = $base_wb", 944 [(set GPR:$base_wb, 945 (pre_store GPR:$src, GPR:$base, t2am_imm8_offset:$offset))]>; 946 |
628def t2STR_POST : T2Iidxldst<(outs GPR:$base_wb), | 947def t2STR_POST : T2Iidxldst<0, 0b10, 0, 0, (outs GPR:$base_wb), |
629 (ins GPR:$src, GPR:$base, t2am_imm8_offset:$offset), 630 AddrModeT2_i8, IndexModePost, IIC_iStoreiu, 631 "str", "\t$src, [$base], $offset", "$base = $base_wb", 632 [(set GPR:$base_wb, 633 (post_store GPR:$src, GPR:$base, t2am_imm8_offset:$offset))]>; 634 | 948 (ins GPR:$src, GPR:$base, t2am_imm8_offset:$offset), 949 AddrModeT2_i8, IndexModePost, IIC_iStoreiu, 950 "str", "\t$src, [$base], $offset", "$base = $base_wb", 951 [(set GPR:$base_wb, 952 (post_store GPR:$src, GPR:$base, t2am_imm8_offset:$offset))]>; 953 |
635def t2STRH_PRE : T2Iidxldst<(outs GPR:$base_wb), | 954def t2STRH_PRE : T2Iidxldst<0, 0b01, 0, 1, (outs GPR:$base_wb), |
636 (ins GPR:$src, GPR:$base, t2am_imm8_offset:$offset), 637 AddrModeT2_i8, IndexModePre, IIC_iStoreiu, 638 "strh", "\t$src, [$base, $offset]!", "$base = $base_wb", 639 [(set GPR:$base_wb, 640 (pre_truncsti16 GPR:$src, GPR:$base, t2am_imm8_offset:$offset))]>; 641 | 955 (ins GPR:$src, GPR:$base, t2am_imm8_offset:$offset), 956 AddrModeT2_i8, IndexModePre, IIC_iStoreiu, 957 "strh", "\t$src, [$base, $offset]!", "$base = $base_wb", 958 [(set GPR:$base_wb, 959 (pre_truncsti16 GPR:$src, GPR:$base, t2am_imm8_offset:$offset))]>; 960 |
642def t2STRH_POST : T2Iidxldst<(outs GPR:$base_wb), | 961def t2STRH_POST : T2Iidxldst<0, 0b01, 0, 0, (outs GPR:$base_wb), |
643 (ins GPR:$src, GPR:$base, t2am_imm8_offset:$offset), 644 AddrModeT2_i8, IndexModePost, IIC_iStoreiu, 645 "strh", "\t$src, [$base], $offset", "$base = $base_wb", 646 [(set GPR:$base_wb, 647 (post_truncsti16 GPR:$src, GPR:$base, t2am_imm8_offset:$offset))]>; 648 | 962 (ins GPR:$src, GPR:$base, t2am_imm8_offset:$offset), 963 AddrModeT2_i8, IndexModePost, IIC_iStoreiu, 964 "strh", "\t$src, [$base], $offset", "$base = $base_wb", 965 [(set GPR:$base_wb, 966 (post_truncsti16 GPR:$src, GPR:$base, t2am_imm8_offset:$offset))]>; 967 |
649def t2STRB_PRE : T2Iidxldst<(outs GPR:$base_wb), | 968def t2STRB_PRE : T2Iidxldst<0, 0b00, 0, 1, (outs GPR:$base_wb), |
650 (ins GPR:$src, GPR:$base, t2am_imm8_offset:$offset), 651 AddrModeT2_i8, IndexModePre, IIC_iStoreiu, 652 "strb", "\t$src, [$base, $offset]!", "$base = $base_wb", 653 [(set GPR:$base_wb, 654 (pre_truncsti8 GPR:$src, GPR:$base, t2am_imm8_offset:$offset))]>; 655 | 969 (ins GPR:$src, GPR:$base, t2am_imm8_offset:$offset), 970 AddrModeT2_i8, IndexModePre, IIC_iStoreiu, 971 "strb", "\t$src, [$base, $offset]!", "$base = $base_wb", 972 [(set GPR:$base_wb, 973 (pre_truncsti8 GPR:$src, GPR:$base, t2am_imm8_offset:$offset))]>; 974 |
656def t2STRB_POST : T2Iidxldst<(outs GPR:$base_wb), | 975def t2STRB_POST : T2Iidxldst<0, 0b00, 0, 0, (outs GPR:$base_wb), |
657 (ins GPR:$src, GPR:$base, t2am_imm8_offset:$offset), 658 AddrModeT2_i8, IndexModePost, IIC_iStoreiu, 659 "strb", "\t$src, [$base], $offset", "$base = $base_wb", 660 [(set GPR:$base_wb, 661 (post_truncsti8 GPR:$src, GPR:$base, t2am_imm8_offset:$offset))]>; 662 663 664// FIXME: ldrd / strd pre / post variants 665 666//===----------------------------------------------------------------------===// 667// Load / store multiple Instructions. 668// 669 670let mayLoad = 1, hasExtraDefRegAllocReq = 1 in 671def t2LDM : T2XI<(outs), 672 (ins addrmode4:$addr, pred:$p, reglist:$wb, variable_ops), | 976 (ins GPR:$src, GPR:$base, t2am_imm8_offset:$offset), 977 AddrModeT2_i8, IndexModePost, IIC_iStoreiu, 978 "strb", "\t$src, [$base], $offset", "$base = $base_wb", 979 [(set GPR:$base_wb, 980 (post_truncsti8 GPR:$src, GPR:$base, t2am_imm8_offset:$offset))]>; 981 982 983// FIXME: ldrd / strd pre / post variants 984 985//===----------------------------------------------------------------------===// 986// Load / store multiple Instructions. 987// 988 989let mayLoad = 1, hasExtraDefRegAllocReq = 1 in 990def t2LDM : T2XI<(outs), 991 (ins addrmode4:$addr, pred:$p, reglist:$wb, variable_ops), |
673 IIC_iLoadm, "ldm${addr:submode}${p}${addr:wide}\t$addr, $wb", []>; | 992 IIC_iLoadm, "ldm${addr:submode}${p}${addr:wide}\t$addr, $wb", []> { 993 let Inst{31-27} = 0b11101; 994 let Inst{26-25} = 0b00; 995 let Inst{24-23} = {?, ?}; // IA: '01', DB: '10' 996 let Inst{22} = 0; 997 let Inst{21} = ?; // The W bit. 998 let Inst{20} = 1; // Load 999} |
674 675let mayStore = 1, hasExtraSrcRegAllocReq = 1 in 676def t2STM : T2XI<(outs), 677 (ins addrmode4:$addr, pred:$p, reglist:$wb, variable_ops), | 1000 1001let mayStore = 1, hasExtraSrcRegAllocReq = 1 in 1002def t2STM : T2XI<(outs), 1003 (ins addrmode4:$addr, pred:$p, reglist:$wb, variable_ops), |
678 IIC_iStorem, "stm${addr:submode}${p}${addr:wide}\t$addr, $wb", []>; | 1004 IIC_iStorem, "stm${addr:submode}${p}${addr:wide}\t$addr, $wb", []> { 1005 let Inst{31-27} = 0b11101; 1006 let Inst{26-25} = 0b00; 1007 let Inst{24-23} = {?, ?}; // IA: '01', DB: '10' 1008 let Inst{22} = 0; 1009 let Inst{21} = ?; // The W bit. 1010 let Inst{20} = 0; // Store 1011} |
679 680//===----------------------------------------------------------------------===// 681// Move Instructions. 682// 683 684let neverHasSideEffects = 1 in 685def t2MOVr : T2sI<(outs GPR:$dst), (ins GPR:$src), IIC_iMOVr, | 1012 1013//===----------------------------------------------------------------------===// 1014// Move Instructions. 1015// 1016 1017let neverHasSideEffects = 1 in 1018def t2MOVr : T2sI<(outs GPR:$dst), (ins GPR:$src), IIC_iMOVr, |
686 "mov", ".w\t$dst, $src", []>; | 1019 "mov", ".w\t$dst, $src", []> { 1020 let Inst{31-27} = 0b11101; 1021 let Inst{26-25} = 0b01; 1022 let Inst{24-21} = 0b0010; 1023 let Inst{20} = ?; // The S bit. 1024 let Inst{19-16} = 0b1111; // Rn 1025 let Inst{14-12} = 0b000; 1026 let Inst{7-4} = 0b0000; 1027} |
687 688// AddedComplexity to ensure isel tries t2MOVi before t2MOVi16. 689let isReMaterializable = 1, isAsCheapAsAMove = 1, AddedComplexity = 1 in 690def t2MOVi : T2sI<(outs GPR:$dst), (ins t2_so_imm:$src), IIC_iMOVi, 691 "mov", ".w\t$dst, $src", | 1028 1029// AddedComplexity to ensure isel tries t2MOVi before t2MOVi16. 1030let isReMaterializable = 1, isAsCheapAsAMove = 1, AddedComplexity = 1 in 1031def t2MOVi : T2sI<(outs GPR:$dst), (ins t2_so_imm:$src), IIC_iMOVi, 1032 "mov", ".w\t$dst, $src", |
692 [(set GPR:$dst, t2_so_imm:$src)]>; | 1033 [(set GPR:$dst, t2_so_imm:$src)]> { 1034 let Inst{31-27} = 0b11110; 1035 let Inst{25} = 0; 1036 let Inst{24-21} = 0b0010; 1037 let Inst{20} = ?; // The S bit. 1038 let Inst{19-16} = 0b1111; // Rn 1039 let Inst{15} = 0; 1040} |
693 694let isReMaterializable = 1, isAsCheapAsAMove = 1 in 695def t2MOVi16 : T2I<(outs GPR:$dst), (ins i32imm:$src), IIC_iMOVi, 696 "movw", "\t$dst, $src", | 1041 1042let isReMaterializable = 1, isAsCheapAsAMove = 1 in 1043def t2MOVi16 : T2I<(outs GPR:$dst), (ins i32imm:$src), IIC_iMOVi, 1044 "movw", "\t$dst, $src", |
697 [(set GPR:$dst, imm0_65535:$src)]>; | 1045 [(set GPR:$dst, imm0_65535:$src)]> { 1046 let Inst{31-27} = 0b11110; 1047 let Inst{25} = 1; 1048 let Inst{24-21} = 0b0010; 1049 let Inst{20} = 0; // The S bit. 1050 let Inst{15} = 0; 1051} |
698 699let Constraints = "$src = $dst" in 700def t2MOVTi16 : T2I<(outs GPR:$dst), (ins GPR:$src, i32imm:$imm), IIC_iMOVi, 701 "movt", "\t$dst, $imm", 702 [(set GPR:$dst, | 1052 1053let Constraints = "$src = $dst" in 1054def t2MOVTi16 : T2I<(outs GPR:$dst), (ins GPR:$src, i32imm:$imm), IIC_iMOVi, 1055 "movt", "\t$dst, $imm", 1056 [(set GPR:$dst, |
703 (or (and GPR:$src, 0xffff), lo16AllZero:$imm))]>; | 1057 (or (and GPR:$src, 0xffff), lo16AllZero:$imm))]> { 1058 let Inst{31-27} = 0b11110; 1059 let Inst{25} = 1; 1060 let Inst{24-21} = 0b0110; 1061 let Inst{20} = 0; // The S bit. 1062 let Inst{15} = 0; 1063} |
704 705def : T2Pat<(or GPR:$src, 0xffff0000), (t2MOVTi16 GPR:$src, 0xffff)>; 706 707//===----------------------------------------------------------------------===// 708// Extend Instructions. 709// 710 711// Sign extenders 712 | 1064 1065def : T2Pat<(or GPR:$src, 0xffff0000), (t2MOVTi16 GPR:$src, 0xffff)>; 1066 1067//===----------------------------------------------------------------------===// 1068// Extend Instructions. 1069// 1070 1071// Sign extenders 1072 |
713defm t2SXTB : T2I_unary_rrot<"sxtb", UnOpFrag<(sext_inreg node:$Src, i8)>>; 714defm t2SXTH : T2I_unary_rrot<"sxth", UnOpFrag<(sext_inreg node:$Src, i16)>>; | 1073defm t2SXTB : T2I_unary_rrot<0b100, "sxtb", 1074 UnOpFrag<(sext_inreg node:$Src, i8)>>; 1075defm t2SXTH : T2I_unary_rrot<0b000, "sxth", 1076 UnOpFrag<(sext_inreg node:$Src, i16)>>; |
715 | 1077 |
716defm t2SXTAB : T2I_bin_rrot<"sxtab", | 1078defm t2SXTAB : T2I_bin_rrot<0b100, "sxtab", |
717 BinOpFrag<(add node:$LHS, (sext_inreg node:$RHS, i8))>>; | 1079 BinOpFrag<(add node:$LHS, (sext_inreg node:$RHS, i8))>>; |
718defm t2SXTAH : T2I_bin_rrot<"sxtah", | 1080defm t2SXTAH : T2I_bin_rrot<0b000, "sxtah", |
719 BinOpFrag<(add node:$LHS, (sext_inreg node:$RHS,i16))>>; 720 721// TODO: SXT(A){B|H}16 722 723// Zero extenders 724 725let AddedComplexity = 16 in { | 1081 BinOpFrag<(add node:$LHS, (sext_inreg node:$RHS,i16))>>; 1082 1083// TODO: SXT(A){B|H}16 1084 1085// Zero extenders 1086 1087let AddedComplexity = 16 in { |
726defm t2UXTB : T2I_unary_rrot<"uxtb" , UnOpFrag<(and node:$Src, 0x000000FF)>>; 727defm t2UXTH : T2I_unary_rrot<"uxth" , UnOpFrag<(and node:$Src, 0x0000FFFF)>>; 728defm t2UXTB16 : T2I_unary_rrot<"uxtb16", UnOpFrag<(and node:$Src, 0x00FF00FF)>>; | 1088defm t2UXTB : T2I_unary_rrot<0b101, "uxtb", 1089 UnOpFrag<(and node:$Src, 0x000000FF)>>; 1090defm t2UXTH : T2I_unary_rrot<0b001, "uxth", 1091 UnOpFrag<(and node:$Src, 0x0000FFFF)>>; 1092defm t2UXTB16 : T2I_unary_rrot<0b011, "uxtb16", 1093 UnOpFrag<(and node:$Src, 0x00FF00FF)>>; |
729 730def : T2Pat<(and (shl GPR:$Src, (i32 8)), 0xFF00FF), 731 (t2UXTB16r_rot GPR:$Src, 24)>; 732def : T2Pat<(and (srl GPR:$Src, (i32 8)), 0xFF00FF), 733 (t2UXTB16r_rot GPR:$Src, 8)>; 734 | 1094 1095def : T2Pat<(and (shl GPR:$Src, (i32 8)), 0xFF00FF), 1096 (t2UXTB16r_rot GPR:$Src, 24)>; 1097def : T2Pat<(and (srl GPR:$Src, (i32 8)), 0xFF00FF), 1098 (t2UXTB16r_rot GPR:$Src, 8)>; 1099 |
735defm t2UXTAB : T2I_bin_rrot<"uxtab", | 1100defm t2UXTAB : T2I_bin_rrot<0b101, "uxtab", |
736 BinOpFrag<(add node:$LHS, (and node:$RHS, 0x00FF))>>; | 1101 BinOpFrag<(add node:$LHS, (and node:$RHS, 0x00FF))>>; |
737defm t2UXTAH : T2I_bin_rrot<"uxtah", | 1102defm t2UXTAH : T2I_bin_rrot<0b001, "uxtah", |
738 BinOpFrag<(add node:$LHS, (and node:$RHS, 0xFFFF))>>; 739} 740 741//===----------------------------------------------------------------------===// 742// Arithmetic Instructions. 743// 744 | 1103 BinOpFrag<(add node:$LHS, (and node:$RHS, 0xFFFF))>>; 1104} 1105 1106//===----------------------------------------------------------------------===// 1107// Arithmetic Instructions. 1108// 1109 |
745defm t2ADD : T2I_bin_ii12rs<"add", BinOpFrag<(add node:$LHS, node:$RHS)>, 1>; 746defm t2SUB : T2I_bin_ii12rs<"sub", BinOpFrag<(sub node:$LHS, node:$RHS)>>; | 1110defm t2ADD : T2I_bin_ii12rs<0b000, "add", 1111 BinOpFrag<(add node:$LHS, node:$RHS)>, 1>; 1112defm t2SUB : T2I_bin_ii12rs<0b101, "sub", 1113 BinOpFrag<(sub node:$LHS, node:$RHS)>>; |
747 748// ADD and SUB with 's' bit set. No 12-bit immediate (T4) variants. | 1114 1115// ADD and SUB with 's' bit set. No 12-bit immediate (T4) variants. |
749defm t2ADDS : T2I_bin_s_irs <"add", BinOpFrag<(addc node:$LHS, node:$RHS)>, 1>; 750defm t2SUBS : T2I_bin_s_irs <"sub", BinOpFrag<(subc node:$LHS, node:$RHS)>>; | 1116defm t2ADDS : T2I_bin_s_irs <0b1000, "add", 1117 BinOpFrag<(addc node:$LHS, node:$RHS)>, 1>; 1118defm t2SUBS : T2I_bin_s_irs <0b1101, "sub", 1119 BinOpFrag<(subc node:$LHS, node:$RHS)>>; |
751 | 1120 |
752defm t2ADC : T2I_adde_sube_irs<"adc",BinOpFrag<(adde node:$LHS, node:$RHS)>,1>; 753defm t2SBC : T2I_adde_sube_irs<"sbc",BinOpFrag<(sube node:$LHS, node:$RHS)>>; | 1121defm t2ADC : T2I_adde_sube_irs<0b1010, "adc", 1122 BinOpFrag<(adde node:$LHS, node:$RHS)>, 1>; 1123defm t2SBC : T2I_adde_sube_irs<0b1011, "sbc", 1124 BinOpFrag<(sube node:$LHS, node:$RHS)>>; |
754 755// RSB | 1125 1126// RSB |
756defm t2RSB : T2I_rbin_is <"rsb", BinOpFrag<(sub node:$LHS, node:$RHS)>>; 757defm t2RSBS : T2I_rbin_s_is <"rsb", BinOpFrag<(subc node:$LHS, node:$RHS)>>; | 1127defm t2RSB : T2I_rbin_is <0b1110, "rsb", 1128 BinOpFrag<(sub node:$LHS, node:$RHS)>>; 1129defm t2RSBS : T2I_rbin_s_is <0b1110, "rsb", 1130 BinOpFrag<(subc node:$LHS, node:$RHS)>>; |
758 759// (sub X, imm) gets canonicalized to (add X, -imm). Match this form. 760let AddedComplexity = 1 in 761def : T2Pat<(add GPR:$src, imm0_255_neg:$imm), 762 (t2SUBri GPR:$src, imm0_255_neg:$imm)>; 763def : T2Pat<(add GPR:$src, t2_so_imm_neg:$imm), 764 (t2SUBri GPR:$src, t2_so_imm_neg:$imm)>; 765def : T2Pat<(add GPR:$src, imm0_4095_neg:$imm), 766 (t2SUBri12 GPR:$src, imm0_4095_neg:$imm)>; 767 768 769//===----------------------------------------------------------------------===// 770// Shift and rotate Instructions. 771// 772 | 1131 1132// (sub X, imm) gets canonicalized to (add X, -imm). Match this form. 1133let AddedComplexity = 1 in 1134def : T2Pat<(add GPR:$src, imm0_255_neg:$imm), 1135 (t2SUBri GPR:$src, imm0_255_neg:$imm)>; 1136def : T2Pat<(add GPR:$src, t2_so_imm_neg:$imm), 1137 (t2SUBri GPR:$src, t2_so_imm_neg:$imm)>; 1138def : T2Pat<(add GPR:$src, imm0_4095_neg:$imm), 1139 (t2SUBri12 GPR:$src, imm0_4095_neg:$imm)>; 1140 1141 1142//===----------------------------------------------------------------------===// 1143// Shift and rotate Instructions. 1144// 1145 |
773defm t2LSL : T2I_sh_ir<"lsl", BinOpFrag<(shl node:$LHS, node:$RHS)>>; 774defm t2LSR : T2I_sh_ir<"lsr", BinOpFrag<(srl node:$LHS, node:$RHS)>>; 775defm t2ASR : T2I_sh_ir<"asr", BinOpFrag<(sra node:$LHS, node:$RHS)>>; 776defm t2ROR : T2I_sh_ir<"ror", BinOpFrag<(rotr node:$LHS, node:$RHS)>>; | 1146defm t2LSL : T2I_sh_ir<0b00, "lsl", BinOpFrag<(shl node:$LHS, node:$RHS)>>; 1147defm t2LSR : T2I_sh_ir<0b01, "lsr", BinOpFrag<(srl node:$LHS, node:$RHS)>>; 1148defm t2ASR : T2I_sh_ir<0b10, "asr", BinOpFrag<(sra node:$LHS, node:$RHS)>>; 1149defm t2ROR : T2I_sh_ir<0b11, "ror", BinOpFrag<(rotr node:$LHS, node:$RHS)>>; |
777 778let Uses = [CPSR] in { 779def t2MOVrx : T2sI<(outs GPR:$dst), (ins GPR:$src), IIC_iMOVsi, 780 "rrx", "\t$dst, $src", | 1150 1151let Uses = [CPSR] in { 1152def t2MOVrx : T2sI<(outs GPR:$dst), (ins GPR:$src), IIC_iMOVsi, 1153 "rrx", "\t$dst, $src", |
781 [(set GPR:$dst, (ARMrrx GPR:$src))]>; | 1154 [(set GPR:$dst, (ARMrrx GPR:$src))]> { 1155 let Inst{31-27} = 0b11101; 1156 let Inst{26-25} = 0b01; 1157 let Inst{24-21} = 0b0010; 1158 let Inst{20} = ?; // The S bit. 1159 let Inst{19-16} = 0b1111; // Rn 1160 let Inst{14-12} = 0b000; 1161 let Inst{7-4} = 0b0011; |
782} | 1162} |
1163} |
|
783 784let Defs = [CPSR] in { 785def t2MOVsrl_flag : T2XI<(outs GPR:$dst), (ins GPR:$src), IIC_iMOVsi, 786 "lsrs.w\t$dst, $src, #1", | 1164 1165let Defs = [CPSR] in { 1166def t2MOVsrl_flag : T2XI<(outs GPR:$dst), (ins GPR:$src), IIC_iMOVsi, 1167 "lsrs.w\t$dst, $src, #1", |
787 [(set GPR:$dst, (ARMsrl_flag GPR:$src))]>; | 1168 [(set GPR:$dst, (ARMsrl_flag GPR:$src))]> { 1169 let Inst{31-27} = 0b11101; 1170 let Inst{26-25} = 0b01; 1171 let Inst{24-21} = 0b0010; 1172 let Inst{20} = 1; // The S bit. 1173 let Inst{19-16} = 0b1111; // Rn 1174 let Inst{5-4} = 0b01; // Shift type. 1175 // Shift amount = Inst{14-12:7-6} = 1. 1176 let Inst{14-12} = 0b000; 1177 let Inst{7-6} = 0b01; 1178} |
788def t2MOVsra_flag : T2XI<(outs GPR:$dst), (ins GPR:$src), IIC_iMOVsi, 789 "asrs.w\t$dst, $src, #1", | 1179def t2MOVsra_flag : T2XI<(outs GPR:$dst), (ins GPR:$src), IIC_iMOVsi, 1180 "asrs.w\t$dst, $src, #1", |
790 [(set GPR:$dst, (ARMsra_flag GPR:$src))]>; | 1181 [(set GPR:$dst, (ARMsra_flag GPR:$src))]> { 1182 let Inst{31-27} = 0b11101; 1183 let Inst{26-25} = 0b01; 1184 let Inst{24-21} = 0b0010; 1185 let Inst{20} = 1; // The S bit. 1186 let Inst{19-16} = 0b1111; // Rn 1187 let Inst{5-4} = 0b10; // Shift type. 1188 // Shift amount = Inst{14-12:7-6} = 1. 1189 let Inst{14-12} = 0b000; 1190 let Inst{7-6} = 0b01; |
791} | 1191} |
1192} |
|
792 793//===----------------------------------------------------------------------===// 794// Bitwise Instructions. 795// 796 | 1193 1194//===----------------------------------------------------------------------===// 1195// Bitwise Instructions. 1196// 1197 |
797defm t2AND : T2I_bin_w_irs<"and", BinOpFrag<(and node:$LHS, node:$RHS)>, 1>; 798defm t2ORR : T2I_bin_w_irs<"orr", BinOpFrag<(or node:$LHS, node:$RHS)>, 1>; 799defm t2EOR : T2I_bin_w_irs<"eor", BinOpFrag<(xor node:$LHS, node:$RHS)>, 1>; | 1198defm t2AND : T2I_bin_w_irs<0b0000, "and", 1199 BinOpFrag<(and node:$LHS, node:$RHS)>, 1>; 1200defm t2ORR : T2I_bin_w_irs<0b0010, "orr", 1201 BinOpFrag<(or node:$LHS, node:$RHS)>, 1>; 1202defm t2EOR : T2I_bin_w_irs<0b0100, "eor", 1203 BinOpFrag<(xor node:$LHS, node:$RHS)>, 1>; |
800 | 1204 |
801defm t2BIC : T2I_bin_w_irs<"bic", BinOpFrag<(and node:$LHS, (not node:$RHS))>>; | 1205defm t2BIC : T2I_bin_w_irs<0b0001, "bic", 1206 BinOpFrag<(and node:$LHS, (not node:$RHS))>>; |
802 803let Constraints = "$src = $dst" in 804def t2BFC : T2I<(outs GPR:$dst), (ins GPR:$src, bf_inv_mask_imm:$imm), 805 IIC_iUNAsi, "bfc", "\t$dst, $imm", | 1207 1208let Constraints = "$src = $dst" in 1209def t2BFC : T2I<(outs GPR:$dst), (ins GPR:$src, bf_inv_mask_imm:$imm), 1210 IIC_iUNAsi, "bfc", "\t$dst, $imm", |
806 [(set GPR:$dst, (and GPR:$src, bf_inv_mask_imm:$imm))]>; | 1211 [(set GPR:$dst, (and GPR:$src, bf_inv_mask_imm:$imm))]> { 1212 let Inst{31-27} = 0b11110; 1213 let Inst{25} = 1; 1214 let Inst{24-20} = 0b10110; 1215 let Inst{19-16} = 0b1111; // Rn 1216 let Inst{15} = 0; 1217} |
807 808def t2SBFX : T2I<(outs GPR:$dst), (ins GPR:$src, imm0_31:$lsb, imm0_31:$width), | 1218 1219def t2SBFX : T2I<(outs GPR:$dst), (ins GPR:$src, imm0_31:$lsb, imm0_31:$width), |
809 IIC_iALUi, "sbfx", "\t$dst, $src, $lsb, $width", []>; | 1220 IIC_iALUi, "sbfx", "\t$dst, $src, $lsb, $width", []> { 1221 let Inst{31-27} = 0b11110; 1222 let Inst{25} = 1; 1223 let Inst{24-20} = 0b10100; 1224 let Inst{15} = 0; 1225} |
810 811def t2UBFX : T2I<(outs GPR:$dst), (ins GPR:$src, imm0_31:$lsb, imm0_31:$width), | 1226 1227def t2UBFX : T2I<(outs GPR:$dst), (ins GPR:$src, imm0_31:$lsb, imm0_31:$width), |
812 IIC_iALUi, "ubfx", "\t$dst, $src, $lsb, $width", []>; | 1228 IIC_iALUi, "ubfx", "\t$dst, $src, $lsb, $width", []> { 1229 let Inst{31-27} = 0b11110; 1230 let Inst{25} = 1; 1231 let Inst{24-20} = 0b11100; 1232 let Inst{15} = 0; 1233} |
813 814// FIXME: A8.6.18 BFI - Bitfield insert (Encoding T1) 815 | 1234 1235// FIXME: A8.6.18 BFI - Bitfield insert (Encoding T1) 1236 |
816defm t2ORN : T2I_bin_irs<"orn", BinOpFrag<(or node:$LHS, (not node:$RHS))>>; | 1237defm t2ORN : T2I_bin_irs<0b0011, "orn", BinOpFrag<(or node:$LHS, 1238 (not node:$RHS))>>; |
817 818// Prefer over of t2EORri ra, rb, -1 because mvn has 16-bit version 819let AddedComplexity = 1 in | 1239 1240// Prefer over of t2EORri ra, rb, -1 because mvn has 16-bit version 1241let AddedComplexity = 1 in |
820defm t2MVN : T2I_un_irs <"mvn", UnOpFrag<(not node:$Src)>, 1, 1>; | 1242defm t2MVN : T2I_un_irs <0b0011, "mvn", UnOpFrag<(not node:$Src)>, 1, 1>; |
821 822 823def : T2Pat<(and GPR:$src, t2_so_imm_not:$imm), 824 (t2BICri GPR:$src, t2_so_imm_not:$imm)>; 825 826// FIXME: Disable this pattern on Darwin to workaround an assembler bug. 827def : T2Pat<(or GPR:$src, t2_so_imm_not:$imm), 828 (t2ORNri GPR:$src, t2_so_imm_not:$imm)>, 829 Requires<[IsThumb2]>; 830 831def : T2Pat<(t2_so_imm_not:$src), 832 (t2MVNi t2_so_imm_not:$src)>; 833 834//===----------------------------------------------------------------------===// 835// Multiply Instructions. 836// 837let isCommutable = 1 in 838def t2MUL: T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b), IIC_iMUL32, 839 "mul", "\t$dst, $a, $b", | 1243 1244 1245def : T2Pat<(and GPR:$src, t2_so_imm_not:$imm), 1246 (t2BICri GPR:$src, t2_so_imm_not:$imm)>; 1247 1248// FIXME: Disable this pattern on Darwin to workaround an assembler bug. 1249def : T2Pat<(or GPR:$src, t2_so_imm_not:$imm), 1250 (t2ORNri GPR:$src, t2_so_imm_not:$imm)>, 1251 Requires<[IsThumb2]>; 1252 1253def : T2Pat<(t2_so_imm_not:$src), 1254 (t2MVNi t2_so_imm_not:$src)>; 1255 1256//===----------------------------------------------------------------------===// 1257// Multiply Instructions. 1258// 1259let isCommutable = 1 in 1260def t2MUL: T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b), IIC_iMUL32, 1261 "mul", "\t$dst, $a, $b", |
840 [(set GPR:$dst, (mul GPR:$a, GPR:$b))]>; | 1262 [(set GPR:$dst, (mul GPR:$a, GPR:$b))]> { 1263 let Inst{31-27} = 0b11111; 1264 let Inst{26-23} = 0b0110; 1265 let Inst{22-20} = 0b000; 1266 let Inst{15-12} = 0b1111; // Ra = 0b1111 (no accumulate) 1267 let Inst{7-4} = 0b0000; // Multiply 1268} |
841 842def t2MLA: T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$c), IIC_iMAC32, 843 "mla", "\t$dst, $a, $b, $c", | 1269 1270def t2MLA: T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$c), IIC_iMAC32, 1271 "mla", "\t$dst, $a, $b, $c", |
844 [(set GPR:$dst, (add (mul GPR:$a, GPR:$b), GPR:$c))]>; | 1272 [(set GPR:$dst, (add (mul GPR:$a, GPR:$b), GPR:$c))]> { 1273 let Inst{31-27} = 0b11111; 1274 let Inst{26-23} = 0b0110; 1275 let Inst{22-20} = 0b000; 1276 let Inst{15-12} = {?, ?, ?, ?}; // Ra 1277 let Inst{7-4} = 0b0000; // Multiply 1278} |
845 846def t2MLS: T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$c), IIC_iMAC32, 847 "mls", "\t$dst, $a, $b, $c", | 1279 1280def t2MLS: T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$c), IIC_iMAC32, 1281 "mls", "\t$dst, $a, $b, $c", |
848 [(set GPR:$dst, (sub GPR:$c, (mul GPR:$a, GPR:$b)))]>; | 1282 [(set GPR:$dst, (sub GPR:$c, (mul GPR:$a, GPR:$b)))]> { 1283 let Inst{31-27} = 0b11111; 1284 let Inst{26-23} = 0b0110; 1285 let Inst{22-20} = 0b000; 1286 let Inst{15-12} = {?, ?, ?, ?}; // Ra 1287 let Inst{7-4} = 0b0001; // Multiply and Subtract 1288} |
849 850// Extra precision multiplies with low / high results 851let neverHasSideEffects = 1 in { 852let isCommutable = 1 in { 853def t2SMULL : T2I<(outs GPR:$ldst, GPR:$hdst), (ins GPR:$a, GPR:$b), IIC_iMUL64, | 1289 1290// Extra precision multiplies with low / high results 1291let neverHasSideEffects = 1 in { 1292let isCommutable = 1 in { 1293def t2SMULL : T2I<(outs GPR:$ldst, GPR:$hdst), (ins GPR:$a, GPR:$b), IIC_iMUL64, |
854 "smull", "\t$ldst, $hdst, $a, $b", []>; | 1294 "smull", "\t$ldst, $hdst, $a, $b", []> { 1295 let Inst{31-27} = 0b11111; 1296 let Inst{26-23} = 0b0111; 1297 let Inst{22-20} = 0b000; 1298 let Inst{7-4} = 0b0000; 1299} |
855 856def t2UMULL : T2I<(outs GPR:$ldst, GPR:$hdst), (ins GPR:$a, GPR:$b), IIC_iMUL64, | 1300 1301def t2UMULL : T2I<(outs GPR:$ldst, GPR:$hdst), (ins GPR:$a, GPR:$b), IIC_iMUL64, |
857 "umull", "\t$ldst, $hdst, $a, $b", []>; | 1302 "umull", "\t$ldst, $hdst, $a, $b", []> { 1303 let Inst{31-27} = 0b11111; 1304 let Inst{26-23} = 0b0111; 1305 let Inst{22-20} = 0b010; 1306 let Inst{7-4} = 0b0000; |
858} | 1307} |
1308} // isCommutable |
|
859 860// Multiply + accumulate 861def t2SMLAL : T2I<(outs GPR:$ldst, GPR:$hdst), (ins GPR:$a, GPR:$b), IIC_iMAC64, | 1309 1310// Multiply + accumulate 1311def t2SMLAL : T2I<(outs GPR:$ldst, GPR:$hdst), (ins GPR:$a, GPR:$b), IIC_iMAC64, |
862 "smlal", "\t$ldst, $hdst, $a, $b", []>; | 1312 "smlal", "\t$ldst, $hdst, $a, $b", []>{ 1313 let Inst{31-27} = 0b11111; 1314 let Inst{26-23} = 0b0111; 1315 let Inst{22-20} = 0b100; 1316 let Inst{7-4} = 0b0000; 1317} |
863 864def t2UMLAL : T2I<(outs GPR:$ldst, GPR:$hdst), (ins GPR:$a, GPR:$b), IIC_iMAC64, | 1318 1319def t2UMLAL : T2I<(outs GPR:$ldst, GPR:$hdst), (ins GPR:$a, GPR:$b), IIC_iMAC64, |
865 "umlal", "\t$ldst, $hdst, $a, $b", []>; | 1320 "umlal", "\t$ldst, $hdst, $a, $b", []>{ 1321 let Inst{31-27} = 0b11111; 1322 let Inst{26-23} = 0b0111; 1323 let Inst{22-20} = 0b110; 1324 let Inst{7-4} = 0b0000; 1325} |
866 867def t2UMAAL : T2I<(outs GPR:$ldst, GPR:$hdst), (ins GPR:$a, GPR:$b), IIC_iMAC64, | 1326 1327def t2UMAAL : T2I<(outs GPR:$ldst, GPR:$hdst), (ins GPR:$a, GPR:$b), IIC_iMAC64, |
868 "umaal", "\t$ldst, $hdst, $a, $b", []>; | 1328 "umaal", "\t$ldst, $hdst, $a, $b", []>{ 1329 let Inst{31-27} = 0b11111; 1330 let Inst{26-23} = 0b0111; 1331 let Inst{22-20} = 0b110; 1332 let Inst{7-4} = 0b0110; 1333} |
869} // neverHasSideEffects 870 871// Most significant word multiply 872def t2SMMUL : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b), IIC_iMUL32, 873 "smmul", "\t$dst, $a, $b", | 1334} // neverHasSideEffects 1335 1336// Most significant word multiply 1337def t2SMMUL : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b), IIC_iMUL32, 1338 "smmul", "\t$dst, $a, $b", |
874 [(set GPR:$dst, (mulhs GPR:$a, GPR:$b))]>; | 1339 [(set GPR:$dst, (mulhs GPR:$a, GPR:$b))]> { 1340 let Inst{31-27} = 0b11111; 1341 let Inst{26-23} = 0b0110; 1342 let Inst{22-20} = 0b101; 1343 let Inst{15-12} = 0b1111; // Ra = 0b1111 (no accumulate) 1344 let Inst{7-4} = 0b0000; // No Rounding (Inst{4} = 0) 1345} |
875 876def t2SMMLA : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$c), IIC_iMAC32, 877 "smmla", "\t$dst, $a, $b, $c", | 1346 1347def t2SMMLA : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$c), IIC_iMAC32, 1348 "smmla", "\t$dst, $a, $b, $c", |
878 [(set GPR:$dst, (add (mulhs GPR:$a, GPR:$b), GPR:$c))]>; | 1349 [(set GPR:$dst, (add (mulhs GPR:$a, GPR:$b), GPR:$c))]> { 1350 let Inst{31-27} = 0b11111; 1351 let Inst{26-23} = 0b0110; 1352 let Inst{22-20} = 0b101; 1353 let Inst{15-12} = {?, ?, ?, ?}; // Ra 1354 let Inst{7-4} = 0b0000; // No Rounding (Inst{4} = 0) 1355} |
879 880 881def t2SMMLS : T2I <(outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$c), IIC_iMAC32, 882 "smmls", "\t$dst, $a, $b, $c", | 1356 1357 1358def t2SMMLS : T2I <(outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$c), IIC_iMAC32, 1359 "smmls", "\t$dst, $a, $b, $c", |
883 [(set GPR:$dst, (sub GPR:$c, (mulhs GPR:$a, GPR:$b)))]>; | 1360 [(set GPR:$dst, (sub GPR:$c, (mulhs GPR:$a, GPR:$b)))]> { 1361 let Inst{31-27} = 0b11111; 1362 let Inst{26-23} = 0b0110; 1363 let Inst{22-20} = 0b110; 1364 let Inst{15-12} = {?, ?, ?, ?}; // Ra 1365 let Inst{7-4} = 0b0000; // No Rounding (Inst{4} = 0) 1366} |
884 885multiclass T2I_smul<string opc, PatFrag opnode> { 886 def BB : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b), IIC_iMUL32, 887 !strconcat(opc, "bb"), "\t$dst, $a, $b", 888 [(set GPR:$dst, (opnode (sext_inreg GPR:$a, i16), | 1367 1368multiclass T2I_smul<string opc, PatFrag opnode> { 1369 def BB : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b), IIC_iMUL32, 1370 !strconcat(opc, "bb"), "\t$dst, $a, $b", 1371 [(set GPR:$dst, (opnode (sext_inreg GPR:$a, i16), |
889 (sext_inreg GPR:$b, i16)))]>; | 1372 (sext_inreg GPR:$b, i16)))]> { 1373 let Inst{31-27} = 0b11111; 1374 let Inst{26-23} = 0b0110; 1375 let Inst{22-20} = 0b001; 1376 let Inst{15-12} = 0b1111; // Ra = 0b1111 (no accumulate) 1377 let Inst{7-6} = 0b00; 1378 let Inst{5-4} = 0b00; 1379 } |
890 891 def BT : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b), IIC_iMUL32, 892 !strconcat(opc, "bt"), "\t$dst, $a, $b", 893 [(set GPR:$dst, (opnode (sext_inreg GPR:$a, i16), | 1380 1381 def BT : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b), IIC_iMUL32, 1382 !strconcat(opc, "bt"), "\t$dst, $a, $b", 1383 [(set GPR:$dst, (opnode (sext_inreg GPR:$a, i16), |
894 (sra GPR:$b, (i32 16))))]>; | 1384 (sra GPR:$b, (i32 16))))]> { 1385 let Inst{31-27} = 0b11111; 1386 let Inst{26-23} = 0b0110; 1387 let Inst{22-20} = 0b001; 1388 let Inst{15-12} = 0b1111; // Ra = 0b1111 (no accumulate) 1389 let Inst{7-6} = 0b00; 1390 let Inst{5-4} = 0b01; 1391 } |
895 896 def TB : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b), IIC_iMUL32, 897 !strconcat(opc, "tb"), "\t$dst, $a, $b", 898 [(set GPR:$dst, (opnode (sra GPR:$a, (i32 16)), | 1392 1393 def TB : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b), IIC_iMUL32, 1394 !strconcat(opc, "tb"), "\t$dst, $a, $b", 1395 [(set GPR:$dst, (opnode (sra GPR:$a, (i32 16)), |
899 (sext_inreg GPR:$b, i16)))]>; | 1396 (sext_inreg GPR:$b, i16)))]> { 1397 let Inst{31-27} = 0b11111; 1398 let Inst{26-23} = 0b0110; 1399 let Inst{22-20} = 0b001; 1400 let Inst{15-12} = 0b1111; // Ra = 0b1111 (no accumulate) 1401 let Inst{7-6} = 0b00; 1402 let Inst{5-4} = 0b10; 1403 } |
900 901 def TT : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b), IIC_iMUL32, 902 !strconcat(opc, "tt"), "\t$dst, $a, $b", 903 [(set GPR:$dst, (opnode (sra GPR:$a, (i32 16)), | 1404 1405 def TT : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b), IIC_iMUL32, 1406 !strconcat(opc, "tt"), "\t$dst, $a, $b", 1407 [(set GPR:$dst, (opnode (sra GPR:$a, (i32 16)), |
904 (sra GPR:$b, (i32 16))))]>; | 1408 (sra GPR:$b, (i32 16))))]> { 1409 let Inst{31-27} = 0b11111; 1410 let Inst{26-23} = 0b0110; 1411 let Inst{22-20} = 0b001; 1412 let Inst{15-12} = 0b1111; // Ra = 0b1111 (no accumulate) 1413 let Inst{7-6} = 0b00; 1414 let Inst{5-4} = 0b11; 1415 } |
905 906 def WB : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b), IIC_iMUL16, 907 !strconcat(opc, "wb"), "\t$dst, $a, $b", 908 [(set GPR:$dst, (sra (opnode GPR:$a, | 1416 1417 def WB : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b), IIC_iMUL16, 1418 !strconcat(opc, "wb"), "\t$dst, $a, $b", 1419 [(set GPR:$dst, (sra (opnode GPR:$a, |
909 (sext_inreg GPR:$b, i16)), (i32 16)))]>; | 1420 (sext_inreg GPR:$b, i16)), (i32 16)))]> { 1421 let Inst{31-27} = 0b11111; 1422 let Inst{26-23} = 0b0110; 1423 let Inst{22-20} = 0b011; 1424 let Inst{15-12} = 0b1111; // Ra = 0b1111 (no accumulate) 1425 let Inst{7-6} = 0b00; 1426 let Inst{5-4} = 0b00; 1427 } |
910 911 def WT : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b), IIC_iMUL16, 912 !strconcat(opc, "wt"), "\t$dst, $a, $b", 913 [(set GPR:$dst, (sra (opnode GPR:$a, | 1428 1429 def WT : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b), IIC_iMUL16, 1430 !strconcat(opc, "wt"), "\t$dst, $a, $b", 1431 [(set GPR:$dst, (sra (opnode GPR:$a, |
914 (sra GPR:$b, (i32 16))), (i32 16)))]>; | 1432 (sra GPR:$b, (i32 16))), (i32 16)))]> { 1433 let Inst{31-27} = 0b11111; 1434 let Inst{26-23} = 0b0110; 1435 let Inst{22-20} = 0b011; 1436 let Inst{15-12} = 0b1111; // Ra = 0b1111 (no accumulate) 1437 let Inst{7-6} = 0b00; 1438 let Inst{5-4} = 0b01; 1439 } |
915} 916 917 918multiclass T2I_smla<string opc, PatFrag opnode> { 919 def BB : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$acc), IIC_iMAC16, 920 !strconcat(opc, "bb"), "\t$dst, $a, $b, $acc", 921 [(set GPR:$dst, (add GPR:$acc, 922 (opnode (sext_inreg GPR:$a, i16), | 1440} 1441 1442 1443multiclass T2I_smla<string opc, PatFrag opnode> { 1444 def BB : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$acc), IIC_iMAC16, 1445 !strconcat(opc, "bb"), "\t$dst, $a, $b, $acc", 1446 [(set GPR:$dst, (add GPR:$acc, 1447 (opnode (sext_inreg GPR:$a, i16), |
923 (sext_inreg GPR:$b, i16))))]>; | 1448 (sext_inreg GPR:$b, i16))))]> { 1449 let Inst{31-27} = 0b11111; 1450 let Inst{26-23} = 0b0110; 1451 let Inst{22-20} = 0b001; 1452 let Inst{15-12} = {?, ?, ?, ?}; // Ra 1453 let Inst{7-6} = 0b00; 1454 let Inst{5-4} = 0b00; 1455 } |
924 925 def BT : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$acc), IIC_iMAC16, 926 !strconcat(opc, "bt"), "\t$dst, $a, $b, $acc", 927 [(set GPR:$dst, (add GPR:$acc, (opnode (sext_inreg GPR:$a, i16), | 1456 1457 def BT : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$acc), IIC_iMAC16, 1458 !strconcat(opc, "bt"), "\t$dst, $a, $b, $acc", 1459 [(set GPR:$dst, (add GPR:$acc, (opnode (sext_inreg GPR:$a, i16), |
928 (sra GPR:$b, (i32 16)))))]>; | 1460 (sra GPR:$b, (i32 16)))))]> { 1461 let Inst{31-27} = 0b11111; 1462 let Inst{26-23} = 0b0110; 1463 let Inst{22-20} = 0b001; 1464 let Inst{15-12} = {?, ?, ?, ?}; // Ra 1465 let Inst{7-6} = 0b00; 1466 let Inst{5-4} = 0b01; 1467 } |
929 930 def TB : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$acc), IIC_iMAC16, 931 !strconcat(opc, "tb"), "\t$dst, $a, $b, $acc", 932 [(set GPR:$dst, (add GPR:$acc, (opnode (sra GPR:$a, (i32 16)), | 1468 1469 def TB : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$acc), IIC_iMAC16, 1470 !strconcat(opc, "tb"), "\t$dst, $a, $b, $acc", 1471 [(set GPR:$dst, (add GPR:$acc, (opnode (sra GPR:$a, (i32 16)), |
933 (sext_inreg GPR:$b, i16))))]>; | 1472 (sext_inreg GPR:$b, i16))))]> { 1473 let Inst{31-27} = 0b11111; 1474 let Inst{26-23} = 0b0110; 1475 let Inst{22-20} = 0b001; 1476 let Inst{15-12} = {?, ?, ?, ?}; // Ra 1477 let Inst{7-6} = 0b00; 1478 let Inst{5-4} = 0b10; 1479 } |
934 935 def TT : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$acc), IIC_iMAC16, 936 !strconcat(opc, "tt"), "\t$dst, $a, $b, $acc", 937 [(set GPR:$dst, (add GPR:$acc, (opnode (sra GPR:$a, (i32 16)), | 1480 1481 def TT : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$acc), IIC_iMAC16, 1482 !strconcat(opc, "tt"), "\t$dst, $a, $b, $acc", 1483 [(set GPR:$dst, (add GPR:$acc, (opnode (sra GPR:$a, (i32 16)), |
938 (sra GPR:$b, (i32 16)))))]>; | 1484 (sra GPR:$b, (i32 16)))))]> { 1485 let Inst{31-27} = 0b11111; 1486 let Inst{26-23} = 0b0110; 1487 let Inst{22-20} = 0b001; 1488 let Inst{15-12} = {?, ?, ?, ?}; // Ra 1489 let Inst{7-6} = 0b00; 1490 let Inst{5-4} = 0b11; 1491 } |
939 940 def WB : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$acc), IIC_iMAC16, 941 !strconcat(opc, "wb"), "\t$dst, $a, $b, $acc", 942 [(set GPR:$dst, (add GPR:$acc, (sra (opnode GPR:$a, | 1492 1493 def WB : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$acc), IIC_iMAC16, 1494 !strconcat(opc, "wb"), "\t$dst, $a, $b, $acc", 1495 [(set GPR:$dst, (add GPR:$acc, (sra (opnode GPR:$a, |
943 (sext_inreg GPR:$b, i16)), (i32 16))))]>; | 1496 (sext_inreg GPR:$b, i16)), (i32 16))))]> { 1497 let Inst{31-27} = 0b11111; 1498 let Inst{26-23} = 0b0110; 1499 let Inst{22-20} = 0b011; 1500 let Inst{15-12} = {?, ?, ?, ?}; // Ra 1501 let Inst{7-6} = 0b00; 1502 let Inst{5-4} = 0b00; 1503 } |
944 945 def WT : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$acc), IIC_iMAC16, 946 !strconcat(opc, "wt"), "\t$dst, $a, $b, $acc", 947 [(set GPR:$dst, (add GPR:$acc, (sra (opnode GPR:$a, | 1504 1505 def WT : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$acc), IIC_iMAC16, 1506 !strconcat(opc, "wt"), "\t$dst, $a, $b, $acc", 1507 [(set GPR:$dst, (add GPR:$acc, (sra (opnode GPR:$a, |
948 (sra GPR:$b, (i32 16))), (i32 16))))]>; | 1508 (sra GPR:$b, (i32 16))), (i32 16))))]> { 1509 let Inst{31-27} = 0b11111; 1510 let Inst{26-23} = 0b0110; 1511 let Inst{22-20} = 0b011; 1512 let Inst{15-12} = {?, ?, ?, ?}; // Ra 1513 let Inst{7-6} = 0b00; 1514 let Inst{5-4} = 0b01; 1515 } |
949} 950 951defm t2SMUL : T2I_smul<"smul", BinOpFrag<(mul node:$LHS, node:$RHS)>>; 952defm t2SMLA : T2I_smla<"smla", BinOpFrag<(mul node:$LHS, node:$RHS)>>; 953 954// TODO: Halfword multiple accumulate long: SMLAL<x><y> 955// TODO: Dual halfword multiple: SMUAD, SMUSD, SMLAD, SMLSD, SMLALD, SMLSLD 956 957 958//===----------------------------------------------------------------------===// 959// Misc. Arithmetic Instructions. 960// 961 | 1516} 1517 1518defm t2SMUL : T2I_smul<"smul", BinOpFrag<(mul node:$LHS, node:$RHS)>>; 1519defm t2SMLA : T2I_smla<"smla", BinOpFrag<(mul node:$LHS, node:$RHS)>>; 1520 1521// TODO: Halfword multiple accumulate long: SMLAL<x><y> 1522// TODO: Dual halfword multiple: SMUAD, SMUSD, SMLAD, SMLSD, SMLALD, SMLSLD 1523 1524 1525//===----------------------------------------------------------------------===// 1526// Misc. Arithmetic Instructions. 1527// 1528 |
962def t2CLZ : T2I<(outs GPR:$dst), (ins GPR:$src), IIC_iUNAr, 963 "clz", "\t$dst, $src", 964 [(set GPR:$dst, (ctlz GPR:$src))]>; | 1529class T2I_misc<bits<2> op1, bits<2> op2, dag oops, dag iops, InstrItinClass itin, 1530 string opc, string asm, list<dag> pattern> 1531 : T2I<oops, iops, itin, opc, asm, pattern> { 1532 let Inst{31-27} = 0b11111; 1533 let Inst{26-22} = 0b01010; 1534 let Inst{21-20} = op1; 1535 let Inst{15-12} = 0b1111; 1536 let Inst{7-6} = 0b10; 1537 let Inst{5-4} = op2; 1538} |
965 | 1539 |
966def t2REV : T2I<(outs GPR:$dst), (ins GPR:$src), IIC_iUNAr, 967 "rev", ".w\t$dst, $src", 968 [(set GPR:$dst, (bswap GPR:$src))]>; | 1540def t2CLZ : T2I_misc<0b11, 0b00, (outs GPR:$dst), (ins GPR:$src), IIC_iUNAr, 1541 "clz", "\t$dst, $src", [(set GPR:$dst, (ctlz GPR:$src))]>; |
969 | 1542 |
970def t2REV16 : T2I<(outs GPR:$dst), (ins GPR:$src), IIC_iUNAr, 971 "rev16", ".w\t$dst, $src", | 1543def t2REV : T2I_misc<0b01, 0b00, (outs GPR:$dst), (ins GPR:$src), IIC_iUNAr, 1544 "rev", ".w\t$dst, $src", [(set GPR:$dst, (bswap GPR:$src))]>; 1545 1546def t2REV16 : T2I_misc<0b01, 0b01, (outs GPR:$dst), (ins GPR:$src), IIC_iUNAr, 1547 "rev16", ".w\t$dst, $src", |
972 [(set GPR:$dst, 973 (or (and (srl GPR:$src, (i32 8)), 0xFF), 974 (or (and (shl GPR:$src, (i32 8)), 0xFF00), 975 (or (and (srl GPR:$src, (i32 8)), 0xFF0000), 976 (and (shl GPR:$src, (i32 8)), 0xFF000000)))))]>; 977 | 1548 [(set GPR:$dst, 1549 (or (and (srl GPR:$src, (i32 8)), 0xFF), 1550 (or (and (shl GPR:$src, (i32 8)), 0xFF00), 1551 (or (and (srl GPR:$src, (i32 8)), 0xFF0000), 1552 (and (shl GPR:$src, (i32 8)), 0xFF000000)))))]>; 1553 |
978def t2REVSH : T2I<(outs GPR:$dst), (ins GPR:$src), IIC_iUNAr, 979 "revsh", ".w\t$dst, $src", | 1554def t2REVSH : T2I_misc<0b01, 0b11, (outs GPR:$dst), (ins GPR:$src), IIC_iUNAr, 1555 "revsh", ".w\t$dst, $src", |
980 [(set GPR:$dst, 981 (sext_inreg 982 (or (srl (and GPR:$src, 0xFF00), (i32 8)), 983 (shl GPR:$src, (i32 8))), i16))]>; 984 985def t2PKHBT : T2I<(outs GPR:$dst), (ins GPR:$src1, GPR:$src2, i32imm:$shamt), 986 IIC_iALUsi, "pkhbt", "\t$dst, $src1, $src2, LSL $shamt", 987 [(set GPR:$dst, (or (and GPR:$src1, 0xFFFF), 988 (and (shl GPR:$src2, (i32 imm:$shamt)), | 1556 [(set GPR:$dst, 1557 (sext_inreg 1558 (or (srl (and GPR:$src, 0xFF00), (i32 8)), 1559 (shl GPR:$src, (i32 8))), i16))]>; 1560 1561def t2PKHBT : T2I<(outs GPR:$dst), (ins GPR:$src1, GPR:$src2, i32imm:$shamt), 1562 IIC_iALUsi, "pkhbt", "\t$dst, $src1, $src2, LSL $shamt", 1563 [(set GPR:$dst, (or (and GPR:$src1, 0xFFFF), 1564 (and (shl GPR:$src2, (i32 imm:$shamt)), |
989 0xFFFF0000)))]>; | 1565 0xFFFF0000)))]> { 1566 let Inst{31-27} = 0b11101; 1567 let Inst{26-25} = 0b01; 1568 let Inst{24-20} = 0b01100; 1569 let Inst{5} = 0; // BT form 1570 let Inst{4} = 0; 1571} |
990 991// Alternate cases for PKHBT where identities eliminate some nodes. 992def : T2Pat<(or (and GPR:$src1, 0xFFFF), (and GPR:$src2, 0xFFFF0000)), 993 (t2PKHBT GPR:$src1, GPR:$src2, 0)>; 994def : T2Pat<(or (and GPR:$src1, 0xFFFF), (shl GPR:$src2, imm16_31:$shamt)), 995 (t2PKHBT GPR:$src1, GPR:$src2, imm16_31:$shamt)>; 996 997def t2PKHTB : T2I<(outs GPR:$dst), (ins GPR:$src1, GPR:$src2, i32imm:$shamt), 998 IIC_iALUsi, "pkhtb", "\t$dst, $src1, $src2, ASR $shamt", 999 [(set GPR:$dst, (or (and GPR:$src1, 0xFFFF0000), 1000 (and (sra GPR:$src2, imm16_31:$shamt), | 1572 1573// Alternate cases for PKHBT where identities eliminate some nodes. 1574def : T2Pat<(or (and GPR:$src1, 0xFFFF), (and GPR:$src2, 0xFFFF0000)), 1575 (t2PKHBT GPR:$src1, GPR:$src2, 0)>; 1576def : T2Pat<(or (and GPR:$src1, 0xFFFF), (shl GPR:$src2, imm16_31:$shamt)), 1577 (t2PKHBT GPR:$src1, GPR:$src2, imm16_31:$shamt)>; 1578 1579def t2PKHTB : T2I<(outs GPR:$dst), (ins GPR:$src1, GPR:$src2, i32imm:$shamt), 1580 IIC_iALUsi, "pkhtb", "\t$dst, $src1, $src2, ASR $shamt", 1581 [(set GPR:$dst, (or (and GPR:$src1, 0xFFFF0000), 1582 (and (sra GPR:$src2, imm16_31:$shamt), |
1001 0xFFFF)))]>; | 1583 0xFFFF)))]> { 1584 let Inst{31-27} = 0b11101; 1585 let Inst{26-25} = 0b01; 1586 let Inst{24-20} = 0b01100; 1587 let Inst{5} = 1; // TB form 1588 let Inst{4} = 0; 1589} |
1002 1003// Alternate cases for PKHTB where identities eliminate some nodes. Note that 1004// a shift amount of 0 is *not legal* here, it is PKHBT instead. 1005def : T2Pat<(or (and GPR:$src1, 0xFFFF0000), (srl GPR:$src2, (i32 16))), 1006 (t2PKHTB GPR:$src1, GPR:$src2, 16)>; 1007def : T2Pat<(or (and GPR:$src1, 0xFFFF0000), 1008 (and (srl GPR:$src2, imm1_15:$shamt), 0xFFFF)), 1009 (t2PKHTB GPR:$src1, GPR:$src2, imm1_15:$shamt)>; 1010 1011//===----------------------------------------------------------------------===// 1012// Comparison Instructions... 1013// 1014 | 1590 1591// Alternate cases for PKHTB where identities eliminate some nodes. Note that 1592// a shift amount of 0 is *not legal* here, it is PKHBT instead. 1593def : T2Pat<(or (and GPR:$src1, 0xFFFF0000), (srl GPR:$src2, (i32 16))), 1594 (t2PKHTB GPR:$src1, GPR:$src2, 16)>; 1595def : T2Pat<(or (and GPR:$src1, 0xFFFF0000), 1596 (and (srl GPR:$src2, imm1_15:$shamt), 0xFFFF)), 1597 (t2PKHTB GPR:$src1, GPR:$src2, imm1_15:$shamt)>; 1598 1599//===----------------------------------------------------------------------===// 1600// Comparison Instructions... 1601// 1602 |
1015defm t2CMP : T2I_cmp_is<"cmp", 1016 BinOpFrag<(ARMcmp node:$LHS, node:$RHS)>>; 1017defm t2CMPz : T2I_cmp_is<"cmp", 1018 BinOpFrag<(ARMcmpZ node:$LHS, node:$RHS)>>; | 1603defm t2CMP : T2I_cmp_irs<0b1101, "cmp", 1604 BinOpFrag<(ARMcmp node:$LHS, node:$RHS)>>; 1605defm t2CMPz : T2I_cmp_irs<0b1101, "cmp", 1606 BinOpFrag<(ARMcmpZ node:$LHS, node:$RHS)>>; |
1019 | 1607 |
1020defm t2CMN : T2I_cmp_is<"cmn", 1021 BinOpFrag<(ARMcmp node:$LHS,(ineg node:$RHS))>>; 1022defm t2CMNz : T2I_cmp_is<"cmn", 1023 BinOpFrag<(ARMcmpZ node:$LHS,(ineg node:$RHS))>>; | 1608defm t2CMN : T2I_cmp_irs<0b1000, "cmn", 1609 BinOpFrag<(ARMcmp node:$LHS,(ineg node:$RHS))>>; 1610defm t2CMNz : T2I_cmp_irs<0b1000, "cmn", 1611 BinOpFrag<(ARMcmpZ node:$LHS,(ineg node:$RHS))>>; |
1024 1025def : T2Pat<(ARMcmp GPR:$src, t2_so_imm_neg:$imm), 1026 (t2CMNri GPR:$src, t2_so_imm_neg:$imm)>; 1027 1028def : T2Pat<(ARMcmpZ GPR:$src, t2_so_imm_neg:$imm), 1029 (t2CMNri GPR:$src, t2_so_imm_neg:$imm)>; 1030 | 1612 1613def : T2Pat<(ARMcmp GPR:$src, t2_so_imm_neg:$imm), 1614 (t2CMNri GPR:$src, t2_so_imm_neg:$imm)>; 1615 1616def : T2Pat<(ARMcmpZ GPR:$src, t2_so_imm_neg:$imm), 1617 (t2CMNri GPR:$src, t2_so_imm_neg:$imm)>; 1618 |
1031defm t2TST : T2I_cmp_is<"tst", 1032 BinOpFrag<(ARMcmpZ (and node:$LHS, node:$RHS), 0)>>; 1033defm t2TEQ : T2I_cmp_is<"teq", 1034 BinOpFrag<(ARMcmpZ (xor node:$LHS, node:$RHS), 0)>>; | 1619defm t2TST : T2I_cmp_irs<0b0000, "tst", 1620 BinOpFrag<(ARMcmpZ (and node:$LHS, node:$RHS), 0)>>; 1621defm t2TEQ : T2I_cmp_irs<0b0100, "teq", 1622 BinOpFrag<(ARMcmpZ (xor node:$LHS, node:$RHS), 0)>>; |
1035 1036// A8.6.27 CBNZ, CBZ - Compare and branch on (non)zero. 1037// Short range conditional branch. Looks awesome for loops. Need to figure 1038// out how to use this one. 1039 1040 1041// Conditional moves 1042// FIXME: should be able to write a pattern for ARMcmov, but can't use 1043// a two-value operand where a dag node expects two operands. :( 1044def t2MOVCCr : T2I<(outs GPR:$dst), (ins GPR:$false, GPR:$true), IIC_iCMOVr, 1045 "mov", ".w\t$dst, $true", 1046 [/*(set GPR:$dst, (ARMcmov GPR:$false, GPR:$true, imm:$cc, CCR:$ccr))*/]>, | 1623 1624// A8.6.27 CBNZ, CBZ - Compare and branch on (non)zero. 1625// Short range conditional branch. Looks awesome for loops. Need to figure 1626// out how to use this one. 1627 1628 1629// Conditional moves 1630// FIXME: should be able to write a pattern for ARMcmov, but can't use 1631// a two-value operand where a dag node expects two operands. :( 1632def t2MOVCCr : T2I<(outs GPR:$dst), (ins GPR:$false, GPR:$true), IIC_iCMOVr, 1633 "mov", ".w\t$dst, $true", 1634 [/*(set GPR:$dst, (ARMcmov GPR:$false, GPR:$true, imm:$cc, CCR:$ccr))*/]>, |
1047 RegConstraint<"$false = $dst">; | 1635 RegConstraint<"$false = $dst"> { 1636 let Inst{31-27} = 0b11101; 1637 let Inst{26-25} = 0b01; 1638 let Inst{24-21} = 0b0010; 1639 let Inst{20} = 0; // The S bit. 1640 let Inst{19-16} = 0b1111; // Rn 1641 let Inst{14-12} = 0b000; 1642 let Inst{7-4} = 0b0000; 1643} |
1048 1049def t2MOVCCi : T2I<(outs GPR:$dst), (ins GPR:$false, t2_so_imm:$true), 1050 IIC_iCMOVi, "mov", ".w\t$dst, $true", 1051[/*(set GPR:$dst, (ARMcmov GPR:$false, t2_so_imm:$true, imm:$cc, CCR:$ccr))*/]>, | 1644 1645def t2MOVCCi : T2I<(outs GPR:$dst), (ins GPR:$false, t2_so_imm:$true), 1646 IIC_iCMOVi, "mov", ".w\t$dst, $true", 1647[/*(set GPR:$dst, (ARMcmov GPR:$false, t2_so_imm:$true, imm:$cc, CCR:$ccr))*/]>, |
1052 RegConstraint<"$false = $dst">; | 1648 RegConstraint<"$false = $dst"> { 1649 let Inst{31-27} = 0b11110; 1650 let Inst{25} = 0; 1651 let Inst{24-21} = 0b0010; 1652 let Inst{20} = 0; // The S bit. 1653 let Inst{19-16} = 0b1111; // Rn 1654 let Inst{15} = 0; 1655} |
1053 | 1656 |
1054def t2MOVCClsl : T2I<(outs GPR:$dst), (ins GPR:$false, GPR:$true, i32imm:$rhs), 1055 IIC_iCMOVsi, "lsl", ".w\t$dst, $true, $rhs", []>, 1056 RegConstraint<"$false = $dst">; 1057def t2MOVCClsr : T2I<(outs GPR:$dst), (ins GPR:$false, GPR:$true, i32imm:$rhs), 1058 IIC_iCMOVsi, "lsr", ".w\t$dst, $true, $rhs", []>, 1059 RegConstraint<"$false = $dst">; 1060def t2MOVCCasr : T2I<(outs GPR:$dst), (ins GPR:$false, GPR:$true, i32imm:$rhs), 1061 IIC_iCMOVsi, "asr", ".w\t$dst, $true, $rhs", []>, 1062 RegConstraint<"$false = $dst">; 1063def t2MOVCCror : T2I<(outs GPR:$dst), (ins GPR:$false, GPR:$true, i32imm:$rhs), 1064 IIC_iCMOVsi, "ror", ".w\t$dst, $true, $rhs", []>, 1065 RegConstraint<"$false = $dst">; | 1657class T2I_movcc_sh<bits<2> opcod, dag oops, dag iops, InstrItinClass itin, 1658 string opc, string asm, list<dag> pattern> 1659 : T2I<oops, iops, itin, opc, asm, pattern> { 1660 let Inst{31-27} = 0b11101; 1661 let Inst{26-25} = 0b01; 1662 let Inst{24-21} = 0b0010; 1663 let Inst{20} = 0; // The S bit. 1664 let Inst{19-16} = 0b1111; // Rn 1665 let Inst{5-4} = opcod; // Shift type. 1666} 1667def t2MOVCClsl : T2I_movcc_sh<0b00, (outs GPR:$dst), 1668 (ins GPR:$false, GPR:$true, i32imm:$rhs), 1669 IIC_iCMOVsi, "lsl", ".w\t$dst, $true, $rhs", []>, 1670 RegConstraint<"$false = $dst">; 1671def t2MOVCClsr : T2I_movcc_sh<0b01, (outs GPR:$dst), 1672 (ins GPR:$false, GPR:$true, i32imm:$rhs), 1673 IIC_iCMOVsi, "lsr", ".w\t$dst, $true, $rhs", []>, 1674 RegConstraint<"$false = $dst">; 1675def t2MOVCCasr : T2I_movcc_sh<0b10, (outs GPR:$dst), 1676 (ins GPR:$false, GPR:$true, i32imm:$rhs), 1677 IIC_iCMOVsi, "asr", ".w\t$dst, $true, $rhs", []>, 1678 RegConstraint<"$false = $dst">; 1679def t2MOVCCror : T2I_movcc_sh<0b11, (outs GPR:$dst), 1680 (ins GPR:$false, GPR:$true, i32imm:$rhs), 1681 IIC_iCMOVsi, "ror", ".w\t$dst, $true, $rhs", []>, 1682 RegConstraint<"$false = $dst">; |
1066 1067//===----------------------------------------------------------------------===// 1068// Atomic operations intrinsics 1069// 1070 1071// memory barriers protect the atomic sequences 1072let hasSideEffects = 1 in { 1073def t2Int_MemBarrierV7 : AInoP<(outs), (ins), 1074 Pseudo, NoItinerary, 1075 "dmb", "", 1076 [(ARMMemBarrierV7)]>, 1077 Requires<[IsThumb2]> { | 1683 1684//===----------------------------------------------------------------------===// 1685// Atomic operations intrinsics 1686// 1687 1688// memory barriers protect the atomic sequences 1689let hasSideEffects = 1 in { 1690def t2Int_MemBarrierV7 : AInoP<(outs), (ins), 1691 Pseudo, NoItinerary, 1692 "dmb", "", 1693 [(ARMMemBarrierV7)]>, 1694 Requires<[IsThumb2]> { |
1695 let Inst{31-4} = 0xF3BF8F5; |
|
1078 // FIXME: add support for options other than a full system DMB | 1696 // FIXME: add support for options other than a full system DMB |
1697 let Inst{3-0} = 0b1111; |
|
1079} 1080 1081def t2Int_SyncBarrierV7 : AInoP<(outs), (ins), 1082 Pseudo, NoItinerary, 1083 "dsb", "", 1084 [(ARMSyncBarrierV7)]>, 1085 Requires<[IsThumb2]> { | 1698} 1699 1700def t2Int_SyncBarrierV7 : AInoP<(outs), (ins), 1701 Pseudo, NoItinerary, 1702 "dsb", "", 1703 [(ARMSyncBarrierV7)]>, 1704 Requires<[IsThumb2]> { |
1705 let Inst{31-4} = 0xF3BF8F4; |
|
1086 // FIXME: add support for options other than a full system DSB | 1706 // FIXME: add support for options other than a full system DSB |
1707 let Inst{3-0} = 0b1111; |
|
1087} 1088} 1089 | 1708} 1709} 1710 |
1711class T2I_ldrex<bits<2> opcod, dag oops, dag iops, AddrMode am, SizeFlagVal sz, 1712 InstrItinClass itin, string opc, string asm, string cstr, 1713 list<dag> pattern, bits<4> rt2 = 0b1111> 1714 : Thumb2I<oops, iops, am, sz, itin, opc, asm, cstr, pattern> { 1715 let Inst{31-27} = 0b11101; 1716 let Inst{26-20} = 0b0001101; 1717 let Inst{11-8} = rt2; 1718 let Inst{7-6} = 0b01; 1719 let Inst{5-4} = opcod; 1720 let Inst{3-0} = 0b1111; 1721} 1722class T2I_strex<bits<2> opcod, dag oops, dag iops, AddrMode am, SizeFlagVal sz, 1723 InstrItinClass itin, string opc, string asm, string cstr, 1724 list<dag> pattern, bits<4> rt2 = 0b1111> 1725 : Thumb2I<oops, iops, am, sz, itin, opc, asm, cstr, pattern> { 1726 let Inst{31-27} = 0b11101; 1727 let Inst{26-20} = 0b0001100; 1728 let Inst{11-8} = rt2; 1729 let Inst{7-6} = 0b01; 1730 let Inst{5-4} = opcod; 1731} 1732 |
|
1090let mayLoad = 1 in { | 1733let mayLoad = 1 in { |
1091def t2LDREXB : Thumb2I<(outs GPR:$dest), (ins GPR:$ptr), AddrModeNone, 1092 Size4Bytes, NoItinerary, 1093 "ldrexb", "\t$dest, [$ptr]", "", 1094 []>; 1095def t2LDREXH : Thumb2I<(outs GPR:$dest), (ins GPR:$ptr), AddrModeNone, 1096 Size4Bytes, NoItinerary, 1097 "ldrexh", "\t$dest, [$ptr]", "", 1098 []>; | 1734def t2LDREXB : T2I_ldrex<0b00, (outs GPR:$dest), (ins GPR:$ptr), AddrModeNone, 1735 Size4Bytes, NoItinerary, "ldrexb", "\t$dest, [$ptr]", 1736 "", []>; 1737def t2LDREXH : T2I_ldrex<0b01, (outs GPR:$dest), (ins GPR:$ptr), AddrModeNone, 1738 Size4Bytes, NoItinerary, "ldrexh", "\t$dest, [$ptr]", 1739 "", []>; |
1099def t2LDREX : Thumb2I<(outs GPR:$dest), (ins GPR:$ptr), AddrModeNone, | 1740def t2LDREX : Thumb2I<(outs GPR:$dest), (ins GPR:$ptr), AddrModeNone, |
1100 Size4Bytes, NoItinerary, 1101 "ldrex", "\t$dest, [$ptr]", "", 1102 []>; 1103def t2LDREXD : Thumb2I<(outs GPR:$dest, GPR:$dest2), (ins GPR:$ptr), 1104 AddrModeNone, Size4Bytes, NoItinerary, 1105 "ldrexd", "\t$dest, $dest2, [$ptr]", "", 1106 []>; | 1741 Size4Bytes, NoItinerary, 1742 "ldrex", "\t$dest, [$ptr]", "", 1743 []> { 1744 let Inst{31-27} = 0b11101; 1745 let Inst{26-20} = 0b0000101; 1746 let Inst{11-8} = 0b1111; 1747 let Inst{7-0} = 0b00000000; // imm8 = 0 |
1107} | 1748} |
1749def t2LDREXD : T2I_ldrex<0b11, (outs GPR:$dest, GPR:$dest2), (ins GPR:$ptr), 1750 AddrModeNone, Size4Bytes, NoItinerary, 1751 "ldrexd", "\t$dest, $dest2, [$ptr]", "", 1752 [], {?, ?, ?, ?}>; 1753} |
|
1108 | 1754 |
1109let mayStore = 1 in { 1110def t2STREXB : Thumb2I<(outs GPR:$success), (ins GPR:$src, GPR:$ptr), 1111 AddrModeNone, Size4Bytes, NoItinerary, 1112 "strexb", "\t$success, $src, [$ptr]", "", 1113 []>; 1114def t2STREXH : Thumb2I<(outs GPR:$success), (ins GPR:$src, GPR:$ptr), 1115 AddrModeNone, Size4Bytes, NoItinerary, 1116 "strexh", "\t$success, $src, [$ptr]", "", 1117 []>; | 1755let mayStore = 1, Constraints = "@earlyclobber $success" in { 1756def t2STREXB : T2I_strex<0b00, (outs GPR:$success), (ins GPR:$src, GPR:$ptr), 1757 AddrModeNone, Size4Bytes, NoItinerary, 1758 "strexb", "\t$success, $src, [$ptr]", "", []>; 1759def t2STREXH : T2I_strex<0b01, (outs GPR:$success), (ins GPR:$src, GPR:$ptr), 1760 AddrModeNone, Size4Bytes, NoItinerary, 1761 "strexh", "\t$success, $src, [$ptr]", "", []>; |
1118def t2STREX : Thumb2I<(outs GPR:$success), (ins GPR:$src, GPR:$ptr), | 1762def t2STREX : Thumb2I<(outs GPR:$success), (ins GPR:$src, GPR:$ptr), |
1119 AddrModeNone, Size4Bytes, NoItinerary, 1120 "strex", "\t$success, $src, [$ptr]", "", 1121 []>; 1122def t2STREXD : Thumb2I<(outs GPR:$success), 1123 (ins GPR:$src, GPR:$src2, GPR:$ptr), 1124 AddrModeNone, Size4Bytes, NoItinerary, 1125 "strexd", "\t$success, $src, $src2, [$ptr]", "", 1126 []>; | 1763 AddrModeNone, Size4Bytes, NoItinerary, 1764 "strex", "\t$success, $src, [$ptr]", "", 1765 []> { 1766 let Inst{31-27} = 0b11101; 1767 let Inst{26-20} = 0b0000100; 1768 let Inst{7-0} = 0b00000000; // imm8 = 0 |
1127} | 1769} |
1770def t2STREXD : T2I_strex<0b11, (outs GPR:$success), 1771 (ins GPR:$src, GPR:$src2, GPR:$ptr), 1772 AddrModeNone, Size4Bytes, NoItinerary, 1773 "strexd", "\t$success, $src, $src2, [$ptr]", "", [], 1774 {?, ?, ?, ?}>; 1775} |
|
1128 1129//===----------------------------------------------------------------------===// 1130// TLS Instructions 1131// 1132 1133// __aeabi_read_tp preserves the registers r1-r3. 1134let isCall = 1, 1135 Defs = [R0, R12, LR, CPSR] in { 1136 def t2TPsoft : T2XI<(outs), (ins), IIC_Br, 1137 "bl\t__aeabi_read_tp", | 1776 1777//===----------------------------------------------------------------------===// 1778// TLS Instructions 1779// 1780 1781// __aeabi_read_tp preserves the registers r1-r3. 1782let isCall = 1, 1783 Defs = [R0, R12, LR, CPSR] in { 1784 def t2TPsoft : T2XI<(outs), (ins), IIC_Br, 1785 "bl\t__aeabi_read_tp", |
1138 [(set R0, ARMthread_pointer)]>; | 1786 [(set R0, ARMthread_pointer)]> { 1787 let Inst{31-27} = 0b11110; 1788 let Inst{15-14} = 0b11; 1789 let Inst{12} = 1; 1790 } |
1139} 1140 1141//===----------------------------------------------------------------------===// 1142// SJLJ Exception handling intrinsics 1143// eh_sjlj_setjmp() is an instruction sequence to store the return 1144// address and save #0 in R0 for the non-longjmp case. 1145// Since by its nature we may be coming from some other function to get 1146// here, and we're using the stack frame for the containing function to --- 31 unchanged lines hidden (view full) --- 1178// FIXME: $dst1 should be a def. But the extra ops must be in the end of the 1179// operand list. 1180// FIXME: Should pc be an implicit operand like PICADD, etc? 1181let isReturn = 1, isTerminator = 1, isBarrier = 1, mayLoad = 1, 1182 hasExtraDefRegAllocReq = 1 in 1183 def t2LDM_RET : T2XI<(outs), 1184 (ins addrmode4:$addr, pred:$p, reglist:$wb, variable_ops), 1185 IIC_Br, "ldm${addr:submode}${p}${addr:wide}\t$addr, $wb", | 1791} 1792 1793//===----------------------------------------------------------------------===// 1794// SJLJ Exception handling intrinsics 1795// eh_sjlj_setjmp() is an instruction sequence to store the return 1796// address and save #0 in R0 for the non-longjmp case. 1797// Since by its nature we may be coming from some other function to get 1798// here, and we're using the stack frame for the containing function to --- 31 unchanged lines hidden (view full) --- 1830// FIXME: $dst1 should be a def. But the extra ops must be in the end of the 1831// operand list. 1832// FIXME: Should pc be an implicit operand like PICADD, etc? 1833let isReturn = 1, isTerminator = 1, isBarrier = 1, mayLoad = 1, 1834 hasExtraDefRegAllocReq = 1 in 1835 def t2LDM_RET : T2XI<(outs), 1836 (ins addrmode4:$addr, pred:$p, reglist:$wb, variable_ops), 1837 IIC_Br, "ldm${addr:submode}${p}${addr:wide}\t$addr, $wb", |
1186 []>; | 1838 []> { 1839 let Inst{31-27} = 0b11101; 1840 let Inst{26-25} = 0b00; 1841 let Inst{24-23} = {?, ?}; // IA: '01', DB: '10' 1842 let Inst{22} = 0; 1843 let Inst{21} = ?; // The W bit. 1844 let Inst{20} = 1; // Load 1845} |
1187 1188let isBranch = 1, isTerminator = 1, isBarrier = 1 in { 1189let isPredicable = 1 in 1190def t2B : T2XI<(outs), (ins brtarget:$target), IIC_Br, 1191 "b.w\t$target", | 1846 1847let isBranch = 1, isTerminator = 1, isBarrier = 1 in { 1848let isPredicable = 1 in 1849def t2B : T2XI<(outs), (ins brtarget:$target), IIC_Br, 1850 "b.w\t$target", |
1192 [(br bb:$target)]>; | 1851 [(br bb:$target)]> { 1852 let Inst{31-27} = 0b11110; 1853 let Inst{15-14} = 0b10; 1854 let Inst{12} = 1; 1855} |
1193 1194let isNotDuplicable = 1, isIndirectBranch = 1 in { 1195def t2BR_JT : 1196 T2JTI<(outs), 1197 (ins GPR:$target, GPR:$index, jt2block_operand:$jt, i32imm:$id), 1198 IIC_Br, "mov\tpc, $target\n$jt", | 1856 1857let isNotDuplicable = 1, isIndirectBranch = 1 in { 1858def t2BR_JT : 1859 T2JTI<(outs), 1860 (ins GPR:$target, GPR:$index, jt2block_operand:$jt, i32imm:$id), 1861 IIC_Br, "mov\tpc, $target\n$jt", |
1199 [(ARMbr2jt GPR:$target, GPR:$index, tjumptable:$jt, imm:$id)]>; | 1862 [(ARMbr2jt GPR:$target, GPR:$index, tjumptable:$jt, imm:$id)]> { 1863 let Inst{31-27} = 0b11101; 1864 let Inst{26-20} = 0b0100100; 1865 let Inst{19-16} = 0b1111; 1866 let Inst{14-12} = 0b000; 1867 let Inst{11-8} = 0b1111; // Rd = pc 1868 let Inst{7-4} = 0b0000; 1869} |
1200 1201// FIXME: Add a non-pc based case that can be predicated. 1202def t2TBB : 1203 T2JTI<(outs), 1204 (ins tb_addrmode:$index, jt2block_operand:$jt, i32imm:$id), | 1870 1871// FIXME: Add a non-pc based case that can be predicated. 1872def t2TBB : 1873 T2JTI<(outs), 1874 (ins tb_addrmode:$index, jt2block_operand:$jt, i32imm:$id), |
1205 IIC_Br, "tbb\t$index\n$jt", []>; | 1875 IIC_Br, "tbb\t$index\n$jt", []> { 1876 let Inst{31-27} = 0b11101; 1877 let Inst{26-20} = 0b0001101; 1878 let Inst{19-16} = 0b1111; // Rn = pc (table follows this instruction) 1879 let Inst{15-8} = 0b11110000; 1880 let Inst{7-4} = 0b0000; // B form 1881} |
1206 1207def t2TBH : 1208 T2JTI<(outs), 1209 (ins tb_addrmode:$index, jt2block_operand:$jt, i32imm:$id), | 1882 1883def t2TBH : 1884 T2JTI<(outs), 1885 (ins tb_addrmode:$index, jt2block_operand:$jt, i32imm:$id), |
1210 IIC_Br, "tbh\t$index\n$jt", []>; | 1886 IIC_Br, "tbh\t$index\n$jt", []> { 1887 let Inst{31-27} = 0b11101; 1888 let Inst{26-20} = 0b0001101; 1889 let Inst{19-16} = 0b1111; // Rn = pc (table follows this instruction) 1890 let Inst{15-8} = 0b11110000; 1891 let Inst{7-4} = 0b0001; // H form 1892} |
1211} // isNotDuplicable, isIndirectBranch 1212 1213} // isBranch, isTerminator, isBarrier 1214 1215// FIXME: should be able to write a pattern for ARMBrcond, but can't use 1216// a two-value operand where a dag node expects two operands. :( 1217let isBranch = 1, isTerminator = 1 in 1218def t2Bcc : T2I<(outs), (ins brtarget:$target), IIC_Br, 1219 "b", ".w\t$target", | 1893} // isNotDuplicable, isIndirectBranch 1894 1895} // isBranch, isTerminator, isBarrier 1896 1897// FIXME: should be able to write a pattern for ARMBrcond, but can't use 1898// a two-value operand where a dag node expects two operands. :( 1899let isBranch = 1, isTerminator = 1 in 1900def t2Bcc : T2I<(outs), (ins brtarget:$target), IIC_Br, 1901 "b", ".w\t$target", |
1220 [/*(ARMbrcond bb:$target, imm:$cc)*/]>; | 1902 [/*(ARMbrcond bb:$target, imm:$cc)*/]> { 1903 let Inst{31-27} = 0b11110; 1904 let Inst{15-14} = 0b10; 1905 let Inst{12} = 0; 1906} |
1221 1222 1223// IT block 1224def t2IT : Thumb2XI<(outs), (ins it_pred:$cc, it_mask:$mask), 1225 AddrModeNone, Size2Bytes, IIC_iALUx, | 1907 1908 1909// IT block 1910def t2IT : Thumb2XI<(outs), (ins it_pred:$cc, it_mask:$mask), 1911 AddrModeNone, Size2Bytes, IIC_iALUx, |
1226 "it$mask\t$cc", "", []>; | 1912 "it$mask\t$cc", "", []> { 1913 // 16-bit instruction. 1914 let Inst{31-16} = 0x0000; 1915 let Inst{15-8} = 0b10111111; 1916} |
1227 1228//===----------------------------------------------------------------------===// 1229// Non-Instruction Patterns 1230// 1231 1232// Two piece so_imms. 1233def : T2Pat<(or GPR:$LHS, t2_so_imm2part:$RHS), 1234 (t2ORRri (t2ORRri GPR:$LHS, (t2_so_imm2part_1 imm:$RHS)), --- 38 unchanged lines hidden --- | 1917 1918//===----------------------------------------------------------------------===// 1919// Non-Instruction Patterns 1920// 1921 1922// Two piece so_imms. 1923def : T2Pat<(or GPR:$LHS, t2_so_imm2part:$RHS), 1924 (t2ORRri (t2ORRri GPR:$LHS, (t2_so_imm2part_1 imm:$RHS)), --- 38 unchanged lines hidden --- |