LLVM 23.0.0git
AVRISelLowering.cpp
Go to the documentation of this file.
1//===-- AVRISelLowering.cpp - AVR DAG Lowering Implementation -------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the interfaces that AVR uses to lower LLVM code into a
10// selection DAG.
11//
12//===----------------------------------------------------------------------===//
13
14#include "AVRISelLowering.h"
15
16#include "llvm/ADT/ArrayRef.h"
24#include "llvm/IR/Function.h"
26
27#include "AVR.h"
29#include "AVRSubtarget.h"
30#include "AVRTargetMachine.h"
32
33namespace llvm {
34
36 const AVRSubtarget &STI)
37 : TargetLowering(TM, STI), Subtarget(STI) {
38 // Set up the register classes.
39 addRegisterClass(MVT::i8, &AVR::GPR8RegClass);
40 addRegisterClass(MVT::i16, &AVR::DREGSRegClass);
41
42 // Compute derived properties from the register classes.
43 computeRegisterProperties(Subtarget.getRegisterInfo());
44
50
53
58
60
61 for (MVT VT : MVT::integer_valuetypes()) {
62 for (auto N : {ISD::EXTLOAD, ISD::SEXTLOAD, ISD::ZEXTLOAD}) {
63 setLoadExtAction(N, VT, MVT::i1, Promote);
64 setLoadExtAction(N, VT, MVT::i8, Expand);
65 }
66 }
67
68 setTruncStoreAction(MVT::i16, MVT::i8, Expand);
69
70 for (MVT VT : MVT::integer_valuetypes()) {
75 }
76
77 // sub (x, imm) gets canonicalized to add (x, -imm), so for illegal types
78 // revert into a sub since we don't have an add with immediate instruction.
81
82 // our shift instructions are only able to shift 1 bit at a time, so handle
83 // this in a custom way.
96
101
107
118
120
121 // Add support for postincrement and predecrement load/stores.
130
132
137
138 // Atomic operations which must be lowered to rtlib calls
139 for (MVT VT : MVT::integer_valuetypes()) {
147 }
148
149 // Division/remainder
158
159 // Make division and modulus custom
166
167 // Do not use MUL. The AVR instructions are closer to SMUL_LOHI &co.
170
171 // Expand 16 bit multiplications.
174
175 // Expand multiplications to libcalls when there is
176 // no hardware MUL.
177 if (!Subtarget.supportsMultiplication()) {
180 }
181
182 for (MVT VT : MVT::integer_valuetypes()) {
185 }
186
187 for (MVT VT : MVT::integer_valuetypes()) {
191 }
192
193 for (MVT VT : MVT::integer_valuetypes()) {
195 // TODO: The generated code is pretty poor. Investigate using the
196 // same "shift and subtract with carry" trick that we do for
197 // extending 8-bit to 16-bit. This may require infrastructure
198 // improvements in how we treat 16-bit "registers" to be feasible.
199 }
200
203}
204
206 EVT VT) const {
207 assert(!VT.isVector() && "No AVR SetCC type for vectors!");
208 return MVT::i8;
209}
210
211SDValue AVRTargetLowering::LowerShifts(SDValue Op, SelectionDAG &DAG) const {
212 unsigned Opc8;
213 const SDNode *N = Op.getNode();
214 EVT VT = Op.getValueType();
215 SDLoc dl(N);
217 "Expected power-of-2 shift amount");
218
219 if (VT.getSizeInBits() == 32) {
220 if (!isa<ConstantSDNode>(N->getOperand(1))) {
221 // 32-bit shifts are converted to a loop in IR.
222 // This should be unreachable.
223 report_fatal_error("Expected a constant shift amount!");
224 }
225 SDVTList ResTys = DAG.getVTList(MVT::i16, MVT::i16);
226 SDValue SrcLo =
227 DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i16, Op.getOperand(0),
228 DAG.getConstant(0, dl, MVT::i16));
229 SDValue SrcHi =
230 DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i16, Op.getOperand(0),
231 DAG.getConstant(1, dl, MVT::i16));
232 uint64_t ShiftAmount = N->getConstantOperandVal(1);
233 if (ShiftAmount == 16) {
234 // Special case these two operations because they appear to be used by the
235 // generic codegen parts to lower 32-bit numbers.
236 // TODO: perhaps we can lower shift amounts bigger than 16 to a 16-bit
237 // shift of a part of the 32-bit value?
238 switch (Op.getOpcode()) {
239 case ISD::SHL: {
240 SDValue Zero = DAG.getConstant(0, dl, MVT::i16);
241 return DAG.getNode(ISD::BUILD_PAIR, dl, MVT::i32, Zero, SrcLo);
242 }
243 case ISD::SRL: {
244 SDValue Zero = DAG.getConstant(0, dl, MVT::i16);
245 return DAG.getNode(ISD::BUILD_PAIR, dl, MVT::i32, SrcHi, Zero);
246 }
247 }
248 }
249 SDValue Cnt = DAG.getTargetConstant(ShiftAmount, dl, MVT::i8);
250 unsigned Opc;
251 switch (Op.getOpcode()) {
252 default:
253 llvm_unreachable("Invalid 32-bit shift opcode!");
254 case ISD::SHL:
255 Opc = AVRISD::LSLW;
256 break;
257 case ISD::SRL:
258 Opc = AVRISD::LSRW;
259 break;
260 case ISD::SRA:
261 Opc = AVRISD::ASRW;
262 break;
263 }
264 SDValue Result = DAG.getNode(Opc, dl, ResTys, SrcLo, SrcHi, Cnt);
265 return DAG.getNode(ISD::BUILD_PAIR, dl, MVT::i32, Result.getValue(0),
266 Result.getValue(1));
267 }
268
269 // Expand non-constant shifts to loops.
270 if (!isa<ConstantSDNode>(N->getOperand(1))) {
271 switch (Op.getOpcode()) {
272 default:
273 llvm_unreachable("Invalid shift opcode!");
274 case ISD::SHL:
275 return DAG.getNode(AVRISD::LSLLOOP, dl, VT, N->getOperand(0),
276 N->getOperand(1));
277 case ISD::SRL:
278 return DAG.getNode(AVRISD::LSRLOOP, dl, VT, N->getOperand(0),
279 N->getOperand(1));
280 case ISD::ROTL: {
281 SDValue Amt = N->getOperand(1);
282 EVT AmtVT = Amt.getValueType();
283 Amt = DAG.getNode(ISD::AND, dl, AmtVT, Amt,
284 DAG.getConstant(VT.getSizeInBits() - 1, dl, AmtVT));
285 return DAG.getNode(AVRISD::ROLLOOP, dl, VT, N->getOperand(0), Amt);
286 }
287 case ISD::ROTR: {
288 SDValue Amt = N->getOperand(1);
289 EVT AmtVT = Amt.getValueType();
290 Amt = DAG.getNode(ISD::AND, dl, AmtVT, Amt,
291 DAG.getConstant(VT.getSizeInBits() - 1, dl, AmtVT));
292 return DAG.getNode(AVRISD::RORLOOP, dl, VT, N->getOperand(0), Amt);
293 }
294 case ISD::SRA:
295 return DAG.getNode(AVRISD::ASRLOOP, dl, VT, N->getOperand(0),
296 N->getOperand(1));
297 }
298 }
299
300 uint64_t ShiftAmount = N->getConstantOperandVal(1);
301 SDValue Victim = N->getOperand(0);
302
303 switch (Op.getOpcode()) {
304 case ISD::SRA:
305 Opc8 = AVRISD::ASR;
306 break;
307 case ISD::ROTL:
308 Opc8 = AVRISD::ROL;
309 ShiftAmount = ShiftAmount % VT.getSizeInBits();
310 break;
311 case ISD::ROTR:
312 Opc8 = AVRISD::ROR;
313 ShiftAmount = ShiftAmount % VT.getSizeInBits();
314 break;
315 case ISD::SRL:
316 Opc8 = AVRISD::LSR;
317 break;
318 case ISD::SHL:
319 Opc8 = AVRISD::LSL;
320 break;
321 default:
322 llvm_unreachable("Invalid shift opcode");
323 }
324
325 // Optimize int8/int16 shifts.
326 if (VT.getSizeInBits() == 8) {
327 if (Op.getOpcode() == ISD::SHL && 4 <= ShiftAmount && ShiftAmount < 7) {
328 // Optimize LSL when 4 <= ShiftAmount <= 6.
329 Victim = DAG.getNode(AVRISD::SWAP, dl, VT, Victim);
330 Victim =
331 DAG.getNode(ISD::AND, dl, VT, Victim, DAG.getConstant(0xf0, dl, VT));
332 ShiftAmount -= 4;
333 } else if (Op.getOpcode() == ISD::SRL && 4 <= ShiftAmount &&
334 ShiftAmount < 7) {
335 // Optimize LSR when 4 <= ShiftAmount <= 6.
336 Victim = DAG.getNode(AVRISD::SWAP, dl, VT, Victim);
337 Victim =
338 DAG.getNode(ISD::AND, dl, VT, Victim, DAG.getConstant(0x0f, dl, VT));
339 ShiftAmount -= 4;
340 } else if (Op.getOpcode() == ISD::SHL && ShiftAmount == 7) {
341 // Optimize LSL when ShiftAmount == 7.
342 Victim = DAG.getNode(AVRISD::LSLBN, dl, VT, Victim,
343 DAG.getConstant(7, dl, VT));
344 ShiftAmount = 0;
345 } else if (Op.getOpcode() == ISD::SRL && ShiftAmount == 7) {
346 // Optimize LSR when ShiftAmount == 7.
347 Victim = DAG.getNode(AVRISD::LSRBN, dl, VT, Victim,
348 DAG.getConstant(7, dl, VT));
349 ShiftAmount = 0;
350 } else if (Op.getOpcode() == ISD::SRA && ShiftAmount == 6) {
351 // Optimize ASR when ShiftAmount == 6.
352 Victim = DAG.getNode(AVRISD::ASRBN, dl, VT, Victim,
353 DAG.getConstant(6, dl, VT));
354 ShiftAmount = 0;
355 } else if (Op.getOpcode() == ISD::SRA && ShiftAmount == 7) {
356 // Optimize ASR when ShiftAmount == 7.
357 Victim = DAG.getNode(AVRISD::ASRBN, dl, VT, Victim,
358 DAG.getConstant(7, dl, VT));
359 ShiftAmount = 0;
360 } else if (Op.getOpcode() == ISD::ROTL && ShiftAmount == 3) {
361 // Optimize left rotation 3 bits to swap then right rotation 1 bit.
362 Victim = DAG.getNode(AVRISD::SWAP, dl, VT, Victim);
363 Victim = DAG.getNode(AVRISD::ROR, dl, VT, Victim);
364 ShiftAmount = 0;
365 } else if (Op.getOpcode() == ISD::ROTR && ShiftAmount == 3) {
366 // Optimize right rotation 3 bits to swap then left rotation 1 bit.
367 Victim = DAG.getNode(AVRISD::SWAP, dl, VT, Victim);
368 Victim = DAG.getNode(AVRISD::ROL, dl, VT, Victim);
369 ShiftAmount = 0;
370 } else if (Op.getOpcode() == ISD::ROTL && ShiftAmount == 7) {
371 // Optimize left rotation 7 bits to right rotation 1 bit.
372 Victim = DAG.getNode(AVRISD::ROR, dl, VT, Victim);
373 ShiftAmount = 0;
374 } else if (Op.getOpcode() == ISD::ROTR && ShiftAmount == 7) {
375 // Optimize right rotation 7 bits to left rotation 1 bit.
376 Victim = DAG.getNode(AVRISD::ROL, dl, VT, Victim);
377 ShiftAmount = 0;
378 } else if ((Op.getOpcode() == ISD::ROTR || Op.getOpcode() == ISD::ROTL) &&
379 ShiftAmount >= 4) {
380 // Optimize left/right rotation with the SWAP instruction.
381 Victim = DAG.getNode(AVRISD::SWAP, dl, VT, Victim);
382 ShiftAmount -= 4;
383 }
384 } else if (VT.getSizeInBits() == 16) {
385 if (Op.getOpcode() == ISD::SRA)
386 // Special optimization for int16 arithmetic right shift.
387 switch (ShiftAmount) {
388 case 15:
389 Victim = DAG.getNode(AVRISD::ASRWN, dl, VT, Victim,
390 DAG.getConstant(15, dl, VT));
391 ShiftAmount = 0;
392 break;
393 case 14:
394 Victim = DAG.getNode(AVRISD::ASRWN, dl, VT, Victim,
395 DAG.getConstant(14, dl, VT));
396 ShiftAmount = 0;
397 break;
398 case 7:
399 Victim = DAG.getNode(AVRISD::ASRWN, dl, VT, Victim,
400 DAG.getConstant(7, dl, VT));
401 ShiftAmount = 0;
402 break;
403 default:
404 break;
405 }
406 if (4 <= ShiftAmount && ShiftAmount < 8)
407 switch (Op.getOpcode()) {
408 case ISD::SHL:
409 Victim = DAG.getNode(AVRISD::LSLWN, dl, VT, Victim,
410 DAG.getConstant(4, dl, VT));
411 ShiftAmount -= 4;
412 break;
413 case ISD::SRL:
414 Victim = DAG.getNode(AVRISD::LSRWN, dl, VT, Victim,
415 DAG.getConstant(4, dl, VT));
416 ShiftAmount -= 4;
417 break;
418 default:
419 break;
420 }
421 else if (8 <= ShiftAmount && ShiftAmount < 12)
422 switch (Op.getOpcode()) {
423 case ISD::SHL:
424 Victim = DAG.getNode(AVRISD::LSLWN, dl, VT, Victim,
425 DAG.getConstant(8, dl, VT));
426 ShiftAmount -= 8;
427 // Only operate on the higher byte for remaining shift bits.
428 Opc8 = AVRISD::LSLHI;
429 break;
430 case ISD::SRL:
431 Victim = DAG.getNode(AVRISD::LSRWN, dl, VT, Victim,
432 DAG.getConstant(8, dl, VT));
433 ShiftAmount -= 8;
434 // Only operate on the lower byte for remaining shift bits.
435 Opc8 = AVRISD::LSRLO;
436 break;
437 case ISD::SRA:
438 Victim = DAG.getNode(AVRISD::ASRWN, dl, VT, Victim,
439 DAG.getConstant(8, dl, VT));
440 ShiftAmount -= 8;
441 // Only operate on the lower byte for remaining shift bits.
442 Opc8 = AVRISD::ASRLO;
443 break;
444 default:
445 break;
446 }
447 else if (12 <= ShiftAmount)
448 switch (Op.getOpcode()) {
449 case ISD::SHL:
450 Victim = DAG.getNode(AVRISD::LSLWN, dl, VT, Victim,
451 DAG.getConstant(12, dl, VT));
452 ShiftAmount -= 12;
453 // Only operate on the higher byte for remaining shift bits.
454 Opc8 = AVRISD::LSLHI;
455 break;
456 case ISD::SRL:
457 Victim = DAG.getNode(AVRISD::LSRWN, dl, VT, Victim,
458 DAG.getConstant(12, dl, VT));
459 ShiftAmount -= 12;
460 // Only operate on the lower byte for remaining shift bits.
461 Opc8 = AVRISD::LSRLO;
462 break;
463 case ISD::SRA:
464 Victim = DAG.getNode(AVRISD::ASRWN, dl, VT, Victim,
465 DAG.getConstant(8, dl, VT));
466 ShiftAmount -= 8;
467 // Only operate on the lower byte for remaining shift bits.
468 Opc8 = AVRISD::ASRLO;
469 break;
470 default:
471 break;
472 }
473 }
474
475 while (ShiftAmount--) {
476 Victim = DAG.getNode(Opc8, dl, VT, Victim);
477 }
478
479 return Victim;
480}
481
482SDValue AVRTargetLowering::LowerDivRem(SDValue Op, SelectionDAG &DAG) const {
483 unsigned Opcode = Op->getOpcode();
484 assert((Opcode == ISD::SDIVREM || Opcode == ISD::UDIVREM) &&
485 "Invalid opcode for Div/Rem lowering");
486 bool IsSigned = (Opcode == ISD::SDIVREM);
487 EVT VT = Op->getValueType(0);
488 Type *Ty = VT.getTypeForEVT(*DAG.getContext());
489
490 RTLIB::Libcall LC;
491 switch (VT.getSimpleVT().SimpleTy) {
492 default:
493 llvm_unreachable("Unexpected request for libcall!");
494 case MVT::i8:
495 LC = IsSigned ? RTLIB::SDIVREM_I8 : RTLIB::UDIVREM_I8;
496 break;
497 case MVT::i16:
498 LC = IsSigned ? RTLIB::SDIVREM_I16 : RTLIB::UDIVREM_I16;
499 break;
500 case MVT::i32:
501 LC = IsSigned ? RTLIB::SDIVREM_I32 : RTLIB::UDIVREM_I32;
502 break;
503 }
504
505 SDValue InChain = DAG.getEntryNode();
506
508 for (SDValue const &Value : Op->op_values()) {
509 TargetLowering::ArgListEntry Entry(
510 Value, Value.getValueType().getTypeForEVT(*DAG.getContext()));
511 Entry.IsSExt = IsSigned;
512 Entry.IsZExt = !IsSigned;
513 Args.push_back(Entry);
514 }
515
516 RTLIB::LibcallImpl LCImpl = DAG.getLibcalls().getLibcallImpl(LC);
517 if (LCImpl == RTLIB::Unsupported)
518 return SDValue();
519
521 DAG.getExternalSymbol(LCImpl, getPointerTy(DAG.getDataLayout()));
522
523 Type *RetTy = (Type *)StructType::get(Ty, Ty);
524
525 SDLoc dl(Op);
526 TargetLowering::CallLoweringInfo CLI(DAG);
527 CLI.setDebugLoc(dl)
528 .setChain(InChain)
529 .setLibCallee(DAG.getLibcalls().getLibcallImplCallingConv(LCImpl), RetTy,
530 Callee, std::move(Args))
531 .setInRegister()
532 .setSExtResult(IsSigned)
533 .setZExtResult(!IsSigned);
534
535 std::pair<SDValue, SDValue> CallInfo = LowerCallTo(CLI);
536 return CallInfo.first;
537}
538
539SDValue AVRTargetLowering::LowerGlobalAddress(SDValue Op,
540 SelectionDAG &DAG) const {
541 auto DL = DAG.getDataLayout();
542
543 const GlobalValue *GV = cast<GlobalAddressSDNode>(Op)->getGlobal();
544 int64_t Offset = cast<GlobalAddressSDNode>(Op)->getOffset();
545
546 // Create the TargetGlobalAddress node, folding in the constant offset.
548 DAG.getTargetGlobalAddress(GV, SDLoc(Op), getPointerTy(DL), Offset);
549 return DAG.getNode(AVRISD::WRAPPER, SDLoc(Op), getPointerTy(DL), Result);
550}
551
552SDValue AVRTargetLowering::LowerBlockAddress(SDValue Op,
553 SelectionDAG &DAG) const {
554 auto DL = DAG.getDataLayout();
555 const BlockAddress *BA = cast<BlockAddressSDNode>(Op)->getBlockAddress();
556
557 SDValue Result = DAG.getTargetBlockAddress(BA, getPointerTy(DL));
558
559 return DAG.getNode(AVRISD::WRAPPER, SDLoc(Op), getPointerTy(DL), Result);
560}
561
562/// IntCCToAVRCC - Convert a DAG integer condition code to an AVR CC.
564 switch (CC) {
565 default:
566 llvm_unreachable("Unknown condition code!");
567 case ISD::SETEQ:
568 return AVRCC::COND_EQ;
569 case ISD::SETNE:
570 return AVRCC::COND_NE;
571 case ISD::SETGE:
572 return AVRCC::COND_GE;
573 case ISD::SETLT:
574 return AVRCC::COND_LT;
575 case ISD::SETUGE:
576 return AVRCC::COND_SH;
577 case ISD::SETULT:
578 return AVRCC::COND_LO;
579 }
580}
581
582/// Returns appropriate CP/CPI/CPC nodes code for the given 8/16-bit operands.
583SDValue AVRTargetLowering::getAVRCmp(SDValue LHS, SDValue RHS,
584 SelectionDAG &DAG, SDLoc DL) const {
585 assert((LHS.getSimpleValueType() == RHS.getSimpleValueType()) &&
586 "LHS and RHS have different types");
587 assert(((LHS.getSimpleValueType() == MVT::i16) ||
588 (LHS.getSimpleValueType() == MVT::i8)) &&
589 "invalid comparison type");
590
591 SDValue Cmp;
592
593 if (LHS.getSimpleValueType() == MVT::i16 && isa<ConstantSDNode>(RHS)) {
594 uint64_t Imm = RHS->getAsZExtVal();
595 // Generate a CPI/CPC pair if RHS is a 16-bit constant. Use the zero
596 // register for the constant RHS if its lower or higher byte is zero.
597 SDValue LHSlo = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i8, LHS,
598 DAG.getIntPtrConstant(0, DL));
599 SDValue LHShi = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i8, LHS,
600 DAG.getIntPtrConstant(1, DL));
601 SDValue RHSlo = (Imm & 0xff) == 0
602 ? DAG.getRegister(Subtarget.getZeroRegister(), MVT::i8)
603 : DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i8, RHS,
604 DAG.getIntPtrConstant(0, DL));
605 SDValue RHShi = (Imm & 0xff00) == 0
606 ? DAG.getRegister(Subtarget.getZeroRegister(), MVT::i8)
607 : DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i8, RHS,
608 DAG.getIntPtrConstant(1, DL));
609 Cmp = DAG.getNode(AVRISD::CMP, DL, MVT::Glue, LHSlo, RHSlo);
610 Cmp = DAG.getNode(AVRISD::CMPC, DL, MVT::Glue, LHShi, RHShi, Cmp);
611 } else if (RHS.getSimpleValueType() == MVT::i16 && isa<ConstantSDNode>(LHS)) {
612 // Generate a CPI/CPC pair if LHS is a 16-bit constant. Use the zero
613 // register for the constant LHS if its lower or higher byte is zero.
614 uint64_t Imm = LHS->getAsZExtVal();
615 SDValue LHSlo = (Imm & 0xff) == 0
616 ? DAG.getRegister(Subtarget.getZeroRegister(), MVT::i8)
617 : DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i8, LHS,
618 DAG.getIntPtrConstant(0, DL));
619 SDValue LHShi = (Imm & 0xff00) == 0
620 ? DAG.getRegister(Subtarget.getZeroRegister(), MVT::i8)
621 : DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i8, LHS,
622 DAG.getIntPtrConstant(1, DL));
623 SDValue RHSlo = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i8, RHS,
624 DAG.getIntPtrConstant(0, DL));
625 SDValue RHShi = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i8, RHS,
626 DAG.getIntPtrConstant(1, DL));
627 Cmp = DAG.getNode(AVRISD::CMP, DL, MVT::Glue, LHSlo, RHSlo);
628 Cmp = DAG.getNode(AVRISD::CMPC, DL, MVT::Glue, LHShi, RHShi, Cmp);
629 } else {
630 // Generate ordinary 16-bit comparison.
631 Cmp = DAG.getNode(AVRISD::CMP, DL, MVT::Glue, LHS, RHS);
632 }
633
634 return Cmp;
635}
636
637/// Returns appropriate AVR CMP/CMPC nodes and corresponding condition code for
638/// the given operands.
639SDValue AVRTargetLowering::getAVRCmp(SDValue LHS, SDValue RHS, ISD::CondCode CC,
640 SDValue &AVRcc, SelectionDAG &DAG,
641 SDLoc DL) const {
642 SDValue Cmp;
643 EVT VT = LHS.getValueType();
644 bool UseTest = false;
645
646 switch (CC) {
647 default:
648 break;
649 case ISD::SETLE: {
650 // Swap operands and reverse the branching condition.
651 std::swap(LHS, RHS);
652 CC = ISD::SETGE;
653 break;
654 }
655 case ISD::SETGT: {
656 if (const ConstantSDNode *C = dyn_cast<ConstantSDNode>(RHS)) {
657 switch (C->getSExtValue()) {
658 case -1: {
659 // When doing lhs > -1 use a tst instruction on the top part of lhs
660 // and use brpl instead of using a chain of cp/cpc.
661 UseTest = true;
662 AVRcc = DAG.getConstant(AVRCC::COND_PL, DL, MVT::i8);
663 break;
664 }
665 case 0: {
666 // Turn lhs > 0 into 0 < lhs since 0 can be materialized with
667 // __zero_reg__ in lhs.
668 RHS = LHS;
669 LHS = DAG.getConstant(0, DL, VT);
670 CC = ISD::SETLT;
671 break;
672 }
673 default: {
674 // Turn lhs < rhs with lhs constant into rhs >= lhs+1, this allows
675 // us to fold the constant into the cmp instruction.
676 RHS = DAG.getSignedConstant(C->getSExtValue() + 1, DL, VT);
677 CC = ISD::SETGE;
678 break;
679 }
680 }
681 break;
682 }
683 // Swap operands and reverse the branching condition.
684 std::swap(LHS, RHS);
685 CC = ISD::SETLT;
686 break;
687 }
688 case ISD::SETLT: {
689 if (const ConstantSDNode *C = dyn_cast<ConstantSDNode>(RHS)) {
690 switch (C->getSExtValue()) {
691 case 1: {
692 // Turn lhs < 1 into 0 >= lhs since 0 can be materialized with
693 // __zero_reg__ in lhs.
694 RHS = LHS;
695 LHS = DAG.getConstant(0, DL, VT);
696 CC = ISD::SETGE;
697 break;
698 }
699 case 0: {
700 // When doing lhs < 0 use a tst instruction on the top part of lhs
701 // and use brmi instead of using a chain of cp/cpc.
702 UseTest = true;
703 AVRcc = DAG.getConstant(AVRCC::COND_MI, DL, MVT::i8);
704 break;
705 }
706 }
707 }
708 break;
709 }
710 case ISD::SETULE: {
711 // Swap operands and reverse the branching condition.
712 std::swap(LHS, RHS);
713 CC = ISD::SETUGE;
714 break;
715 }
716 case ISD::SETUGT: {
717 // Turn lhs < rhs with lhs constant into rhs >= lhs+1, this allows us to
718 // fold the constant into the cmp instruction.
719 if (const ConstantSDNode *C = dyn_cast<ConstantSDNode>(RHS)) {
720 // Doing a "icmp ugt i16 65535, %0" comparison should have been converted
721 // already to something else. Assert to make sure this assumption holds.
722 assert((!C->isAllOnes()) && "integer overflow in comparison transform");
723 RHS = DAG.getConstant(C->getZExtValue() + 1, DL, VT);
724 CC = ISD::SETUGE;
725 break;
726 }
727 // Swap operands and reverse the branching condition.
728 std::swap(LHS, RHS);
729 CC = ISD::SETULT;
730 break;
731 }
732 }
733
734 // Expand 32 and 64 bit comparisons with custom CMP and CMPC nodes instead of
735 // using the default and/or/xor expansion code which is much longer.
736 if (VT == MVT::i32) {
737 SDValue LHSlo = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i16, LHS,
738 DAG.getIntPtrConstant(0, DL));
739 SDValue LHShi = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i16, LHS,
740 DAG.getIntPtrConstant(1, DL));
741 SDValue RHSlo = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i16, RHS,
742 DAG.getIntPtrConstant(0, DL));
743 SDValue RHShi = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i16, RHS,
744 DAG.getIntPtrConstant(1, DL));
745
746 if (UseTest) {
747 // When using tst we only care about the highest part.
748 SDValue Top = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i8, LHShi,
749 DAG.getIntPtrConstant(1, DL));
750 Cmp = DAG.getNode(AVRISD::TST, DL, MVT::Glue, Top);
751 } else {
752 Cmp = getAVRCmp(LHSlo, RHSlo, DAG, DL);
753 Cmp = DAG.getNode(AVRISD::CMPC, DL, MVT::Glue, LHShi, RHShi, Cmp);
754 }
755 } else if (VT == MVT::i64) {
756 SDValue LHS_0 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i32, LHS,
757 DAG.getIntPtrConstant(0, DL));
758 SDValue LHS_1 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i32, LHS,
759 DAG.getIntPtrConstant(1, DL));
760
761 SDValue LHS0 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i16, LHS_0,
762 DAG.getIntPtrConstant(0, DL));
763 SDValue LHS1 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i16, LHS_0,
764 DAG.getIntPtrConstant(1, DL));
765 SDValue LHS2 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i16, LHS_1,
766 DAG.getIntPtrConstant(0, DL));
767 SDValue LHS3 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i16, LHS_1,
768 DAG.getIntPtrConstant(1, DL));
769
770 SDValue RHS_0 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i32, RHS,
771 DAG.getIntPtrConstant(0, DL));
772 SDValue RHS_1 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i32, RHS,
773 DAG.getIntPtrConstant(1, DL));
774
775 SDValue RHS0 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i16, RHS_0,
776 DAG.getIntPtrConstant(0, DL));
777 SDValue RHS1 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i16, RHS_0,
778 DAG.getIntPtrConstant(1, DL));
779 SDValue RHS2 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i16, RHS_1,
780 DAG.getIntPtrConstant(0, DL));
781 SDValue RHS3 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i16, RHS_1,
782 DAG.getIntPtrConstant(1, DL));
783
784 if (UseTest) {
785 // When using tst we only care about the highest part.
786 SDValue Top = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i8, LHS3,
787 DAG.getIntPtrConstant(1, DL));
788 Cmp = DAG.getNode(AVRISD::TST, DL, MVT::Glue, Top);
789 } else {
790 Cmp = getAVRCmp(LHS0, RHS0, DAG, DL);
791 Cmp = DAG.getNode(AVRISD::CMPC, DL, MVT::Glue, LHS1, RHS1, Cmp);
792 Cmp = DAG.getNode(AVRISD::CMPC, DL, MVT::Glue, LHS2, RHS2, Cmp);
793 Cmp = DAG.getNode(AVRISD::CMPC, DL, MVT::Glue, LHS3, RHS3, Cmp);
794 }
795 } else if (VT == MVT::i8 || VT == MVT::i16) {
796 if (UseTest) {
797 // When using tst we only care about the highest part.
798 Cmp = DAG.getNode(AVRISD::TST, DL, MVT::Glue,
799 (VT == MVT::i8)
800 ? LHS
801 : DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i8,
802 LHS, DAG.getIntPtrConstant(1, DL)));
803 } else {
804 Cmp = getAVRCmp(LHS, RHS, DAG, DL);
805 }
806 } else {
807 llvm_unreachable("Invalid comparison size");
808 }
809
810 // When using a test instruction AVRcc is already set.
811 if (!UseTest) {
812 AVRcc = DAG.getConstant(intCCToAVRCC(CC), DL, MVT::i8);
813 }
814
815 return Cmp;
816}
817
818SDValue AVRTargetLowering::LowerBR_CC(SDValue Op, SelectionDAG &DAG) const {
819 SDValue Chain = Op.getOperand(0);
820 ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(1))->get();
821 SDValue LHS = Op.getOperand(2);
822 SDValue RHS = Op.getOperand(3);
823 SDValue Dest = Op.getOperand(4);
824 SDLoc dl(Op);
825
826 SDValue TargetCC;
827 SDValue Cmp = getAVRCmp(LHS, RHS, CC, TargetCC, DAG, dl);
828
829 return DAG.getNode(AVRISD::BRCOND, dl, MVT::Other, Chain, Dest, TargetCC,
830 Cmp);
831}
832
833SDValue AVRTargetLowering::LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const {
834 SDValue LHS = Op.getOperand(0);
835 SDValue RHS = Op.getOperand(1);
836 SDValue TrueV = Op.getOperand(2);
837 SDValue FalseV = Op.getOperand(3);
838 ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(4))->get();
839 SDLoc dl(Op);
840
841 SDValue TargetCC;
842 SDValue Cmp = getAVRCmp(LHS, RHS, CC, TargetCC, DAG, dl);
843
844 SDValue Ops[] = {TrueV, FalseV, TargetCC, Cmp};
845
846 return DAG.getNode(AVRISD::SELECT_CC, dl, Op.getValueType(), Ops);
847}
848
849SDValue AVRTargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) const {
850 SDValue LHS = Op.getOperand(0);
851 SDValue RHS = Op.getOperand(1);
852 ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(2))->get();
853 SDLoc DL(Op);
854
855 SDValue TargetCC;
856 SDValue Cmp = getAVRCmp(LHS, RHS, CC, TargetCC, DAG, DL);
857
858 SDValue TrueV = DAG.getConstant(1, DL, Op.getValueType());
859 SDValue FalseV = DAG.getConstant(0, DL, Op.getValueType());
860 SDValue Ops[] = {TrueV, FalseV, TargetCC, Cmp};
861
862 return DAG.getNode(AVRISD::SELECT_CC, DL, Op.getValueType(), Ops);
863}
864
865SDValue AVRTargetLowering::LowerVASTART(SDValue Op, SelectionDAG &DAG) const {
866 const MachineFunction &MF = DAG.getMachineFunction();
867 const AVRMachineFunctionInfo *AFI = MF.getInfo<AVRMachineFunctionInfo>();
868 const Value *SV = cast<SrcValueSDNode>(Op.getOperand(2))->getValue();
869 auto DL = DAG.getDataLayout();
870 SDLoc dl(Op);
871
872 // Vastart just stores the address of the VarArgsFrameIndex slot into the
873 // memory location argument.
874 SDValue FI = DAG.getFrameIndex(AFI->getVarArgsFrameIndex(), getPointerTy(DL));
875
876 return DAG.getStore(Op.getOperand(0), dl, FI, Op.getOperand(1),
877 MachinePointerInfo(SV));
878}
879
880// Modify the existing ISD::INLINEASM node to add the implicit zero register.
881SDValue AVRTargetLowering::LowerINLINEASM(SDValue Op, SelectionDAG &DAG) const {
882 SDValue ZeroReg = DAG.getRegister(Subtarget.getZeroRegister(), MVT::i8);
883 if (Op.getOperand(Op.getNumOperands() - 1) == ZeroReg ||
884 Op.getOperand(Op.getNumOperands() - 2) == ZeroReg) {
885 // Zero register has already been added. Don't add it again.
886 // If this isn't handled, we get called over and over again.
887 return Op;
888 }
889
890 // Get a list of operands to the new INLINEASM node. This is mostly a copy,
891 // with some edits.
892 // Add the following operands at the end (but before the glue node, if it's
893 // there):
894 // - The flags of the implicit zero register operand.
895 // - The implicit zero register operand itself.
896 SDLoc dl(Op);
898 SDNode *N = Op.getNode();
899 SDValue Glue;
900 for (unsigned I = 0; I < N->getNumOperands(); I++) {
901 SDValue Operand = N->getOperand(I);
902 if (Operand.getValueType() == MVT::Glue) {
903 // The glue operand always needs to be at the end, so we need to treat it
904 // specially.
905 Glue = Operand;
906 } else {
907 Ops.push_back(Operand);
908 }
909 }
910 InlineAsm::Flag Flags(InlineAsm::Kind::RegUse, 1);
911 Ops.push_back(DAG.getTargetConstant(Flags, dl, MVT::i32));
912 Ops.push_back(ZeroReg);
913 if (Glue) {
914 Ops.push_back(Glue);
915 }
916
917 // Replace the current INLINEASM node with a new one that has the zero
918 // register as implicit parameter.
919 SDValue New = DAG.getNode(N->getOpcode(), dl, N->getVTList(), Ops);
920 DAG.ReplaceAllUsesOfValueWith(Op, New);
921 DAG.ReplaceAllUsesOfValueWith(Op.getValue(1), New.getValue(1));
922
923 return New;
924}
925
927 switch (Op.getOpcode()) {
928 default:
929 llvm_unreachable("Don't know how to custom lower this!");
930 case ISD::SHL:
931 case ISD::SRA:
932 case ISD::SRL:
933 case ISD::ROTL:
934 case ISD::ROTR:
935 return LowerShifts(Op, DAG);
937 return LowerGlobalAddress(Op, DAG);
939 return LowerBlockAddress(Op, DAG);
940 case ISD::BR_CC:
941 return LowerBR_CC(Op, DAG);
942 case ISD::SELECT_CC:
943 return LowerSELECT_CC(Op, DAG);
944 case ISD::SETCC:
945 return LowerSETCC(Op, DAG);
946 case ISD::VASTART:
947 return LowerVASTART(Op, DAG);
948 case ISD::SDIVREM:
949 case ISD::UDIVREM:
950 return LowerDivRem(Op, DAG);
951 case ISD::INLINEASM:
952 return LowerINLINEASM(Op, DAG);
953 }
954
955 return SDValue();
956}
957
958/// Replace a node with an illegal result type
959/// with a new node built out of custom code.
962 SelectionDAG &DAG) const {
963 SDLoc DL(N);
964
965 switch (N->getOpcode()) {
966 case ISD::ADD: {
967 // Convert add (x, imm) into sub (x, -imm).
968 if (const ConstantSDNode *C = dyn_cast<ConstantSDNode>(N->getOperand(1))) {
969 SDValue Sub = DAG.getNode(
970 ISD::SUB, DL, N->getValueType(0), N->getOperand(0),
971 DAG.getConstant(-C->getAPIntValue(), DL, C->getValueType(0)));
972 Results.push_back(Sub);
973 }
974 break;
975 }
976 default: {
977 SDValue Res = LowerOperation(SDValue(N, 0), DAG);
978
979 for (unsigned I = 0, E = Res->getNumValues(); I != E; ++I)
980 Results.push_back(Res.getValue(I));
981
982 break;
983 }
984 }
985}
986
987/// Return true if the addressing mode represented
988/// by AM is legal for this target, for a load/store of the specified type.
990 const AddrMode &AM, Type *Ty,
991 unsigned AS,
992 Instruction *I) const {
993 int64_t Offs = AM.BaseOffs;
994
995 // Allow absolute addresses.
996 if (AM.BaseGV && !AM.HasBaseReg && AM.Scale == 0 && Offs == 0) {
997 return true;
998 }
999
1000 // Flash memory instructions only allow zero offsets.
1001 if (isa<PointerType>(Ty) && AS == AVR::ProgramMemory) {
1002 return false;
1003 }
1004
1005 // Allow reg+<6bit> offset.
1006 if (Offs < 0)
1007 Offs = -Offs;
1008 if (AM.BaseGV == nullptr && AM.HasBaseReg && AM.Scale == 0 &&
1009 isUInt<6>(Offs)) {
1010 return true;
1011 }
1012
1013 return false;
1014}
1015
1016/// Returns true by value, base pointer and
1017/// offset pointer and addressing mode by reference if the node's address
1018/// can be legally represented as pre-indexed load / store address.
1020 SDValue &Offset,
1022 SelectionDAG &DAG) const {
1023 EVT VT;
1024 const SDNode *Op;
1025 SDLoc DL(N);
1026
1027 if (const LoadSDNode *LD = dyn_cast<LoadSDNode>(N)) {
1028 VT = LD->getMemoryVT();
1029 Op = LD->getBasePtr().getNode();
1030 if (LD->getExtensionType() != ISD::NON_EXTLOAD)
1031 return false;
1033 return false;
1034 }
1035 } else if (const StoreSDNode *ST = dyn_cast<StoreSDNode>(N)) {
1036 VT = ST->getMemoryVT();
1037 Op = ST->getBasePtr().getNode();
1039 return false;
1040 }
1041 } else {
1042 return false;
1043 }
1044
1045 if (VT != MVT::i8 && VT != MVT::i16) {
1046 return false;
1047 }
1048
1049 if (Op->getOpcode() != ISD::ADD && Op->getOpcode() != ISD::SUB) {
1050 return false;
1051 }
1052
1053 if (const ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(Op->getOperand(1))) {
1054 int RHSC = RHS->getSExtValue();
1055 if (Op->getOpcode() == ISD::SUB)
1056 RHSC = -RHSC;
1057
1058 if ((VT == MVT::i16 && RHSC != -2) || (VT == MVT::i8 && RHSC != -1)) {
1059 return false;
1060 }
1061
1062 Base = Op->getOperand(0);
1063 Offset = DAG.getSignedConstant(RHSC, DL, MVT::i8);
1064 AM = ISD::PRE_DEC;
1065
1066 return true;
1067 }
1068
1069 return false;
1070}
1071
1072/// Returns true by value, base pointer and
1073/// offset pointer and addressing mode by reference if this node can be
1074/// combined with a load / store to form a post-indexed load / store.
1076 SDValue &Base,
1077 SDValue &Offset,
1079 SelectionDAG &DAG) const {
1080 EVT VT;
1081 SDValue Ptr;
1082 SDLoc DL(N);
1083
1084 if (const LoadSDNode *LD = dyn_cast<LoadSDNode>(N)) {
1085 VT = LD->getMemoryVT();
1086 Ptr = LD->getBasePtr();
1087 if (LD->getExtensionType() != ISD::NON_EXTLOAD)
1088 return false;
1089 } else if (const StoreSDNode *ST = dyn_cast<StoreSDNode>(N)) {
1090 VT = ST->getMemoryVT();
1091 Ptr = ST->getBasePtr();
1092 // We can not store to program memory.
1094 return false;
1095 // Since the high byte need to be stored first, we can not emit
1096 // i16 post increment store like:
1097 // st X+, r24
1098 // st X+, r25
1099 if (VT == MVT::i16 && !Subtarget.hasLowByteFirst())
1100 return false;
1101 } else {
1102 return false;
1103 }
1104
1105 if (VT != MVT::i8 && VT != MVT::i16) {
1106 return false;
1107 }
1108
1109 if (Op->getOpcode() != ISD::ADD && Op->getOpcode() != ISD::SUB) {
1110 return false;
1111 }
1112
1113 if (const ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(Op->getOperand(1))) {
1114 int RHSC = RHS->getSExtValue();
1115 if (Op->getOpcode() == ISD::SUB)
1116 RHSC = -RHSC;
1117 if ((VT == MVT::i16 && RHSC != 2) || (VT == MVT::i8 && RHSC != 1)) {
1118 return false;
1119 }
1120
1121 // FIXME: We temporarily disable post increment load from program memory,
1122 // due to bug https://github.com/llvm/llvm-project/issues/59914.
1123 if (const LoadSDNode *LD = dyn_cast<LoadSDNode>(N))
1125 return false;
1126
1127 Base = Op->getOperand(0);
1128
1129 // Post-indexing updates the base, so it's not a valid transform
1130 // if that's not the same as the load's pointer.
1131 if (Ptr != Base)
1132 return false;
1133
1134 Offset = DAG.getConstant(RHSC, DL, MVT::i8);
1135 AM = ISD::POST_INC;
1136
1137 return true;
1138 }
1139
1140 return false;
1141}
1142
1144 const GlobalAddressSDNode *GA) const {
1145 return true;
1146}
1147
1148//===----------------------------------------------------------------------===//
1149// Formal Arguments Calling Convention Implementation
1150//===----------------------------------------------------------------------===//
1151
1152#include "AVRGenCallingConv.inc"
1153
1154/// Registers for calling conventions, ordered in reverse as required by ABI.
1155/// Both arrays must be of the same length.
1156static const MCPhysReg RegList8AVR[] = {
1157 AVR::R25, AVR::R24, AVR::R23, AVR::R22, AVR::R21, AVR::R20,
1158 AVR::R19, AVR::R18, AVR::R17, AVR::R16, AVR::R15, AVR::R14,
1159 AVR::R13, AVR::R12, AVR::R11, AVR::R10, AVR::R9, AVR::R8};
1160static const MCPhysReg RegList8Tiny[] = {AVR::R25, AVR::R24, AVR::R23,
1161 AVR::R22, AVR::R21, AVR::R20};
1162static const MCPhysReg RegList16AVR[] = {
1163 AVR::R26R25, AVR::R25R24, AVR::R24R23, AVR::R23R22, AVR::R22R21,
1164 AVR::R21R20, AVR::R20R19, AVR::R19R18, AVR::R18R17, AVR::R17R16,
1165 AVR::R16R15, AVR::R15R14, AVR::R14R13, AVR::R13R12, AVR::R12R11,
1166 AVR::R11R10, AVR::R10R9, AVR::R9R8};
1167static const MCPhysReg RegList16Tiny[] = {AVR::R26R25, AVR::R25R24,
1168 AVR::R24R23, AVR::R23R22,
1169 AVR::R22R21, AVR::R21R20};
1170
1171static_assert(std::size(RegList8AVR) == std::size(RegList16AVR),
1172 "8-bit and 16-bit register arrays must be of equal length");
1173static_assert(std::size(RegList8Tiny) == std::size(RegList16Tiny),
1174 "8-bit and 16-bit register arrays must be of equal length");
1175
1176/// Analyze incoming and outgoing function arguments. We need custom C++ code
1177/// to handle special constraints in the ABI.
1178/// In addition, all pieces of a certain argument have to be passed either
1179/// using registers or the stack but never mixing both.
1180template <typename ArgT>
1182 const Function *F, const DataLayout *TD,
1183 const SmallVectorImpl<ArgT> &Args,
1185 CCState &CCInfo, bool Tiny) {
1186 // Choose the proper register list for argument passing according to the ABI.
1187 ArrayRef<MCPhysReg> RegList8;
1188 ArrayRef<MCPhysReg> RegList16;
1189 if (Tiny) {
1190 RegList8 = ArrayRef(RegList8Tiny);
1191 RegList16 = ArrayRef(RegList16Tiny);
1192 } else {
1193 RegList8 = ArrayRef(RegList8AVR);
1194 RegList16 = ArrayRef(RegList16AVR);
1195 }
1196
1197 unsigned NumArgs = Args.size();
1198 // This is the index of the last used register, in RegList*.
1199 // -1 means R26 (R26 is never actually used in CC).
1200 int RegLastIdx = -1;
1201 // Once a value is passed to the stack it will always be used
1202 bool UseStack = false;
1203 for (unsigned i = 0; i != NumArgs;) {
1204 MVT VT = Args[i].VT;
1205 // We have to count the number of bytes for each function argument, that is
1206 // those Args with the same OrigArgIndex. This is important in case the
1207 // function takes an aggregate type.
1208 // Current argument will be between [i..j).
1209 unsigned ArgIndex = Args[i].OrigArgIndex;
1210 unsigned TotalBytes = VT.getStoreSize();
1211 unsigned j = i + 1;
1212 for (; j != NumArgs; ++j) {
1213 if (Args[j].OrigArgIndex != ArgIndex)
1214 break;
1215 TotalBytes += Args[j].VT.getStoreSize();
1216 }
1217 // Round up to even number of bytes.
1218 TotalBytes = alignTo(TotalBytes, 2);
1219 // Skip zero sized arguments
1220 if (TotalBytes == 0)
1221 continue;
1222 // The index of the first register to be used
1223 unsigned RegIdx = RegLastIdx + TotalBytes;
1224 RegLastIdx = RegIdx;
1225 // If there are not enough registers, use the stack
1226 if (RegIdx >= RegList8.size()) {
1227 UseStack = true;
1228 }
1229 for (; i != j; ++i) {
1230 MVT VT = Args[i].VT;
1231
1232 if (UseStack) {
1233 auto evt = EVT(VT).getTypeForEVT(CCInfo.getContext());
1234 unsigned Offset = CCInfo.AllocateStack(TD->getTypeAllocSize(evt),
1235 TD->getABITypeAlign(evt));
1236 CCInfo.addLoc(
1238 } else {
1239 unsigned Reg;
1240 if (VT == MVT::i8) {
1241 Reg = CCInfo.AllocateReg(RegList8[RegIdx]);
1242 } else if (VT == MVT::i16) {
1243 Reg = CCInfo.AllocateReg(RegList16[RegIdx]);
1244 } else {
1246 "calling convention can only manage i8 and i16 types");
1247 }
1248 assert(Reg && "register not available in calling convention");
1249 CCInfo.addLoc(CCValAssign::getReg(i, VT, Reg, VT, CCValAssign::Full));
1250 // Registers inside a particular argument are sorted in increasing order
1251 // (remember the array is reversed).
1252 RegIdx -= VT.getStoreSize();
1253 }
1254 }
1255 }
1256}
1257
1258/// Count the total number of bytes needed to pass or return these arguments.
1259template <typename ArgT>
1260static unsigned
1262 unsigned TotalBytes = 0;
1263
1264 for (const ArgT &Arg : Args) {
1265 TotalBytes += Arg.VT.getStoreSize();
1266 }
1267 return TotalBytes;
1268}
1269
1270/// Analyze incoming and outgoing value of returning from a function.
1271/// The algorithm is similar to analyzeArguments, but there can only be
1272/// one value, possibly an aggregate, and it is limited to 8 bytes.
1273template <typename ArgT>
1275 CCState &CCInfo, bool Tiny) {
1276 unsigned NumArgs = Args.size();
1277 unsigned TotalBytes = getTotalArgumentsSizeInBytes(Args);
1278 // CanLowerReturn() guarantees this assertion.
1279 if (Tiny)
1280 assert(TotalBytes <= 4 &&
1281 "return values greater than 4 bytes cannot be lowered on AVRTiny");
1282 else
1283 assert(TotalBytes <= 8 &&
1284 "return values greater than 8 bytes cannot be lowered on AVR");
1285
1286 // Choose the proper register list for argument passing according to the ABI.
1287 ArrayRef<MCPhysReg> RegList8;
1288 ArrayRef<MCPhysReg> RegList16;
1289 if (Tiny) {
1290 RegList8 = ArrayRef(RegList8Tiny);
1291 RegList16 = ArrayRef(RegList16Tiny);
1292 } else {
1293 RegList8 = ArrayRef(RegList8AVR);
1294 RegList16 = ArrayRef(RegList16AVR);
1295 }
1296
1297 // GCC-ABI says that the size is rounded up to the next even number,
1298 // but actually once it is more than 4 it will always round up to 8.
1299 if (TotalBytes > 4) {
1300 TotalBytes = 8;
1301 } else {
1302 TotalBytes = alignTo(TotalBytes, 2);
1303 }
1304
1305 // The index of the first register to use.
1306 int RegIdx = TotalBytes - 1;
1307 for (unsigned i = 0; i != NumArgs; ++i) {
1308 MVT VT = Args[i].VT;
1309 unsigned Reg;
1310 if (VT == MVT::i8) {
1311 Reg = CCInfo.AllocateReg(RegList8[RegIdx]);
1312 } else if (VT == MVT::i16) {
1313 Reg = CCInfo.AllocateReg(RegList16[RegIdx]);
1314 } else {
1315 llvm_unreachable("calling convention can only manage i8 and i16 types");
1316 }
1317 assert(Reg && "register not available in calling convention");
1318 CCInfo.addLoc(CCValAssign::getReg(i, VT, Reg, VT, CCValAssign::Full));
1319 // Registers sort in increasing order
1320 RegIdx -= VT.getStoreSize();
1321 }
1322}
1323
1324SDValue AVRTargetLowering::LowerFormalArguments(
1325 SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
1326 const SmallVectorImpl<ISD::InputArg> &Ins, const SDLoc &dl,
1327 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
1328 MachineFunction &MF = DAG.getMachineFunction();
1329 MachineFrameInfo &MFI = MF.getFrameInfo();
1330 auto DL = DAG.getDataLayout();
1331
1332 // Assign locations to all of the incoming arguments.
1334 CCState CCInfo(CallConv, isVarArg, DAG.getMachineFunction(), ArgLocs,
1335 *DAG.getContext());
1336
1337 // Variadic functions do not need all the analysis below.
1338 if (isVarArg) {
1339 CCInfo.AnalyzeFormalArguments(Ins, ArgCC_AVR_Vararg);
1340 } else {
1341 analyzeArguments(nullptr, &MF.getFunction(), &DL, Ins, ArgLocs, CCInfo,
1342 Subtarget.hasTinyEncoding());
1343 }
1344
1345 SDValue ArgValue;
1346 for (CCValAssign &VA : ArgLocs) {
1347
1348 // Arguments stored on registers.
1349 if (VA.isRegLoc()) {
1350 EVT RegVT = VA.getLocVT();
1351 const TargetRegisterClass *RC;
1352 if (RegVT == MVT::i8) {
1353 RC = &AVR::GPR8RegClass;
1354 } else if (RegVT == MVT::i16) {
1355 RC = &AVR::DREGSRegClass;
1356 } else {
1357 llvm_unreachable("Unknown argument type!");
1358 }
1359
1360 Register Reg = MF.addLiveIn(VA.getLocReg(), RC);
1361 ArgValue = DAG.getCopyFromReg(Chain, dl, Reg, RegVT);
1362
1363 // :NOTE: Clang should not promote any i8 into i16 but for safety the
1364 // following code will handle zexts or sexts generated by other
1365 // front ends. Otherwise:
1366 // If this is an 8 bit value, it is really passed promoted
1367 // to 16 bits. Insert an assert[sz]ext to capture this, then
1368 // truncate to the right size.
1369 switch (VA.getLocInfo()) {
1370 default:
1371 llvm_unreachable("Unknown loc info!");
1372 case CCValAssign::Full:
1373 break;
1374 case CCValAssign::BCvt:
1375 ArgValue = DAG.getNode(ISD::BITCAST, dl, VA.getValVT(), ArgValue);
1376 break;
1377 case CCValAssign::SExt:
1378 ArgValue = DAG.getNode(ISD::AssertSext, dl, RegVT, ArgValue,
1379 DAG.getValueType(VA.getValVT()));
1380 ArgValue = DAG.getNode(ISD::TRUNCATE, dl, VA.getValVT(), ArgValue);
1381 break;
1382 case CCValAssign::ZExt:
1383 ArgValue = DAG.getNode(ISD::AssertZext, dl, RegVT, ArgValue,
1384 DAG.getValueType(VA.getValVT()));
1385 ArgValue = DAG.getNode(ISD::TRUNCATE, dl, VA.getValVT(), ArgValue);
1386 break;
1387 }
1388
1389 InVals.push_back(ArgValue);
1390 } else {
1391 // Only arguments passed on the stack should make it here.
1392 assert(VA.isMemLoc());
1393
1394 EVT LocVT = VA.getLocVT();
1395
1396 // Create the frame index object for this incoming parameter.
1397 int FI = MFI.CreateFixedObject(LocVT.getSizeInBits() / 8,
1398 VA.getLocMemOffset(), true);
1399
1400 // Create the SelectionDAG nodes corresponding to a load
1401 // from this parameter.
1402 SDValue FIN = DAG.getFrameIndex(FI, getPointerTy(DL));
1403 InVals.push_back(DAG.getLoad(LocVT, dl, Chain, FIN,
1405 }
1406 }
1407
1408 // If the function takes variable number of arguments, make a frame index for
1409 // the start of the first vararg value... for expansion of llvm.va_start.
1410 if (isVarArg) {
1411 unsigned StackSize = CCInfo.getStackSize();
1412 AVRMachineFunctionInfo *AFI = MF.getInfo<AVRMachineFunctionInfo>();
1413
1414 AFI->setVarArgsFrameIndex(MFI.CreateFixedObject(2, StackSize, true));
1415 }
1416
1417 return Chain;
1418}
1419
1420//===----------------------------------------------------------------------===//
1421// Call Calling Convention Implementation
1422//===----------------------------------------------------------------------===//
1423
1424SDValue AVRTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
1425 SmallVectorImpl<SDValue> &InVals) const {
1426 SelectionDAG &DAG = CLI.DAG;
1427 SDLoc &DL = CLI.DL;
1428 SmallVectorImpl<ISD::OutputArg> &Outs = CLI.Outs;
1429 SmallVectorImpl<SDValue> &OutVals = CLI.OutVals;
1430 SmallVectorImpl<ISD::InputArg> &Ins = CLI.Ins;
1431 SDValue Chain = CLI.Chain;
1432 SDValue Callee = CLI.Callee;
1433 bool &isTailCall = CLI.IsTailCall;
1434 CallingConv::ID CallConv = CLI.CallConv;
1435 bool isVarArg = CLI.IsVarArg;
1436
1437 MachineFunction &MF = DAG.getMachineFunction();
1438
1439 // AVR does not yet support tail call optimization.
1440 isTailCall = false;
1441
1442 // Analyze operands of the call, assigning locations to each operand.
1444 CCState CCInfo(CallConv, isVarArg, DAG.getMachineFunction(), ArgLocs,
1445 *DAG.getContext());
1446
1447 // If the callee is a GlobalAddress/ExternalSymbol node (quite common, every
1448 // direct call is) turn it into a TargetGlobalAddress/TargetExternalSymbol
1449 // node so that legalize doesn't hack it.
1450 const Function *F = nullptr;
1451 if (const GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee)) {
1452 const GlobalValue *GV = G->getGlobal();
1453 if (isa<Function>(GV))
1454 F = cast<Function>(GV);
1455 Callee =
1456 DAG.getTargetGlobalAddress(GV, DL, getPointerTy(DAG.getDataLayout()));
1457 } else if (const ExternalSymbolSDNode *ES =
1459 Callee = DAG.getTargetExternalSymbol(ES->getSymbol(),
1460 getPointerTy(DAG.getDataLayout()));
1461 }
1462
1463 // Variadic functions do not need all the analysis below.
1464 if (isVarArg) {
1465 CCInfo.AnalyzeCallOperands(Outs, ArgCC_AVR_Vararg);
1466 } else {
1467 analyzeArguments(&CLI, F, &DAG.getDataLayout(), Outs, ArgLocs, CCInfo,
1468 Subtarget.hasTinyEncoding());
1469 }
1470
1471 // Get a count of how many bytes are to be pushed on the stack.
1472 unsigned NumBytes = CCInfo.getStackSize();
1473
1474 Chain = DAG.getCALLSEQ_START(Chain, NumBytes, 0, DL);
1475
1477
1478 // First, walk the register assignments, inserting copies.
1479 unsigned AI, AE;
1480 bool HasStackArgs = false;
1481 for (AI = 0, AE = ArgLocs.size(); AI != AE; ++AI) {
1482 CCValAssign &VA = ArgLocs[AI];
1483 EVT RegVT = VA.getLocVT();
1484 SDValue Arg = OutVals[AI];
1485
1486 // Promote the value if needed. With Clang this should not happen.
1487 switch (VA.getLocInfo()) {
1488 default:
1489 llvm_unreachable("Unknown loc info!");
1490 case CCValAssign::Full:
1491 break;
1492 case CCValAssign::SExt:
1493 Arg = DAG.getNode(ISD::SIGN_EXTEND, DL, RegVT, Arg);
1494 break;
1495 case CCValAssign::ZExt:
1496 Arg = DAG.getNode(ISD::ZERO_EXTEND, DL, RegVT, Arg);
1497 break;
1498 case CCValAssign::AExt:
1499 Arg = DAG.getNode(ISD::ANY_EXTEND, DL, RegVT, Arg);
1500 break;
1501 case CCValAssign::BCvt:
1502 Arg = DAG.getNode(ISD::BITCAST, DL, RegVT, Arg);
1503 break;
1504 }
1505
1506 // Stop when we encounter a stack argument, we need to process them
1507 // in reverse order in the loop below.
1508 if (VA.isMemLoc()) {
1509 HasStackArgs = true;
1510 break;
1511 }
1512
1513 // Arguments that can be passed on registers must be kept in the RegsToPass
1514 // vector.
1515 RegsToPass.push_back(std::make_pair(VA.getLocReg(), Arg));
1516 }
1517
1518 // Second, stack arguments have to walked.
1519 // Previously this code created chained stores but those chained stores appear
1520 // to be unchained in the legalization phase. Therefore, do not attempt to
1521 // chain them here. In fact, chaining them here somehow causes the first and
1522 // second store to be reversed which is the exact opposite of the intended
1523 // effect.
1524 if (HasStackArgs) {
1525 SmallVector<SDValue, 8> MemOpChains;
1526 for (; AI != AE; AI++) {
1527 CCValAssign &VA = ArgLocs[AI];
1528 SDValue Arg = OutVals[AI];
1529
1530 assert(VA.isMemLoc());
1531
1532 // SP points to one stack slot further so add one to adjust it.
1533 SDValue PtrOff = DAG.getNode(
1534 ISD::ADD, DL, getPointerTy(DAG.getDataLayout()),
1535 DAG.getRegister(AVR::SP, getPointerTy(DAG.getDataLayout())),
1536 DAG.getIntPtrConstant(VA.getLocMemOffset() + 1, DL));
1537
1538 MemOpChains.push_back(
1539 DAG.getStore(Chain, DL, Arg, PtrOff,
1540 MachinePointerInfo::getStack(MF, VA.getLocMemOffset())));
1541 }
1542
1543 if (!MemOpChains.empty())
1544 Chain = DAG.getNode(ISD::TokenFactor, DL, MVT::Other, MemOpChains);
1545 }
1546
1547 // Build a sequence of copy-to-reg nodes chained together with token chain and
1548 // flag operands which copy the outgoing args into registers. The InGlue in
1549 // necessary since all emited instructions must be stuck together.
1550 SDValue InGlue;
1551 for (auto Reg : RegsToPass) {
1552 Chain = DAG.getCopyToReg(Chain, DL, Reg.first, Reg.second, InGlue);
1553 InGlue = Chain.getValue(1);
1554 }
1555
1556 // Returns a chain & a flag for retval copy to use.
1557 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
1559 Ops.push_back(Chain);
1560 Ops.push_back(Callee);
1561
1562 // Add argument registers to the end of the list so that they are known live
1563 // into the call.
1564 for (auto Reg : RegsToPass) {
1565 Ops.push_back(DAG.getRegister(Reg.first, Reg.second.getValueType()));
1566 }
1567
1568 // The zero register (usually R1) must be passed as an implicit register so
1569 // that this register is correctly zeroed in interrupts.
1570 Ops.push_back(DAG.getRegister(Subtarget.getZeroRegister(), MVT::i8));
1571
1572 // Add a register mask operand representing the call-preserved registers.
1573 const TargetRegisterInfo *TRI = Subtarget.getRegisterInfo();
1574 const uint32_t *Mask =
1575 TRI->getCallPreservedMask(DAG.getMachineFunction(), CallConv);
1576 assert(Mask && "Missing call preserved mask for calling convention");
1577 Ops.push_back(DAG.getRegisterMask(Mask));
1578
1579 if (InGlue.getNode()) {
1580 Ops.push_back(InGlue);
1581 }
1582
1583 Chain = DAG.getNode(AVRISD::CALL, DL, NodeTys, Ops);
1584 InGlue = Chain.getValue(1);
1585
1586 // Create the CALLSEQ_END node.
1587 Chain = DAG.getCALLSEQ_END(Chain, NumBytes, 0, InGlue, DL);
1588
1589 if (!Ins.empty()) {
1590 InGlue = Chain.getValue(1);
1591 }
1592
1593 // Handle result values, copying them out of physregs into vregs that we
1594 // return.
1595 return LowerCallResult(Chain, InGlue, CallConv, isVarArg, Ins, DL, DAG,
1596 InVals);
1597}
1598
1599/// Lower the result values of a call into the
1600/// appropriate copies out of appropriate physical registers.
1601///
1602SDValue AVRTargetLowering::LowerCallResult(
1603 SDValue Chain, SDValue InGlue, CallingConv::ID CallConv, bool isVarArg,
1604 const SmallVectorImpl<ISD::InputArg> &Ins, const SDLoc &dl,
1605 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
1606
1607 // Assign locations to each value returned by this call.
1609 CCState CCInfo(CallConv, isVarArg, DAG.getMachineFunction(), RVLocs,
1610 *DAG.getContext());
1611
1612 // Handle runtime calling convs.
1613 if (CallConv == CallingConv::AVR_BUILTIN) {
1614 CCInfo.AnalyzeCallResult(Ins, RetCC_AVR_BUILTIN);
1615 } else {
1616 analyzeReturnValues(Ins, CCInfo, Subtarget.hasTinyEncoding());
1617 }
1618
1619 // Copy all of the result registers out of their specified physreg.
1620 for (CCValAssign const &RVLoc : RVLocs) {
1621 Chain = DAG.getCopyFromReg(Chain, dl, RVLoc.getLocReg(), RVLoc.getValVT(),
1622 InGlue)
1623 .getValue(1);
1624 InGlue = Chain.getValue(2);
1625 InVals.push_back(Chain.getValue(0));
1626 }
1627
1628 return Chain;
1629}
1630
1631//===----------------------------------------------------------------------===//
1632// Return Value Calling Convention Implementation
1633//===----------------------------------------------------------------------===//
1634
1635bool AVRTargetLowering::CanLowerReturn(
1636 CallingConv::ID CallConv, MachineFunction &MF, bool isVarArg,
1638 const Type *RetTy) const {
1639 if (CallConv == CallingConv::AVR_BUILTIN) {
1641 CCState CCInfo(CallConv, isVarArg, MF, RVLocs, Context);
1642 return CCInfo.CheckReturn(Outs, RetCC_AVR_BUILTIN);
1643 }
1644
1645 unsigned TotalBytes = getTotalArgumentsSizeInBytes(Outs);
1646 return TotalBytes <= (unsigned)(Subtarget.hasTinyEncoding() ? 4 : 8);
1647}
1648
1649SDValue
1650AVRTargetLowering::LowerReturn(SDValue Chain, CallingConv::ID CallConv,
1651 bool isVarArg,
1653 const SmallVectorImpl<SDValue> &OutVals,
1654 const SDLoc &dl, SelectionDAG &DAG) const {
1655 // CCValAssign - represent the assignment of the return value to locations.
1657
1658 // CCState - Info about the registers and stack slot.
1659 CCState CCInfo(CallConv, isVarArg, DAG.getMachineFunction(), RVLocs,
1660 *DAG.getContext());
1661
1662 MachineFunction &MF = DAG.getMachineFunction();
1663
1664 // Analyze return values.
1665 if (CallConv == CallingConv::AVR_BUILTIN) {
1666 CCInfo.AnalyzeReturn(Outs, RetCC_AVR_BUILTIN);
1667 } else {
1668 analyzeReturnValues(Outs, CCInfo, Subtarget.hasTinyEncoding());
1669 }
1670
1671 SDValue Glue;
1672 SmallVector<SDValue, 4> RetOps(1, Chain);
1673 // Copy the result values into the output registers.
1674 for (unsigned i = 0, e = RVLocs.size(); i != e; ++i) {
1675 CCValAssign &VA = RVLocs[i];
1676 assert(VA.isRegLoc() && "Can only return in registers!");
1677
1678 Chain = DAG.getCopyToReg(Chain, dl, VA.getLocReg(), OutVals[i], Glue);
1679
1680 // Guarantee that all emitted copies are stuck together with flags.
1681 Glue = Chain.getValue(1);
1682 RetOps.push_back(DAG.getRegister(VA.getLocReg(), VA.getLocVT()));
1683 }
1684
1685 // Don't emit the ret/reti instruction when the naked attribute is present in
1686 // the function being compiled.
1687 if (MF.getFunction().getAttributes().hasFnAttr(Attribute::Naked)) {
1688 return Chain;
1689 }
1690
1691 const AVRMachineFunctionInfo *AFI = MF.getInfo<AVRMachineFunctionInfo>();
1692
1693 if (!AFI->isInterruptOrSignalHandler()) {
1694 // The return instruction has an implicit zero register operand: it must
1695 // contain zero on return.
1696 // This is not needed in interrupts however, where the zero register is
1697 // handled specially (only pushed/popped when needed).
1698 RetOps.push_back(DAG.getRegister(Subtarget.getZeroRegister(), MVT::i8));
1699 }
1700
1701 unsigned RetOpc =
1702 AFI->isInterruptOrSignalHandler() ? AVRISD::RETI_GLUE : AVRISD::RET_GLUE;
1703
1704 RetOps[0] = Chain; // Update chain.
1705
1706 if (Glue.getNode()) {
1707 RetOps.push_back(Glue);
1708 }
1709
1710 return DAG.getNode(RetOpc, dl, MVT::Other, RetOps);
1711}
1712
1713//===----------------------------------------------------------------------===//
1714// Custom Inserters
1715//===----------------------------------------------------------------------===//
1716
1717MachineBasicBlock *AVRTargetLowering::insertShift(MachineInstr &MI,
1719 bool Tiny) const {
1720 unsigned Opc;
1721 const TargetRegisterClass *RC;
1722 bool HasRepeatedOperand = false;
1723 MachineFunction *F = BB->getParent();
1724 MachineRegisterInfo &RI = F->getRegInfo();
1725 const TargetInstrInfo &TII = *Subtarget.getInstrInfo();
1726 DebugLoc dl = MI.getDebugLoc();
1727
1728 switch (MI.getOpcode()) {
1729 default:
1730 llvm_unreachable("Invalid shift opcode!");
1731 case AVR::Lsl8:
1732 Opc = AVR::ADDRdRr; // LSL is an alias of ADD Rd, Rd
1733 RC = &AVR::GPR8RegClass;
1734 HasRepeatedOperand = true;
1735 break;
1736 case AVR::Lsl16:
1737 Opc = AVR::LSLWRd;
1738 RC = &AVR::DREGSRegClass;
1739 break;
1740 case AVR::Asr8:
1741 Opc = AVR::ASRRd;
1742 RC = &AVR::GPR8RegClass;
1743 break;
1744 case AVR::Asr16:
1745 Opc = AVR::ASRWRd;
1746 RC = &AVR::DREGSRegClass;
1747 break;
1748 case AVR::Lsr8:
1749 Opc = AVR::LSRRd;
1750 RC = &AVR::GPR8RegClass;
1751 break;
1752 case AVR::Lsr16:
1753 Opc = AVR::LSRWRd;
1754 RC = &AVR::DREGSRegClass;
1755 break;
1756 case AVR::Rol8:
1757 Opc = Tiny ? AVR::ROLBRdR17 : AVR::ROLBRdR1;
1758 RC = &AVR::GPR8RegClass;
1759 break;
1760 case AVR::Rol16:
1761 Opc = AVR::ROLWRd;
1762 RC = &AVR::DREGSRegClass;
1763 break;
1764 case AVR::Ror8:
1765 Opc = AVR::RORBRd;
1766 RC = &AVR::GPR8RegClass;
1767 break;
1768 case AVR::Ror16:
1769 Opc = AVR::RORWRd;
1770 RC = &AVR::DREGSRegClass;
1771 break;
1772 }
1773
1774 const BasicBlock *LLVM_BB = BB->getBasicBlock();
1775
1777 for (I = BB->getIterator(); I != F->end() && &(*I) != BB; ++I)
1778 ;
1779 if (I != F->end())
1780 ++I;
1781
1782 // Create loop block.
1783 MachineBasicBlock *LoopBB = F->CreateMachineBasicBlock(LLVM_BB);
1784 MachineBasicBlock *CheckBB = F->CreateMachineBasicBlock(LLVM_BB);
1785 MachineBasicBlock *RemBB = F->CreateMachineBasicBlock(LLVM_BB);
1786
1787 F->insert(I, LoopBB);
1788 F->insert(I, CheckBB);
1789 F->insert(I, RemBB);
1790
1791 // Update machine-CFG edges by transferring all successors of the current
1792 // block to the block containing instructions after shift.
1793 RemBB->splice(RemBB->begin(), BB, std::next(MachineBasicBlock::iterator(MI)),
1794 BB->end());
1795 RemBB->transferSuccessorsAndUpdatePHIs(BB);
1796
1797 // Add edges BB => LoopBB => CheckBB => RemBB, CheckBB => LoopBB.
1798 BB->addSuccessor(CheckBB);
1799 LoopBB->addSuccessor(CheckBB);
1800 CheckBB->addSuccessor(LoopBB);
1801 CheckBB->addSuccessor(RemBB);
1802
1803 Register ShiftAmtReg = RI.createVirtualRegister(&AVR::GPR8RegClass);
1804 Register ShiftAmtReg2 = RI.createVirtualRegister(&AVR::GPR8RegClass);
1805 Register ShiftReg = RI.createVirtualRegister(RC);
1806 Register ShiftReg2 = RI.createVirtualRegister(RC);
1807 Register ShiftAmtSrcReg = MI.getOperand(2).getReg();
1808 Register SrcReg = MI.getOperand(1).getReg();
1809 Register DstReg = MI.getOperand(0).getReg();
1810
1811 // BB:
1812 // rjmp CheckBB
1813 BuildMI(BB, dl, TII.get(AVR::RJMPk)).addMBB(CheckBB);
1814
1815 // LoopBB:
1816 // ShiftReg2 = shift ShiftReg
1817 auto ShiftMI = BuildMI(LoopBB, dl, TII.get(Opc), ShiftReg2).addReg(ShiftReg);
1818 if (HasRepeatedOperand)
1819 ShiftMI.addReg(ShiftReg);
1820
1821 // CheckBB:
1822 // ShiftReg = phi [%SrcReg, BB], [%ShiftReg2, LoopBB]
1823 // ShiftAmt = phi [%N, BB], [%ShiftAmt2, LoopBB]
1824 // DestReg = phi [%SrcReg, BB], [%ShiftReg, LoopBB]
1825 // ShiftAmt2 = ShiftAmt - 1;
1826 // if (ShiftAmt2 >= 0) goto LoopBB;
1827 BuildMI(CheckBB, dl, TII.get(AVR::PHI), ShiftReg)
1828 .addReg(SrcReg)
1829 .addMBB(BB)
1830 .addReg(ShiftReg2)
1831 .addMBB(LoopBB);
1832 BuildMI(CheckBB, dl, TII.get(AVR::PHI), ShiftAmtReg)
1833 .addReg(ShiftAmtSrcReg)
1834 .addMBB(BB)
1835 .addReg(ShiftAmtReg2)
1836 .addMBB(LoopBB);
1837 BuildMI(CheckBB, dl, TII.get(AVR::PHI), DstReg)
1838 .addReg(SrcReg)
1839 .addMBB(BB)
1840 .addReg(ShiftReg2)
1841 .addMBB(LoopBB);
1842
1843 BuildMI(CheckBB, dl, TII.get(AVR::DECRd), ShiftAmtReg2).addReg(ShiftAmtReg);
1844 BuildMI(CheckBB, dl, TII.get(AVR::BRPLk)).addMBB(LoopBB);
1845
1846 MI.eraseFromParent(); // The pseudo instruction is gone now.
1847 return RemBB;
1848}
1849
1850// Do a multibyte AVR shift. Insert shift instructions and put the output
1851// registers in the Regs array.
1852// Because AVR does not have a normal shift instruction (only a single bit shift
1853// instruction), we have to emulate this behavior with other instructions.
1854// It first tries large steps (moving registers around) and then smaller steps
1855// like single bit shifts.
1856// Large shifts actually reduce the number of shifted registers, so the below
1857// algorithms have to work independently of the number of registers that are
1858// shifted.
1859// For more information and background, see this blogpost:
1860// https://aykevl.nl/2021/02/avr-bitshift
1862 MutableArrayRef<std::pair<Register, int>> Regs,
1863 ISD::NodeType Opc, int64_t ShiftAmt) {
1865 const AVRSubtarget &STI = BB->getParent()->getSubtarget<AVRSubtarget>();
1867 const DebugLoc &dl = MI.getDebugLoc();
1868
1869 const bool ShiftLeft = Opc == ISD::SHL;
1870 const bool ArithmeticShift = Opc == ISD::SRA;
1871
1872 // Zero a register, for use in later operations.
1873 Register ZeroReg = MRI.createVirtualRegister(&AVR::GPR8RegClass);
1874 BuildMI(*BB, MI, dl, TII.get(AVR::COPY), ZeroReg)
1875 .addReg(STI.getZeroRegister());
1876
1877 // Do a shift modulo 6 or 7. This is a bit more complicated than most shifts
1878 // and is hard to compose with the rest, so these are special cased.
1879 // The basic idea is to shift one or two bits in the opposite direction and
1880 // then move registers around to get the correct end result.
1881 if (ShiftLeft && (ShiftAmt % 8) >= 6) {
1882 // Left shift modulo 6 or 7.
1883
1884 // Create a slice of the registers we're going to modify, to ease working
1885 // with them.
1886 size_t ShiftRegsOffset = ShiftAmt / 8;
1887 size_t ShiftRegsSize = Regs.size() - ShiftRegsOffset;
1889 Regs.slice(ShiftRegsOffset, ShiftRegsSize);
1890
1891 // Shift one to the right, keeping the least significant bit as the carry
1892 // bit.
1893 insertMultibyteShift(MI, BB, ShiftRegs, ISD::SRL, 1);
1894
1895 // Rotate the least significant bit from the carry bit into a new register
1896 // (that starts out zero).
1897 Register LowByte = MRI.createVirtualRegister(&AVR::GPR8RegClass);
1898 BuildMI(*BB, MI, dl, TII.get(AVR::RORRd), LowByte).addReg(ZeroReg);
1899
1900 // Shift one more to the right if this is a modulo-6 shift.
1901 if (ShiftAmt % 8 == 6) {
1902 insertMultibyteShift(MI, BB, ShiftRegs, ISD::SRL, 1);
1903 Register NewLowByte = MRI.createVirtualRegister(&AVR::GPR8RegClass);
1904 BuildMI(*BB, MI, dl, TII.get(AVR::RORRd), NewLowByte).addReg(LowByte);
1905 LowByte = NewLowByte;
1906 }
1907
1908 // Move all registers to the left, zeroing the bottom registers as needed.
1909 for (size_t I = 0; I < Regs.size(); I++) {
1910 int ShiftRegsIdx = I + 1;
1911 if (ShiftRegsIdx < (int)ShiftRegs.size()) {
1912 Regs[I] = ShiftRegs[ShiftRegsIdx];
1913 } else if (ShiftRegsIdx == (int)ShiftRegs.size()) {
1914 Regs[I] = std::pair(LowByte, 0);
1915 } else {
1916 Regs[I] = std::pair(ZeroReg, 0);
1917 }
1918 }
1919
1920 return;
1921 }
1922
1923 // Right shift modulo 6 or 7.
1924 if (!ShiftLeft && (ShiftAmt % 8) >= 6) {
1925 // Create a view on the registers we're going to modify, to ease working
1926 // with them.
1927 size_t ShiftRegsSize = Regs.size() - (ShiftAmt / 8);
1929 Regs.slice(0, ShiftRegsSize);
1930
1931 // Shift one to the left.
1932 insertMultibyteShift(MI, BB, ShiftRegs, ISD::SHL, 1);
1933
1934 // Sign or zero extend the most significant register into a new register.
1935 // The HighByte is the byte that still has one (or two) bits from the
1936 // original value. The ExtByte is purely a zero/sign extend byte (all bits
1937 // are either 0 or 1).
1938 Register HighByte = MRI.createVirtualRegister(&AVR::GPR8RegClass);
1939 Register ExtByte = 0;
1940 if (ArithmeticShift) {
1941 // Sign-extend bit that was shifted out last.
1942 BuildMI(*BB, MI, dl, TII.get(AVR::SBCRdRr), HighByte)
1943 .addReg(HighByte, RegState::Undef)
1944 .addReg(HighByte, RegState::Undef);
1945 ExtByte = HighByte;
1946 // The highest bit of the original value is the same as the zero-extend
1947 // byte, so HighByte and ExtByte are the same.
1948 } else {
1949 // Use the zero register for zero extending.
1950 ExtByte = ZeroReg;
1951 // Rotate most significant bit into a new register (that starts out zero).
1952 BuildMI(*BB, MI, dl, TII.get(AVR::ADCRdRr), HighByte)
1953 .addReg(ExtByte)
1954 .addReg(ExtByte);
1955 }
1956
1957 // Shift one more to the left for modulo 6 shifts.
1958 if (ShiftAmt % 8 == 6) {
1959 insertMultibyteShift(MI, BB, ShiftRegs, ISD::SHL, 1);
1960 // Shift the topmost bit into the HighByte.
1961 Register NewExt = MRI.createVirtualRegister(&AVR::GPR8RegClass);
1962 BuildMI(*BB, MI, dl, TII.get(AVR::ADCRdRr), NewExt)
1963 .addReg(HighByte)
1964 .addReg(HighByte);
1965 HighByte = NewExt;
1966 }
1967
1968 // Move all to the right, while sign or zero extending.
1969 for (int I = Regs.size() - 1; I >= 0; I--) {
1970 int ShiftRegsIdx = I - (Regs.size() - ShiftRegs.size()) - 1;
1971 if (ShiftRegsIdx >= 0) {
1972 Regs[I] = ShiftRegs[ShiftRegsIdx];
1973 } else if (ShiftRegsIdx == -1) {
1974 Regs[I] = std::pair(HighByte, 0);
1975 } else {
1976 Regs[I] = std::pair(ExtByte, 0);
1977 }
1978 }
1979
1980 return;
1981 }
1982
1983 // For shift amounts of at least one register, simply rename the registers and
1984 // zero the bottom registers.
1985 while (ShiftLeft && ShiftAmt >= 8) {
1986 // Move all registers one to the left.
1987 for (size_t I = 0; I < Regs.size() - 1; I++) {
1988 Regs[I] = Regs[I + 1];
1989 }
1990
1991 // Zero the least significant register.
1992 Regs[Regs.size() - 1] = std::pair(ZeroReg, 0);
1993
1994 // Continue shifts with the leftover registers.
1995 Regs = Regs.drop_back(1);
1996
1997 ShiftAmt -= 8;
1998 }
1999
2000 // And again, the same for right shifts.
2001 Register ShrExtendReg = 0;
2002 if (!ShiftLeft && ShiftAmt >= 8) {
2003 if (ArithmeticShift) {
2004 // Sign extend the most significant register into ShrExtendReg.
2005 ShrExtendReg = MRI.createVirtualRegister(&AVR::GPR8RegClass);
2006 Register Tmp = MRI.createVirtualRegister(&AVR::GPR8RegClass);
2007 BuildMI(*BB, MI, dl, TII.get(AVR::ADDRdRr), Tmp)
2008 .addReg(Regs[0].first, 0, Regs[0].second)
2009 .addReg(Regs[0].first, 0, Regs[0].second);
2010 BuildMI(*BB, MI, dl, TII.get(AVR::SBCRdRr), ShrExtendReg)
2011 .addReg(Tmp)
2012 .addReg(Tmp);
2013 } else {
2014 ShrExtendReg = ZeroReg;
2015 }
2016 for (; ShiftAmt >= 8; ShiftAmt -= 8) {
2017 // Move all registers one to the right.
2018 for (size_t I = Regs.size() - 1; I != 0; I--) {
2019 Regs[I] = Regs[I - 1];
2020 }
2021
2022 // Zero or sign extend the most significant register.
2023 Regs[0] = std::pair(ShrExtendReg, 0);
2024
2025 // Continue shifts with the leftover registers.
2026 Regs = Regs.drop_front(1);
2027 }
2028 }
2029
2030 // The bigger shifts are already handled above.
2031 assert((ShiftAmt < 8) && "Unexpect shift amount");
2032
2033 // Shift by four bits, using a complicated swap/eor/andi/eor sequence.
2034 // It only works for logical shifts because the bits shifted in are all
2035 // zeroes.
2036 // To shift a single byte right, it produces code like this:
2037 // swap r0
2038 // andi r0, 0x0f
2039 // For a two-byte (16-bit) shift, it adds the following instructions to shift
2040 // the upper byte into the lower byte:
2041 // swap r1
2042 // eor r0, r1
2043 // andi r1, 0x0f
2044 // eor r0, r1
2045 // For bigger shifts, it repeats the above sequence. For example, for a 3-byte
2046 // (24-bit) shift it adds:
2047 // swap r2
2048 // eor r1, r2
2049 // andi r2, 0x0f
2050 // eor r1, r2
2051 if (!ArithmeticShift && ShiftAmt >= 4) {
2052 Register Prev = 0;
2053 for (size_t I = 0; I < Regs.size(); I++) {
2054 size_t Idx = ShiftLeft ? I : Regs.size() - I - 1;
2055 Register SwapReg = MRI.createVirtualRegister(&AVR::LD8RegClass);
2056 BuildMI(*BB, MI, dl, TII.get(AVR::SWAPRd), SwapReg)
2057 .addReg(Regs[Idx].first, 0, Regs[Idx].second);
2058 if (I != 0) {
2059 Register R = MRI.createVirtualRegister(&AVR::GPR8RegClass);
2060 BuildMI(*BB, MI, dl, TII.get(AVR::EORRdRr), R)
2061 .addReg(Prev)
2062 .addReg(SwapReg);
2063 Prev = R;
2064 }
2065 Register AndReg = MRI.createVirtualRegister(&AVR::LD8RegClass);
2066 BuildMI(*BB, MI, dl, TII.get(AVR::ANDIRdK), AndReg)
2067 .addReg(SwapReg)
2068 .addImm(ShiftLeft ? 0xf0 : 0x0f);
2069 if (I != 0) {
2070 Register R = MRI.createVirtualRegister(&AVR::GPR8RegClass);
2071 BuildMI(*BB, MI, dl, TII.get(AVR::EORRdRr), R)
2072 .addReg(Prev)
2073 .addReg(AndReg);
2074 size_t PrevIdx = ShiftLeft ? Idx - 1 : Idx + 1;
2075 Regs[PrevIdx] = std::pair(R, 0);
2076 }
2077 Prev = AndReg;
2078 Regs[Idx] = std::pair(AndReg, 0);
2079 }
2080 ShiftAmt -= 4;
2081 }
2082
2083 // Shift by one. This is the fallback that always works, and the shift
2084 // operation that is used for 1, 2, and 3 bit shifts.
2085 while (ShiftLeft && ShiftAmt) {
2086 // Shift one to the left.
2087 for (ssize_t I = Regs.size() - 1; I >= 0; I--) {
2088 Register Out = MRI.createVirtualRegister(&AVR::GPR8RegClass);
2089 Register In = Regs[I].first;
2090 Register InSubreg = Regs[I].second;
2091 if (I == (ssize_t)Regs.size() - 1) { // first iteration
2092 BuildMI(*BB, MI, dl, TII.get(AVR::ADDRdRr), Out)
2093 .addReg(In, 0, InSubreg)
2094 .addReg(In, 0, InSubreg);
2095 } else {
2096 BuildMI(*BB, MI, dl, TII.get(AVR::ADCRdRr), Out)
2097 .addReg(In, 0, InSubreg)
2098 .addReg(In, 0, InSubreg);
2099 }
2100 Regs[I] = std::pair(Out, 0);
2101 }
2102 ShiftAmt--;
2103 }
2104 while (!ShiftLeft && ShiftAmt) {
2105 // Shift one to the right.
2106 for (size_t I = 0; I < Regs.size(); I++) {
2107 Register Out = MRI.createVirtualRegister(&AVR::GPR8RegClass);
2108 Register In = Regs[I].first;
2109 Register InSubreg = Regs[I].second;
2110 if (I == 0) {
2111 unsigned Opc = ArithmeticShift ? AVR::ASRRd : AVR::LSRRd;
2112 BuildMI(*BB, MI, dl, TII.get(Opc), Out).addReg(In, 0, InSubreg);
2113 } else {
2114 BuildMI(*BB, MI, dl, TII.get(AVR::RORRd), Out).addReg(In, 0, InSubreg);
2115 }
2116 Regs[I] = std::pair(Out, 0);
2117 }
2118 ShiftAmt--;
2119 }
2120
2121 if (ShiftAmt != 0) {
2122 llvm_unreachable("don't know how to shift!"); // sanity check
2123 }
2124}
2125
2126// Do a wide (32-bit) shift.
2127MachineBasicBlock *
2128AVRTargetLowering::insertWideShift(MachineInstr &MI,
2129 MachineBasicBlock *BB) const {
2130 const TargetInstrInfo &TII = *Subtarget.getInstrInfo();
2131 const DebugLoc &dl = MI.getDebugLoc();
2132
2133 // How much to shift to the right (meaning: a negative number indicates a left
2134 // shift).
2135 int64_t ShiftAmt = MI.getOperand(4).getImm();
2137 switch (MI.getOpcode()) {
2138 case AVR::Lsl32:
2139 Opc = ISD::SHL;
2140 break;
2141 case AVR::Lsr32:
2142 Opc = ISD::SRL;
2143 break;
2144 case AVR::Asr32:
2145 Opc = ISD::SRA;
2146 break;
2147 }
2148
2149 // Read the input registers, with the most significant register at index 0.
2150 std::array<std::pair<Register, int>, 4> Registers = {
2151 std::pair(MI.getOperand(3).getReg(), AVR::sub_hi),
2152 std::pair(MI.getOperand(3).getReg(), AVR::sub_lo),
2153 std::pair(MI.getOperand(2).getReg(), AVR::sub_hi),
2154 std::pair(MI.getOperand(2).getReg(), AVR::sub_lo),
2155 };
2156
2157 // Do the shift. The registers are modified in-place.
2158 insertMultibyteShift(MI, BB, Registers, Opc, ShiftAmt);
2159
2160 // Combine the 8-bit registers into 16-bit register pairs.
2161 // This done either from LSB to MSB or from MSB to LSB, depending on the
2162 // shift. It's an optimization so that the register allocator will use the
2163 // fewest movs possible (which order we use isn't a correctness issue, just an
2164 // optimization issue).
2165 // - lsl prefers starting from the most significant byte (2nd case).
2166 // - lshr prefers starting from the least significant byte (1st case).
2167 // - for ashr it depends on the number of shifted bytes.
2168 // Some shift operations still don't get the most optimal mov sequences even
2169 // with this distinction. TODO: figure out why and try to fix it (but we're
2170 // already equal to or faster than avr-gcc in all cases except ashr 8).
2171 if (Opc != ISD::SHL &&
2172 (Opc != ISD::SRA || (ShiftAmt < 16 || ShiftAmt >= 22))) {
2173 // Use the resulting registers starting with the least significant byte.
2174 BuildMI(*BB, MI, dl, TII.get(AVR::REG_SEQUENCE), MI.getOperand(0).getReg())
2175 .addReg(Registers[3].first, 0, Registers[3].second)
2176 .addImm(AVR::sub_lo)
2177 .addReg(Registers[2].first, 0, Registers[2].second)
2178 .addImm(AVR::sub_hi);
2179 BuildMI(*BB, MI, dl, TII.get(AVR::REG_SEQUENCE), MI.getOperand(1).getReg())
2180 .addReg(Registers[1].first, 0, Registers[1].second)
2181 .addImm(AVR::sub_lo)
2182 .addReg(Registers[0].first, 0, Registers[0].second)
2183 .addImm(AVR::sub_hi);
2184 } else {
2185 // Use the resulting registers starting with the most significant byte.
2186 BuildMI(*BB, MI, dl, TII.get(AVR::REG_SEQUENCE), MI.getOperand(1).getReg())
2187 .addReg(Registers[0].first, 0, Registers[0].second)
2188 .addImm(AVR::sub_hi)
2189 .addReg(Registers[1].first, 0, Registers[1].second)
2190 .addImm(AVR::sub_lo);
2191 BuildMI(*BB, MI, dl, TII.get(AVR::REG_SEQUENCE), MI.getOperand(0).getReg())
2192 .addReg(Registers[2].first, 0, Registers[2].second)
2193 .addImm(AVR::sub_hi)
2194 .addReg(Registers[3].first, 0, Registers[3].second)
2195 .addImm(AVR::sub_lo);
2196 }
2197
2198 // Remove the pseudo instruction.
2199 MI.eraseFromParent();
2200 return BB;
2201}
2202
2204 if (I->getOpcode() == AVR::COPY) {
2205 Register SrcReg = I->getOperand(1).getReg();
2206 return (SrcReg == AVR::R0 || SrcReg == AVR::R1);
2207 }
2208
2209 return false;
2210}
2211
2212// The mul instructions wreak havock on our zero_reg R1. We need to clear it
2213// after the result has been evacuated. This is probably not the best way to do
2214// it, but it works for now.
2215MachineBasicBlock *AVRTargetLowering::insertMul(MachineInstr &MI,
2216 MachineBasicBlock *BB) const {
2217 const TargetInstrInfo &TII = *Subtarget.getInstrInfo();
2219 ++I; // in any case insert *after* the mul instruction
2220 if (isCopyMulResult(I))
2221 ++I;
2222 if (isCopyMulResult(I))
2223 ++I;
2224 BuildMI(*BB, I, MI.getDebugLoc(), TII.get(AVR::EORRdRr), AVR::R1)
2225 .addReg(AVR::R1)
2226 .addReg(AVR::R1);
2227 return BB;
2228}
2229
2230// Insert a read from the zero register.
2232AVRTargetLowering::insertCopyZero(MachineInstr &MI,
2233 MachineBasicBlock *BB) const {
2234 const TargetInstrInfo &TII = *Subtarget.getInstrInfo();
2236 BuildMI(*BB, I, MI.getDebugLoc(), TII.get(AVR::COPY))
2237 .add(MI.getOperand(0))
2238 .addReg(Subtarget.getZeroRegister());
2239 MI.eraseFromParent();
2240 return BB;
2241}
2242
2243// Lower atomicrmw operation to disable interrupts, do operation, and restore
2244// interrupts. This works because all AVR microcontrollers are single core.
2245MachineBasicBlock *AVRTargetLowering::insertAtomicArithmeticOp(
2246 MachineInstr &MI, MachineBasicBlock *BB, unsigned Opcode, int Width) const {
2247 MachineRegisterInfo &MRI = BB->getParent()->getRegInfo();
2248 const TargetInstrInfo &TII = *Subtarget.getInstrInfo();
2250 DebugLoc dl = MI.getDebugLoc();
2251
2252 // Example instruction sequence, for an atomic 8-bit add:
2253 // ldi r25, 5
2254 // in r0, SREG
2255 // cli
2256 // ld r24, X
2257 // add r25, r24
2258 // st X, r25
2259 // out SREG, r0
2260
2261 const TargetRegisterClass *RC =
2262 (Width == 8) ? &AVR::GPR8RegClass : &AVR::DREGSRegClass;
2263 unsigned LoadOpcode = (Width == 8) ? AVR::LDRdPtr : AVR::LDWRdPtr;
2264 unsigned StoreOpcode = (Width == 8) ? AVR::STPtrRr : AVR::STWPtrRr;
2265
2266 // Disable interrupts.
2267 BuildMI(*BB, I, dl, TII.get(AVR::INRdA), Subtarget.getTmpRegister())
2268 .addImm(Subtarget.getIORegSREG());
2269 BuildMI(*BB, I, dl, TII.get(AVR::BCLRs)).addImm(7);
2270
2271 // Load the original value.
2272 BuildMI(*BB, I, dl, TII.get(LoadOpcode), MI.getOperand(0).getReg())
2273 .add(MI.getOperand(1));
2274
2275 // Do the arithmetic operation.
2276 Register Result = MRI.createVirtualRegister(RC);
2277 BuildMI(*BB, I, dl, TII.get(Opcode), Result)
2278 .addReg(MI.getOperand(0).getReg())
2279 .add(MI.getOperand(2));
2280
2281 // Store the result.
2282 BuildMI(*BB, I, dl, TII.get(StoreOpcode))
2283 .add(MI.getOperand(1))
2284 .addReg(Result);
2285
2286 // Restore interrupts.
2287 BuildMI(*BB, I, dl, TII.get(AVR::OUTARr))
2288 .addImm(Subtarget.getIORegSREG())
2289 .addReg(Subtarget.getTmpRegister());
2290
2291 // Remove the pseudo instruction.
2292 MI.eraseFromParent();
2293 return BB;
2294}
2295
2298 MachineBasicBlock *MBB) const {
2299 int Opc = MI.getOpcode();
2300 const AVRSubtarget &STI = MBB->getParent()->getSubtarget<AVRSubtarget>();
2301
2302 // Pseudo shift instructions with a non constant shift amount are expanded
2303 // into a loop.
2304 switch (Opc) {
2305 case AVR::Lsl8:
2306 case AVR::Lsl16:
2307 case AVR::Lsr8:
2308 case AVR::Lsr16:
2309 case AVR::Rol8:
2310 case AVR::Rol16:
2311 case AVR::Ror8:
2312 case AVR::Ror16:
2313 case AVR::Asr8:
2314 case AVR::Asr16:
2315 return insertShift(MI, MBB, STI.hasTinyEncoding());
2316 case AVR::Lsl32:
2317 case AVR::Lsr32:
2318 case AVR::Asr32:
2319 return insertWideShift(MI, MBB);
2320 case AVR::MULRdRr:
2321 case AVR::MULSRdRr:
2322 return insertMul(MI, MBB);
2323 case AVR::CopyZero:
2324 return insertCopyZero(MI, MBB);
2325 case AVR::AtomicLoadAdd8:
2326 return insertAtomicArithmeticOp(MI, MBB, AVR::ADDRdRr, 8);
2327 case AVR::AtomicLoadAdd16:
2328 return insertAtomicArithmeticOp(MI, MBB, AVR::ADDWRdRr, 16);
2329 case AVR::AtomicLoadSub8:
2330 return insertAtomicArithmeticOp(MI, MBB, AVR::SUBRdRr, 8);
2331 case AVR::AtomicLoadSub16:
2332 return insertAtomicArithmeticOp(MI, MBB, AVR::SUBWRdRr, 16);
2333 case AVR::AtomicLoadAnd8:
2334 return insertAtomicArithmeticOp(MI, MBB, AVR::ANDRdRr, 8);
2335 case AVR::AtomicLoadAnd16:
2336 return insertAtomicArithmeticOp(MI, MBB, AVR::ANDWRdRr, 16);
2337 case AVR::AtomicLoadOr8:
2338 return insertAtomicArithmeticOp(MI, MBB, AVR::ORRdRr, 8);
2339 case AVR::AtomicLoadOr16:
2340 return insertAtomicArithmeticOp(MI, MBB, AVR::ORWRdRr, 16);
2341 case AVR::AtomicLoadXor8:
2342 return insertAtomicArithmeticOp(MI, MBB, AVR::EORRdRr, 8);
2343 case AVR::AtomicLoadXor16:
2344 return insertAtomicArithmeticOp(MI, MBB, AVR::EORWRdRr, 16);
2345 }
2346
2347 assert((Opc == AVR::Select16 || Opc == AVR::Select8) &&
2348 "Unexpected instr type to insert");
2349
2350 const AVRInstrInfo &TII = (const AVRInstrInfo &)*MI.getParent()
2351 ->getParent()
2352 ->getSubtarget()
2353 .getInstrInfo();
2354 DebugLoc dl = MI.getDebugLoc();
2355
2356 // To "insert" a SELECT instruction, we insert the diamond
2357 // control-flow pattern. The incoming instruction knows the
2358 // destination vreg to set, the condition code register to branch
2359 // on, the true/false values to select between, and a branch opcode
2360 // to use.
2361
2362 MachineFunction *MF = MBB->getParent();
2363 const BasicBlock *LLVM_BB = MBB->getBasicBlock();
2364 MachineBasicBlock *FallThrough = MBB->getFallThrough();
2365
2366 // If the current basic block falls through to another basic block,
2367 // we must insert an unconditional branch to the fallthrough destination
2368 // if we are to insert basic blocks at the prior fallthrough point.
2369 if (FallThrough != nullptr) {
2370 BuildMI(MBB, dl, TII.get(AVR::RJMPk)).addMBB(FallThrough);
2371 }
2372
2373 MachineBasicBlock *trueMBB = MF->CreateMachineBasicBlock(LLVM_BB);
2374 MachineBasicBlock *falseMBB = MF->CreateMachineBasicBlock(LLVM_BB);
2375
2377 for (I = MF->begin(); I != MF->end() && &(*I) != MBB; ++I)
2378 ;
2379 if (I != MF->end())
2380 ++I;
2381 MF->insert(I, trueMBB);
2382 MF->insert(I, falseMBB);
2383
2384 // Set the call frame size on entry to the new basic blocks.
2385 unsigned CallFrameSize = TII.getCallFrameSizeAt(MI);
2386 trueMBB->setCallFrameSize(CallFrameSize);
2387 falseMBB->setCallFrameSize(CallFrameSize);
2388
2389 // Transfer remaining instructions and all successors of the current
2390 // block to the block which will contain the Phi node for the
2391 // select.
2392 trueMBB->splice(trueMBB->begin(), MBB,
2393 std::next(MachineBasicBlock::iterator(MI)), MBB->end());
2395
2396 AVRCC::CondCodes CC = (AVRCC::CondCodes)MI.getOperand(3).getImm();
2397 BuildMI(MBB, dl, TII.getBrCond(CC)).addMBB(trueMBB);
2398 BuildMI(MBB, dl, TII.get(AVR::RJMPk)).addMBB(falseMBB);
2399 MBB->addSuccessor(falseMBB);
2400 MBB->addSuccessor(trueMBB);
2401
2402 // Unconditionally flow back to the true block
2403 BuildMI(falseMBB, dl, TII.get(AVR::RJMPk)).addMBB(trueMBB);
2404 falseMBB->addSuccessor(trueMBB);
2405
2406 // Set up the Phi node to determine where we came from
2407 BuildMI(*trueMBB, trueMBB->begin(), dl, TII.get(AVR::PHI),
2408 MI.getOperand(0).getReg())
2409 .addReg(MI.getOperand(1).getReg())
2410 .addMBB(MBB)
2411 .addReg(MI.getOperand(2).getReg())
2412 .addMBB(falseMBB);
2413
2414 MI.eraseFromParent(); // The pseudo instruction is gone now.
2415 return trueMBB;
2416}
2417
2418//===----------------------------------------------------------------------===//
2419// Inline Asm Support
2420//===----------------------------------------------------------------------===//
2421
2424 if (Constraint.size() == 1) {
2425 // See http://www.nongnu.org/avr-libc/user-manual/inline_asm.html
2426 switch (Constraint[0]) {
2427 default:
2428 break;
2429 case 'a': // Simple upper registers
2430 case 'b': // Base pointer registers pairs
2431 case 'd': // Upper register
2432 case 'l': // Lower registers
2433 case 'e': // Pointer register pairs
2434 case 'q': // Stack pointer register
2435 case 'r': // Any register
2436 case 'w': // Special upper register pairs
2437 return C_RegisterClass;
2438 case 't': // Temporary register
2439 case 'x':
2440 case 'X': // Pointer register pair X
2441 case 'y':
2442 case 'Y': // Pointer register pair Y
2443 case 'z':
2444 case 'Z': // Pointer register pair Z
2445 return C_Register;
2446 case 'Q': // A memory address based on Y or Z pointer with displacement.
2447 return C_Memory;
2448 case 'G': // Floating point constant
2449 case 'I': // 6-bit positive integer constant
2450 case 'J': // 6-bit negative integer constant
2451 case 'K': // Integer constant (Range: 2)
2452 case 'L': // Integer constant (Range: 0)
2453 case 'M': // 8-bit integer constant
2454 case 'N': // Integer constant (Range: -1)
2455 case 'O': // Integer constant (Range: 8, 16, 24)
2456 case 'P': // Integer constant (Range: 1)
2457 case 'R': // Integer constant (Range: -6 to 5)x
2458 return C_Immediate;
2459 }
2460 }
2461
2462 return TargetLowering::getConstraintType(Constraint);
2463}
2464
2467 // Not sure if this is actually the right thing to do, but we got to do
2468 // *something* [agnat]
2469 switch (ConstraintCode[0]) {
2470 case 'Q':
2472 }
2473 return TargetLowering::getInlineAsmMemConstraint(ConstraintCode);
2474}
2475
2478 AsmOperandInfo &info, const char *constraint) const {
2480 Value *CallOperandVal = info.CallOperandVal;
2481
2482 // If we don't have a value, we can't do a match,
2483 // but allow it at the lowest weight.
2484 // (this behaviour has been copied from the ARM backend)
2485 if (!CallOperandVal) {
2486 return CW_Default;
2487 }
2488
2489 // Look at the constraint type.
2490 switch (*constraint) {
2491 default:
2493 break;
2494 case 'd':
2495 case 'r':
2496 case 'l':
2497 weight = CW_Register;
2498 break;
2499 case 'a':
2500 case 'b':
2501 case 'e':
2502 case 'q':
2503 case 't':
2504 case 'w':
2505 case 'x':
2506 case 'X':
2507 case 'y':
2508 case 'Y':
2509 case 'z':
2510 case 'Z':
2511 weight = CW_SpecificReg;
2512 break;
2513 case 'G':
2514 if (const ConstantFP *C = dyn_cast<ConstantFP>(CallOperandVal)) {
2515 if (C->isZero()) {
2516 weight = CW_Constant;
2517 }
2518 }
2519 break;
2520 case 'I':
2521 if (const ConstantInt *C = dyn_cast<ConstantInt>(CallOperandVal)) {
2522 if (isUInt<6>(C->getZExtValue())) {
2523 weight = CW_Constant;
2524 }
2525 }
2526 break;
2527 case 'J':
2528 if (const ConstantInt *C = dyn_cast<ConstantInt>(CallOperandVal)) {
2529 if ((C->getSExtValue() >= -63) && (C->getSExtValue() <= 0)) {
2530 weight = CW_Constant;
2531 }
2532 }
2533 break;
2534 case 'K':
2535 if (const ConstantInt *C = dyn_cast<ConstantInt>(CallOperandVal)) {
2536 if (C->getZExtValue() == 2) {
2537 weight = CW_Constant;
2538 }
2539 }
2540 break;
2541 case 'L':
2542 if (const ConstantInt *C = dyn_cast<ConstantInt>(CallOperandVal)) {
2543 if (C->getZExtValue() == 0) {
2544 weight = CW_Constant;
2545 }
2546 }
2547 break;
2548 case 'M':
2549 if (const ConstantInt *C = dyn_cast<ConstantInt>(CallOperandVal)) {
2550 if (isUInt<8>(C->getZExtValue())) {
2551 weight = CW_Constant;
2552 }
2553 }
2554 break;
2555 case 'N':
2556 if (const ConstantInt *C = dyn_cast<ConstantInt>(CallOperandVal)) {
2557 if (C->getSExtValue() == -1) {
2558 weight = CW_Constant;
2559 }
2560 }
2561 break;
2562 case 'O':
2563 if (const ConstantInt *C = dyn_cast<ConstantInt>(CallOperandVal)) {
2564 if ((C->getZExtValue() == 8) || (C->getZExtValue() == 16) ||
2565 (C->getZExtValue() == 24)) {
2566 weight = CW_Constant;
2567 }
2568 }
2569 break;
2570 case 'P':
2571 if (const ConstantInt *C = dyn_cast<ConstantInt>(CallOperandVal)) {
2572 if (C->getZExtValue() == 1) {
2573 weight = CW_Constant;
2574 }
2575 }
2576 break;
2577 case 'R':
2578 if (const ConstantInt *C = dyn_cast<ConstantInt>(CallOperandVal)) {
2579 if ((C->getSExtValue() >= -6) && (C->getSExtValue() <= 5)) {
2580 weight = CW_Constant;
2581 }
2582 }
2583 break;
2584 case 'Q':
2585 weight = CW_Memory;
2586 break;
2587 }
2588
2589 return weight;
2590}
2591
2592std::pair<unsigned, const TargetRegisterClass *>
2594 StringRef Constraint,
2595 MVT VT) const {
2596 if (Constraint.size() == 1) {
2597 switch (Constraint[0]) {
2598 case 'a': // Simple upper registers r16..r23.
2599 if (VT == MVT::i8)
2600 return std::make_pair(0U, &AVR::LD8loRegClass);
2601 else if (VT == MVT::i16)
2602 return std::make_pair(0U, &AVR::DREGSLD8loRegClass);
2603 break;
2604 case 'b': // Base pointer registers: y, z.
2605 if (VT == MVT::i8 || VT == MVT::i16)
2606 return std::make_pair(0U, &AVR::PTRDISPREGSRegClass);
2607 break;
2608 case 'd': // Upper registers r16..r31.
2609 if (VT == MVT::i8)
2610 return std::make_pair(0U, &AVR::LD8RegClass);
2611 else if (VT == MVT::i16)
2612 return std::make_pair(0U, &AVR::DLDREGSRegClass);
2613 break;
2614 case 'l': // Lower registers r0..r15.
2615 if (VT == MVT::i8)
2616 return std::make_pair(0U, &AVR::GPR8loRegClass);
2617 else if (VT == MVT::i16)
2618 return std::make_pair(0U, &AVR::DREGSloRegClass);
2619 break;
2620 case 'e': // Pointer register pairs: x, y, z.
2621 if (VT == MVT::i8 || VT == MVT::i16)
2622 return std::make_pair(0U, &AVR::PTRREGSRegClass);
2623 break;
2624 case 'q': // Stack pointer register: SPH:SPL.
2625 return std::make_pair(0U, &AVR::GPRSPRegClass);
2626 case 'r': // Any register: r0..r31.
2627 if (VT == MVT::i8)
2628 return std::make_pair(0U, &AVR::GPR8RegClass);
2629 else if (VT == MVT::i16)
2630 return std::make_pair(0U, &AVR::DREGSRegClass);
2631 break;
2632 case 't': // Temporary register: r0.
2633 if (VT == MVT::i8)
2634 return std::make_pair(unsigned(Subtarget.getTmpRegister()),
2635 &AVR::GPR8RegClass);
2636 break;
2637 case 'w': // Special upper register pairs: r24, r26, r28, r30.
2638 if (VT == MVT::i8 || VT == MVT::i16)
2639 return std::make_pair(0U, &AVR::IWREGSRegClass);
2640 break;
2641 case 'x': // Pointer register pair X: r27:r26.
2642 case 'X':
2643 if (VT == MVT::i8 || VT == MVT::i16)
2644 return std::make_pair(unsigned(AVR::R27R26), &AVR::PTRREGSRegClass);
2645 break;
2646 case 'y': // Pointer register pair Y: r29:r28.
2647 case 'Y':
2648 if (VT == MVT::i8 || VT == MVT::i16)
2649 return std::make_pair(unsigned(AVR::R29R28), &AVR::PTRREGSRegClass);
2650 break;
2651 case 'z': // Pointer register pair Z: r31:r30.
2652 case 'Z':
2653 if (VT == MVT::i8 || VT == MVT::i16)
2654 return std::make_pair(unsigned(AVR::R31R30), &AVR::PTRREGSRegClass);
2655 break;
2656 default:
2657 break;
2658 }
2659 }
2660
2662 Subtarget.getRegisterInfo(), Constraint, VT);
2663}
2664
2666 StringRef Constraint,
2667 std::vector<SDValue> &Ops,
2668 SelectionDAG &DAG) const {
2669 SDValue Result;
2670 SDLoc DL(Op);
2671 EVT Ty = Op.getValueType();
2672
2673 // Currently only support length 1 constraints.
2674 if (Constraint.size() != 1) {
2675 return;
2676 }
2677
2678 char ConstraintLetter = Constraint[0];
2679 switch (ConstraintLetter) {
2680 default:
2681 break;
2682 // Deal with integers first:
2683 case 'I':
2684 case 'J':
2685 case 'K':
2686 case 'L':
2687 case 'M':
2688 case 'N':
2689 case 'O':
2690 case 'P':
2691 case 'R': {
2693 if (!C) {
2694 return;
2695 }
2696
2697 int64_t CVal64 = C->getSExtValue();
2698 uint64_t CUVal64 = C->getZExtValue();
2699 switch (ConstraintLetter) {
2700 case 'I': // 0..63
2701 if (!isUInt<6>(CUVal64))
2702 return;
2703 Result = DAG.getTargetConstant(CUVal64, DL, Ty);
2704 break;
2705 case 'J': // -63..0
2706 if (CVal64 < -63 || CVal64 > 0)
2707 return;
2708 Result = DAG.getTargetConstant(CVal64, DL, Ty);
2709 break;
2710 case 'K': // 2
2711 if (CUVal64 != 2)
2712 return;
2713 Result = DAG.getTargetConstant(CUVal64, DL, Ty);
2714 break;
2715 case 'L': // 0
2716 if (CUVal64 != 0)
2717 return;
2718 Result = DAG.getTargetConstant(CUVal64, DL, Ty);
2719 break;
2720 case 'M': // 0..255
2721 if (!isUInt<8>(CUVal64))
2722 return;
2723 // i8 type may be printed as a negative number,
2724 // e.g. 254 would be printed as -2,
2725 // so we force it to i16 at least.
2726 if (Ty.getSimpleVT() == MVT::i8) {
2727 Ty = MVT::i16;
2728 }
2729 Result = DAG.getTargetConstant(CUVal64, DL, Ty);
2730 break;
2731 case 'N': // -1
2732 if (CVal64 != -1)
2733 return;
2734 Result = DAG.getTargetConstant(CVal64, DL, Ty);
2735 break;
2736 case 'O': // 8, 16, 24
2737 if (CUVal64 != 8 && CUVal64 != 16 && CUVal64 != 24)
2738 return;
2739 Result = DAG.getTargetConstant(CUVal64, DL, Ty);
2740 break;
2741 case 'P': // 1
2742 if (CUVal64 != 1)
2743 return;
2744 Result = DAG.getTargetConstant(CUVal64, DL, Ty);
2745 break;
2746 case 'R': // -6..5
2747 if (CVal64 < -6 || CVal64 > 5)
2748 return;
2749 Result = DAG.getTargetConstant(CVal64, DL, Ty);
2750 break;
2751 }
2752
2753 break;
2754 }
2755 case 'G':
2757 if (!FC || !FC->isZero())
2758 return;
2759 // Soften float to i8 0
2760 Result = DAG.getTargetConstant(0, DL, MVT::i8);
2761 break;
2762 }
2763
2764 if (Result.getNode()) {
2765 Ops.push_back(Result);
2766 return;
2767 }
2768
2769 return TargetLowering::LowerAsmOperandForConstraint(Op, Constraint, Ops, DAG);
2770}
2771
2773 const MachineFunction &MF) const {
2774 Register Reg;
2775
2776 if (VT == LLT::scalar(8)) {
2778 .Case("r0", AVR::R0)
2779 .Case("r1", AVR::R1)
2780 .Default(0);
2781 } else {
2783 .Case("r0", AVR::R1R0)
2784 .Case("sp", AVR::SP)
2785 .Default(0);
2786 }
2787
2788 if (Reg)
2789 return Reg;
2790
2792 Twine("Invalid register name \"" + StringRef(RegName) + "\"."));
2793}
2794
2795} // end of namespace llvm
unsigned const MachineRegisterInfo * MRI
return SDValue()
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Function Alias Analysis Results
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
const HexagonInstrInfo * TII
IRTranslator LLVM IR MI
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define RegName(no)
lazy value info
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define G(x, y, z)
Definition MD5.cpp:55
Register Reg
Register const TargetRegisterInfo * TRI
Promote Memory to Register
Definition Mem2Reg.cpp:110
SI Pre allocate WWM Registers
This file implements the StringSwitch template, which mimics a switch() statement whose cases are str...
Value * RHS
Value * LHS
Utilities related to the AVR instruction set.
A specific AVR target MCU.
Register getZeroRegister() const
const AVRInstrInfo * getInstrInfo() const override
void ReplaceNodeResults(SDNode *N, SmallVectorImpl< SDValue > &Results, SelectionDAG &DAG) const override
Replace a node with an illegal result type with a new node built out of custom code.
SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override
This callback is invoked for operations that are unsupported by the target, which are registered to u...
bool getPreIndexedAddressParts(SDNode *N, SDValue &Base, SDValue &Offset, ISD::MemIndexedMode &AM, SelectionDAG &DAG) const override
Returns true by value, base pointer and offset pointer and addressing mode by reference if the node's...
std::pair< unsigned, const TargetRegisterClass * > getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI, StringRef Constraint, MVT VT) const override
Given a physical register constraint (e.g.
MachineBasicBlock * EmitInstrWithCustomInserter(MachineInstr &MI, MachineBasicBlock *MBB) const override
This method should be implemented by targets that mark instructions with the 'usesCustomInserter' fla...
ConstraintType getConstraintType(StringRef Constraint) const override
Given a constraint, return the type of constraint it is for this target.
const AVRSubtarget & Subtarget
InlineAsm::ConstraintCode getInlineAsmMemConstraint(StringRef ConstraintCode) const override
bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM, Type *Ty, unsigned AS, Instruction *I=nullptr) const override
Return true if the addressing mode represented by AM is legal for this target, for a load/store of th...
ConstraintWeight getSingleConstraintMatchWeight(AsmOperandInfo &info, const char *constraint) const override
Examine constraint string and operand type and determine a weight value.
bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const override
Return true if folding a constant offset with the given GlobalAddress is legal.
Register getRegisterByName(const char *RegName, LLT VT, const MachineFunction &MF) const override
Return the register ID of the name passed in.
AVRTargetLowering(const AVRTargetMachine &TM, const AVRSubtarget &STI)
void LowerAsmOperandForConstraint(SDValue Op, StringRef Constraint, std::vector< SDValue > &Ops, SelectionDAG &DAG) const override
Lower the specified operand into the Ops vector.
EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context, EVT VT) const override
Return the ValueType of the result of SETCC operations.
bool getPostIndexedAddressParts(SDNode *N, SDNode *Op, SDValue &Base, SDValue &Offset, ISD::MemIndexedMode &AM, SelectionDAG &DAG) const override
Returns true by value, base pointer and offset pointer and addressing mode by reference if this node ...
A generic AVR implementation.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
size_t size() const
size - Get the array size.
Definition ArrayRef.h:142
LLVM Basic Block Representation.
Definition BasicBlock.h:62
CCState - This class holds information needed while lowering arguments and return values.
MCRegister AllocateReg(MCPhysReg Reg)
AllocateReg - Attempt to allocate one register.
LLVMContext & getContext() const
int64_t AllocateStack(unsigned Size, Align Alignment)
AllocateStack - Allocate a chunk of stack space with the specified size and alignment.
void addLoc(const CCValAssign &V)
static CCValAssign getReg(unsigned ValNo, MVT ValVT, MCRegister Reg, MVT LocVT, LocInfo HTP, bool IsCustom=false)
static CCValAssign getMem(unsigned ValNo, MVT ValVT, int64_t Offset, MVT LocVT, LocInfo HTP, bool IsCustom=false)
ConstantFP - Floating Point Values [float, double].
Definition Constants.h:282
This is the shared class of boolean and integer constants.
Definition Constants.h:87
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
LLVM_ABI Align getABITypeAlign(Type *Ty) const
Returns the minimum ABI-required alignment for the specified type.
LLVM_ABI TypeSize getTypeAllocSize(Type *Ty) const
Returns the offset in bytes between successive objects of the specified type, including alignment pad...
A debug info location.
Definition DebugLoc.h:123
static constexpr LLT scalar(unsigned SizeInBits)
Get a low-level scalar or aggregate "bag of bits".
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
This class is used to represent ISD::LOAD nodes.
Machine Value Type.
static auto integer_valuetypes()
TypeSize getStoreSize() const
Return the number of bytes overwritten by a store of the specified value type.
LLVM_ABI void transferSuccessorsAndUpdatePHIs(MachineBasicBlock *FromMBB)
Transfers all the successors, as in transferSuccessors, and update PHI operands in the successor bloc...
void setCallFrameSize(unsigned N)
Set the call frame size on entry to this basic block.
LLVM_ABI void addSuccessor(MachineBasicBlock *Succ, BranchProbability Prob=BranchProbability::getUnknown())
Add Succ as a successor of this MachineBasicBlock.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
void splice(iterator Where, MachineBasicBlock *Other, iterator From)
Take an instruction from MBB 'Other' at the position From, and insert it into this MBB right before '...
MachineInstrBundleIterator< MachineInstr > iterator
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
BasicBlockListType::iterator iterator
MachineBasicBlock * CreateMachineBasicBlock(const BasicBlock *BB=nullptr, std::optional< UniqueBBID > BBID=std::nullopt)
CreateMachineInstr - Allocate a new MachineInstr.
void insert(iterator MBBI, MachineBasicBlock *MBB)
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
const MachineInstrBuilder & add(const MachineOperand &MO) const
const MachineInstrBuilder & addReg(Register RegNo, unsigned Flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
const MachineInstrBuilder & addMBB(MachineBasicBlock *MBB, unsigned TargetFlags=0) const
Representation of each machine instruction.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
Definition ArrayRef.h:298
MutableArrayRef< T > slice(size_t N, size_t M) const
slice(n, m) - Chop off the first N elements of the array, and keep M elements in the array.
Definition ArrayRef.h:376
Wrapper class representing virtual and physical registers.
Definition Register.h:20
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Represents one node in the SelectionDAG.
unsigned getNumValues() const
Return the number of values defined/returned by this operator.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
SDValue getValue(unsigned R) const
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
LLVM_ABI SDVTList getVTList(EVT VT)
Return an SDVTList that represents the list of values specified.
LLVM_ABI SDValue getConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
Create a ConstantSDNode wrapping a constant value.
LLVM_ABI SDValue getSignedConstant(int64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
LLVM_ABI SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDUse > Ops)
Gets or creates the specified node.
SDValue getTargetConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isOpaque=false)
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
This class is used to represent ISD::STORE nodes.
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
constexpr size_t size() const
size - Get the string size.
Definition StringRef.h:146
A switch()-like statement whose cases are string literals.
StringSwitch & Case(StringLiteral S, T Value)
static LLVM_ABI StructType * get(LLVMContext &Context, ArrayRef< Type * > Elements, bool isPacked=false)
This static method is the primary way to create a literal StructType.
Definition Type.cpp:413
TargetInstrInfo - Interface to description of machine instruction set.
void setBooleanVectorContents(BooleanContent Ty)
Specify how the target extends the result of a vector boolean value from a vector of i1 to a wider ty...
void setOperationAction(unsigned Op, MVT VT, LegalizeAction Action)
Indicate that the specified operation does not work with the specified type and indicate what to do a...
void setIndexedLoadAction(ArrayRef< unsigned > IdxModes, MVT VT, LegalizeAction Action)
Indicate that the specified indexed load does or does not work with the specified type and indicate w...
void setMinFunctionAlignment(Align Alignment)
Set the target's minimum function alignment.
void setBooleanContents(BooleanContent Ty)
Specify how the target extends the result of integer and floating point boolean values from i1 to a w...
void computeRegisterProperties(const TargetRegisterInfo *TRI)
Once all of the register classes are added, this allows us to compute derived properties we expose.
void addRegisterClass(MVT VT, const TargetRegisterClass *RC)
Add the specified register class as an available regclass for the specified value type.
void setIndexedStoreAction(ArrayRef< unsigned > IdxModes, MVT VT, LegalizeAction Action)
Indicate that the specified indexed store does or does not work with the specified type and indicate ...
void setSupportsUnalignedAtomics(bool UnalignedSupported)
Sets whether unaligned atomic operations are supported.
virtual MVT getPointerTy(const DataLayout &DL, uint32_t AS=0) const
Return the pointer type for the given address space, defaults to the pointer type from the data layou...
void setMinimumJumpTableEntries(unsigned Val)
Indicate the minimum number of blocks to generate jump tables.
void setTruncStoreAction(MVT ValVT, MVT MemVT, LegalizeAction Action)
Indicate that the specified truncating store does not work with the specified type and indicate what ...
void setStackPointerRegisterToSaveRestore(Register R)
If set to a physical register, this specifies the register that llvm.savestack/llvm....
void setLoadExtAction(unsigned ExtType, MVT ValVT, MVT MemVT, LegalizeAction Action)
Indicate that the specified load with extension does not work with the specified type and indicate wh...
std::vector< ArgListEntry > ArgListTy
void setSchedulingPreference(Sched::Preference Pref)
Specify the target scheduling preference.
virtual InlineAsm::ConstraintCode getInlineAsmMemConstraint(StringRef ConstraintCode) const
virtual ConstraintType getConstraintType(StringRef Constraint) const
Given a constraint, return the type of constraint it is for this target.
std::pair< SDValue, SDValue > LowerCallTo(CallLoweringInfo &CLI) const
This function lowers an abstract call to a function into an actual call.
virtual ConstraintWeight getSingleConstraintMatchWeight(AsmOperandInfo &info, const char *constraint) const
Examine constraint string and operand type and determine a weight value.
virtual std::pair< unsigned, const TargetRegisterClass * > getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI, StringRef Constraint, MVT VT) const
Given a physical register constraint (e.g.
TargetLowering(const TargetLowering &)=delete
virtual void LowerAsmOperandForConstraint(SDValue Op, StringRef Constraint, std::vector< SDValue > &Ops, SelectionDAG &DAG) const
Lower the specified operand into the Ops vector.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const TargetInstrInfo * getInstrInfo() const
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
LLVM Value Representation.
Definition Value.h:75
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
CondCodes
AVR specific condition codes.
@ COND_SH
Unsigned same or higher.
@ COND_GE
Greater than or equal.
@ COND_MI
Minus.
@ COND_LO
Unsigned lower.
@ COND_LT
Less than.
@ COND_PL
Plus.
@ COND_EQ
Equal.
@ COND_NE
Not equal.
bool isProgramMemoryAccess(MemSDNode const *N)
Definition AVR.h:75
@ ProgramMemory
Definition AVR.h:45
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
@ Entry
Definition COFF.h:862
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ AVR_BUILTIN
Used for special AVR rtlib functions which have an "optimized" convention to preserve registers.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
NodeType
ISD::NodeType enum - This enum defines the target-independent operators for a SelectionDAG.
Definition ISDOpcodes.h:41
@ SETCC
SetCC operator - This evaluates to a true value iff the condition is true.
Definition ISDOpcodes.h:818
@ STACKRESTORE
STACKRESTORE has two operands, an input chain and a pointer to restore to it returns an output chain.
@ STACKSAVE
STACKSAVE - STACKSAVE has one operand, an input chain.
@ SMUL_LOHI
SMUL_LOHI/UMUL_LOHI - Multiply two integers of type iN, producing a signed/unsigned value of type i[2...
Definition ISDOpcodes.h:275
@ BSWAP
Byte Swap and Counting operators.
Definition ISDOpcodes.h:778
@ VAEND
VAEND, VASTART - VAEND and VASTART have three operands: an input chain, pointer, and a SRCVALUE.
@ ADDC
Carry-setting nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:294
@ ADD
Simple integer binary arithmetic operators.
Definition ISDOpcodes.h:264
@ ANY_EXTEND
ANY_EXTEND - Used for integer types. The high bits are undefined.
Definition ISDOpcodes.h:852
@ GlobalAddress
Definition ISDOpcodes.h:88
@ SDIVREM
SDIVREM/UDIVREM - Divide two integers and produce both a quotient and remainder result.
Definition ISDOpcodes.h:280
@ BITCAST
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
Definition ISDOpcodes.h:992
@ BUILD_PAIR
BUILD_PAIR - This is the opposite of EXTRACT_ELEMENT in some ways.
Definition ISDOpcodes.h:254
@ SIGN_EXTEND
Conversion operators.
Definition ISDOpcodes.h:843
@ BR_CC
BR_CC - Conditional branch.
@ BR_JT
BR_JT - Jumptable branch.
@ SELECT
Select(COND, TRUEVAL, FALSEVAL).
Definition ISDOpcodes.h:795
@ EXTRACT_ELEMENT
EXTRACT_ELEMENT - This is used to get the lower or upper (determined by a Constant,...
Definition ISDOpcodes.h:247
@ VACOPY
VACOPY - VACOPY has 5 operands: an input chain, a destination pointer, a source pointer,...
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:81
@ MULHU
MULHU/MULHS - Multiply high - Multiply two integers of type iN, producing an unsigned/signed value of...
Definition ISDOpcodes.h:703
@ SHL
Shift and rotation operations.
Definition ISDOpcodes.h:764
@ ZERO_EXTEND
ZERO_EXTEND - Used for integer types, zeroing the new bits.
Definition ISDOpcodes.h:849
@ SELECT_CC
Select with condition operator - This selects between a true value and a false value (ops #2 and #3) ...
Definition ISDOpcodes.h:810
@ ATOMIC_CMP_SWAP
Val, OUTCHAIN = ATOMIC_CMP_SWAP(INCHAIN, ptr, cmp, swap) For double-word atomic operations: ValLo,...
@ DYNAMIC_STACKALLOC
DYNAMIC_STACKALLOC - Allocate some number of bytes on the stack aligned to a specified boundary.
@ SIGN_EXTEND_INREG
SIGN_EXTEND_INREG - This operator atomically performs a SHL/SRA pair to sign extend a small value in ...
Definition ISDOpcodes.h:887
@ AND
Bitwise operators - logical and, logical or, logical xor.
Definition ISDOpcodes.h:738
@ ADDE
Carry-using nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:304
@ TokenFactor
TokenFactor - This node takes multiple tokens as input and produces a single token result.
Definition ISDOpcodes.h:53
@ ATOMIC_SWAP
Val, OUTCHAIN = ATOMIC_SWAP(INCHAIN, ptr, amt) Val, OUTCHAIN = ATOMIC_LOAD_[OpName](INCHAIN,...
@ INLINEASM
INLINEASM - Represents an inline asm block.
@ TRUNCATE
TRUNCATE - Completely drop the high bits.
Definition ISDOpcodes.h:855
@ VAARG
VAARG - VAARG has four operands: an input chain, a pointer, a SRCVALUE, and the alignment.
@ BRCOND
BRCOND - Conditional branch.
@ SHL_PARTS
SHL_PARTS/SRA_PARTS/SRL_PARTS - These operators are used for expanded integer shift operations.
Definition ISDOpcodes.h:832
@ AssertSext
AssertSext, AssertZext - These nodes record if a register contains a value that has already been zero...
Definition ISDOpcodes.h:62
MemIndexedMode
MemIndexedMode enum - This enum defines the load / store indexed addressing modes.
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
@ Undef
Value of the register doesn't matter.
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
@ Offset
Definition DWP.cpp:532
FunctionAddr VTableAddr Value
Definition InstrProf.h:137
static void analyzeReturnValues(const SmallVectorImpl< ArgT > &Args, CCState &CCInfo, bool Tiny)
Analyze incoming and outgoing value of returning from a function.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
static const MCPhysReg RegList16Tiny[]
constexpr bool has_single_bit(T Value) noexcept
Definition bit.h:147
static const MCPhysReg RegList8Tiny[]
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
static void analyzeArguments(TargetLowering::CallLoweringInfo *CLI, const Function *F, const DataLayout *TD, const SmallVectorImpl< ArgT > &Args, SmallVectorImpl< CCValAssign > &ArgLocs, CCState &CCInfo, bool Tiny)
Analyze incoming and outgoing function arguments.
constexpr bool isUInt(uint64_t x)
Checks if an unsigned integer fits into the given bit width.
Definition MathExtras.h:189
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
static const MCPhysReg RegList16AVR[]
@ Sub
Subtraction of integers.
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
Definition MCRegister.h:21
static unsigned getTotalArgumentsSizeInBytes(const SmallVectorImpl< ArgT > &Args)
Count the total number of bytes needed to pass or return these arguments.
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Definition Alignment.h:144
DWARFExpression::Operation Op
static AVRCC::CondCodes intCCToAVRCC(ISD::CondCode CC)
IntCCToAVRCC - Convert a DAG integer condition code to an AVR CC.
ArrayRef(const T &OneElt) -> ArrayRef< T >
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
static bool isCopyMulResult(MachineBasicBlock::iterator const &I)
static void insertMultibyteShift(MachineInstr &MI, MachineBasicBlock *BB, MutableArrayRef< std::pair< Register, int > > Regs, ISD::NodeType Opc, int64_t ShiftAmt)
static const MCPhysReg RegList8AVR[]
Registers for calling conventions, ordered in reverse as required by ABI.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:872
#define N
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
Extended Value Type.
Definition ValueTypes.h:35
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
Definition ValueTypes.h:373
bool isVector() const
Return true if this is a vector value type.
Definition ValueTypes.h:168
LLVM_ABI Type * getTypeForEVT(LLVMContext &Context) const
This method returns an LLVM type corresponding to the specified EVT.
static LLVM_ABI MachinePointerInfo getStack(MachineFunction &MF, int64_t Offset, uint8_t ID=0)
Stack pointer relative access.
static LLVM_ABI MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.
This represents an addressing mode of: BaseGV + BaseOffs + BaseReg + Scale*ScaleReg + ScalableOffset*...
This contains information for each constraint that we are lowering.
This structure contains all information that is necessary for lowering calls.