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"
17 #include "llvm/ADT/STLExtras.h"
18 #include "llvm/ADT/StringSwitch.h"
19 #include "llvm/CodeGen/CallingConvLower.h"
20 #include "llvm/CodeGen/MachineFrameInfo.h"
21 #include "llvm/CodeGen/MachineInstrBuilder.h"
22 #include "llvm/CodeGen/MachineRegisterInfo.h"
23 #include "llvm/CodeGen/SelectionDAG.h"
24 #include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
25 #include "llvm/IR/Function.h"
26 #include "llvm/Support/ErrorHandling.h"
27
28 #include "AVR.h"
29 #include "AVRMachineFunctionInfo.h"
30 #include "AVRSubtarget.h"
31 #include "AVRTargetMachine.h"
32 #include "MCTargetDesc/AVRMCTargetDesc.h"
33
34 namespace llvm {
35
AVRTargetLowering(const AVRTargetMachine & TM,const AVRSubtarget & STI)36 AVRTargetLowering::AVRTargetLowering(const AVRTargetMachine &TM,
37 const AVRSubtarget &STI)
38 : TargetLowering(TM), Subtarget(STI) {
39 // Set up the register classes.
40 addRegisterClass(MVT::i8, &AVR::GPR8RegClass);
41 addRegisterClass(MVT::i16, &AVR::DREGSRegClass);
42
43 // Compute derived properties from the register classes.
44 computeRegisterProperties(Subtarget.getRegisterInfo());
45
46 setBooleanContents(ZeroOrOneBooleanContent);
47 setBooleanVectorContents(ZeroOrOneBooleanContent);
48 setSchedulingPreference(Sched::RegPressure);
49 setStackPointerRegisterToSaveRestore(AVR::SP);
50 setSupportsUnalignedAtomics(true);
51
52 setOperationAction(ISD::GlobalAddress, MVT::i16, Custom);
53 setOperationAction(ISD::BlockAddress, MVT::i16, Custom);
54
55 setOperationAction(ISD::STACKSAVE, MVT::Other, Expand);
56 setOperationAction(ISD::STACKRESTORE, MVT::Other, Expand);
57 setOperationAction(ISD::DYNAMIC_STACKALLOC, MVT::i8, Expand);
58 setOperationAction(ISD::DYNAMIC_STACKALLOC, MVT::i16, Expand);
59
60 for (MVT VT : MVT::integer_valuetypes()) {
61 for (auto N : {ISD::EXTLOAD, ISD::SEXTLOAD, ISD::ZEXTLOAD}) {
62 setLoadExtAction(N, VT, MVT::i1, Promote);
63 setLoadExtAction(N, VT, MVT::i8, Expand);
64 }
65 }
66
67 setTruncStoreAction(MVT::i16, MVT::i8, Expand);
68
69 for (MVT VT : MVT::integer_valuetypes()) {
70 setOperationAction(ISD::ADDC, VT, Legal);
71 setOperationAction(ISD::SUBC, VT, Legal);
72 setOperationAction(ISD::ADDE, VT, Legal);
73 setOperationAction(ISD::SUBE, VT, Legal);
74 }
75
76 // sub (x, imm) gets canonicalized to add (x, -imm), so for illegal types
77 // revert into a sub since we don't have an add with immediate instruction.
78 setOperationAction(ISD::ADD, MVT::i32, Custom);
79 setOperationAction(ISD::ADD, MVT::i64, Custom);
80
81 // our shift instructions are only able to shift 1 bit at a time, so handle
82 // this in a custom way.
83 setOperationAction(ISD::SRA, MVT::i8, Custom);
84 setOperationAction(ISD::SHL, MVT::i8, Custom);
85 setOperationAction(ISD::SRL, MVT::i8, Custom);
86 setOperationAction(ISD::SRA, MVT::i16, Custom);
87 setOperationAction(ISD::SHL, MVT::i16, Custom);
88 setOperationAction(ISD::SRL, MVT::i16, Custom);
89 setOperationAction(ISD::SHL_PARTS, MVT::i16, Expand);
90 setOperationAction(ISD::SRA_PARTS, MVT::i16, Expand);
91 setOperationAction(ISD::SRL_PARTS, MVT::i16, Expand);
92
93 setOperationAction(ISD::ROTL, MVT::i8, Custom);
94 setOperationAction(ISD::ROTL, MVT::i16, Expand);
95 setOperationAction(ISD::ROTR, MVT::i8, Custom);
96 setOperationAction(ISD::ROTR, MVT::i16, Expand);
97
98 setOperationAction(ISD::BR_CC, MVT::i8, Custom);
99 setOperationAction(ISD::BR_CC, MVT::i16, Custom);
100 setOperationAction(ISD::BR_CC, MVT::i32, Custom);
101 setOperationAction(ISD::BR_CC, MVT::i64, Custom);
102 setOperationAction(ISD::BRCOND, MVT::Other, Expand);
103
104 setOperationAction(ISD::SELECT_CC, MVT::i8, Custom);
105 setOperationAction(ISD::SELECT_CC, MVT::i16, Custom);
106 setOperationAction(ISD::SELECT_CC, MVT::i32, Expand);
107 setOperationAction(ISD::SELECT_CC, MVT::i64, Expand);
108 setOperationAction(ISD::SETCC, MVT::i8, Custom);
109 setOperationAction(ISD::SETCC, MVT::i16, Custom);
110 setOperationAction(ISD::SETCC, MVT::i32, Custom);
111 setOperationAction(ISD::SETCC, MVT::i64, Custom);
112 setOperationAction(ISD::SELECT, MVT::i8, Expand);
113 setOperationAction(ISD::SELECT, MVT::i16, Expand);
114
115 setOperationAction(ISD::BSWAP, MVT::i16, Expand);
116
117 // Add support for postincrement and predecrement load/stores.
118 setIndexedLoadAction(ISD::POST_INC, MVT::i8, Legal);
119 setIndexedLoadAction(ISD::POST_INC, MVT::i16, Legal);
120 setIndexedLoadAction(ISD::PRE_DEC, MVT::i8, Legal);
121 setIndexedLoadAction(ISD::PRE_DEC, MVT::i16, Legal);
122 setIndexedStoreAction(ISD::POST_INC, MVT::i8, Legal);
123 setIndexedStoreAction(ISD::POST_INC, MVT::i16, Legal);
124 setIndexedStoreAction(ISD::PRE_DEC, MVT::i8, Legal);
125 setIndexedStoreAction(ISD::PRE_DEC, MVT::i16, Legal);
126
127 setOperationAction(ISD::BR_JT, MVT::Other, Expand);
128
129 setOperationAction(ISD::VASTART, MVT::Other, Custom);
130 setOperationAction(ISD::VAEND, MVT::Other, Expand);
131 setOperationAction(ISD::VAARG, MVT::Other, Expand);
132 setOperationAction(ISD::VACOPY, MVT::Other, Expand);
133
134 // Atomic operations which must be lowered to rtlib calls
135 for (MVT VT : MVT::integer_valuetypes()) {
136 setOperationAction(ISD::ATOMIC_SWAP, VT, Expand);
137 setOperationAction(ISD::ATOMIC_CMP_SWAP, VT, Expand);
138 setOperationAction(ISD::ATOMIC_LOAD_NAND, VT, Expand);
139 setOperationAction(ISD::ATOMIC_LOAD_MAX, VT, Expand);
140 setOperationAction(ISD::ATOMIC_LOAD_MIN, VT, Expand);
141 setOperationAction(ISD::ATOMIC_LOAD_UMAX, VT, Expand);
142 setOperationAction(ISD::ATOMIC_LOAD_UMIN, VT, Expand);
143 }
144
145 // Division/remainder
146 setOperationAction(ISD::UDIV, MVT::i8, Expand);
147 setOperationAction(ISD::UDIV, MVT::i16, Expand);
148 setOperationAction(ISD::UREM, MVT::i8, Expand);
149 setOperationAction(ISD::UREM, MVT::i16, Expand);
150 setOperationAction(ISD::SDIV, MVT::i8, Expand);
151 setOperationAction(ISD::SDIV, MVT::i16, Expand);
152 setOperationAction(ISD::SREM, MVT::i8, Expand);
153 setOperationAction(ISD::SREM, MVT::i16, Expand);
154
155 // Make division and modulus custom
156 setOperationAction(ISD::UDIVREM, MVT::i8, Custom);
157 setOperationAction(ISD::UDIVREM, MVT::i16, Custom);
158 setOperationAction(ISD::UDIVREM, MVT::i32, Custom);
159 setOperationAction(ISD::SDIVREM, MVT::i8, Custom);
160 setOperationAction(ISD::SDIVREM, MVT::i16, Custom);
161 setOperationAction(ISD::SDIVREM, MVT::i32, Custom);
162
163 // Do not use MUL. The AVR instructions are closer to SMUL_LOHI &co.
164 setOperationAction(ISD::MUL, MVT::i8, Expand);
165 setOperationAction(ISD::MUL, MVT::i16, Expand);
166
167 // Expand 16 bit multiplications.
168 setOperationAction(ISD::SMUL_LOHI, MVT::i16, Expand);
169 setOperationAction(ISD::UMUL_LOHI, MVT::i16, Expand);
170
171 // Expand multiplications to libcalls when there is
172 // no hardware MUL.
173 if (!Subtarget.supportsMultiplication()) {
174 setOperationAction(ISD::SMUL_LOHI, MVT::i8, Expand);
175 setOperationAction(ISD::UMUL_LOHI, MVT::i8, Expand);
176 }
177
178 for (MVT VT : MVT::integer_valuetypes()) {
179 setOperationAction(ISD::MULHS, VT, Expand);
180 setOperationAction(ISD::MULHU, VT, Expand);
181 }
182
183 for (MVT VT : MVT::integer_valuetypes()) {
184 setOperationAction(ISD::CTPOP, VT, Expand);
185 setOperationAction(ISD::CTLZ, VT, Expand);
186 setOperationAction(ISD::CTTZ, VT, Expand);
187 }
188
189 for (MVT VT : MVT::integer_valuetypes()) {
190 setOperationAction(ISD::SIGN_EXTEND_INREG, VT, Expand);
191 // TODO: The generated code is pretty poor. Investigate using the
192 // same "shift and subtract with carry" trick that we do for
193 // extending 8-bit to 16-bit. This may require infrastructure
194 // improvements in how we treat 16-bit "registers" to be feasible.
195 }
196
197 // Division rtlib functions (not supported), use divmod functions instead
198 setLibcallName(RTLIB::SDIV_I8, nullptr);
199 setLibcallName(RTLIB::SDIV_I16, nullptr);
200 setLibcallName(RTLIB::SDIV_I32, nullptr);
201 setLibcallName(RTLIB::UDIV_I8, nullptr);
202 setLibcallName(RTLIB::UDIV_I16, nullptr);
203 setLibcallName(RTLIB::UDIV_I32, nullptr);
204
205 // Modulus rtlib functions (not supported), use divmod functions instead
206 setLibcallName(RTLIB::SREM_I8, nullptr);
207 setLibcallName(RTLIB::SREM_I16, nullptr);
208 setLibcallName(RTLIB::SREM_I32, nullptr);
209 setLibcallName(RTLIB::UREM_I8, nullptr);
210 setLibcallName(RTLIB::UREM_I16, nullptr);
211 setLibcallName(RTLIB::UREM_I32, nullptr);
212
213 // Division and modulus rtlib functions
214 setLibcallName(RTLIB::SDIVREM_I8, "__divmodqi4");
215 setLibcallName(RTLIB::SDIVREM_I16, "__divmodhi4");
216 setLibcallName(RTLIB::SDIVREM_I32, "__divmodsi4");
217 setLibcallName(RTLIB::UDIVREM_I8, "__udivmodqi4");
218 setLibcallName(RTLIB::UDIVREM_I16, "__udivmodhi4");
219 setLibcallName(RTLIB::UDIVREM_I32, "__udivmodsi4");
220
221 // Several of the runtime library functions use a special calling conv
222 setLibcallCallingConv(RTLIB::SDIVREM_I8, CallingConv::AVR_BUILTIN);
223 setLibcallCallingConv(RTLIB::SDIVREM_I16, CallingConv::AVR_BUILTIN);
224 setLibcallCallingConv(RTLIB::UDIVREM_I8, CallingConv::AVR_BUILTIN);
225 setLibcallCallingConv(RTLIB::UDIVREM_I16, CallingConv::AVR_BUILTIN);
226
227 // Trigonometric rtlib functions
228 setLibcallName(RTLIB::SIN_F32, "sin");
229 setLibcallName(RTLIB::COS_F32, "cos");
230
231 setMinFunctionAlignment(Align(2));
232 setMinimumJumpTableEntries(UINT_MAX);
233 }
234
getTargetNodeName(unsigned Opcode) const235 const char *AVRTargetLowering::getTargetNodeName(unsigned Opcode) const {
236 #define NODE(name) \
237 case AVRISD::name: \
238 return #name
239
240 switch (Opcode) {
241 default:
242 return nullptr;
243 NODE(RET_FLAG);
244 NODE(RETI_FLAG);
245 NODE(CALL);
246 NODE(WRAPPER);
247 NODE(LSL);
248 NODE(LSR);
249 NODE(ROL);
250 NODE(ROR);
251 NODE(ASR);
252 NODE(LSLLOOP);
253 NODE(LSRLOOP);
254 NODE(ROLLOOP);
255 NODE(RORLOOP);
256 NODE(ASRLOOP);
257 NODE(BRCOND);
258 NODE(CMP);
259 NODE(CMPC);
260 NODE(TST);
261 NODE(SELECT_CC);
262 #undef NODE
263 }
264 }
265
getSetCCResultType(const DataLayout & DL,LLVMContext &,EVT VT) const266 EVT AVRTargetLowering::getSetCCResultType(const DataLayout &DL, LLVMContext &,
267 EVT VT) const {
268 assert(!VT.isVector() && "No AVR SetCC type for vectors!");
269 return MVT::i8;
270 }
271
LowerShifts(SDValue Op,SelectionDAG & DAG) const272 SDValue AVRTargetLowering::LowerShifts(SDValue Op, SelectionDAG &DAG) const {
273 unsigned Opc8;
274 const SDNode *N = Op.getNode();
275 EVT VT = Op.getValueType();
276 SDLoc dl(N);
277 assert(isPowerOf2_32(VT.getSizeInBits()) &&
278 "Expected power-of-2 shift amount");
279
280 // Expand non-constant shifts to loops.
281 if (!isa<ConstantSDNode>(N->getOperand(1))) {
282 switch (Op.getOpcode()) {
283 default:
284 llvm_unreachable("Invalid shift opcode!");
285 case ISD::SHL:
286 return DAG.getNode(AVRISD::LSLLOOP, dl, VT, N->getOperand(0),
287 N->getOperand(1));
288 case ISD::SRL:
289 return DAG.getNode(AVRISD::LSRLOOP, dl, VT, N->getOperand(0),
290 N->getOperand(1));
291 case ISD::ROTL: {
292 SDValue Amt = N->getOperand(1);
293 EVT AmtVT = Amt.getValueType();
294 Amt = DAG.getNode(ISD::AND, dl, AmtVT, Amt,
295 DAG.getConstant(VT.getSizeInBits() - 1, dl, AmtVT));
296 return DAG.getNode(AVRISD::ROLLOOP, dl, VT, N->getOperand(0), Amt);
297 }
298 case ISD::ROTR: {
299 SDValue Amt = N->getOperand(1);
300 EVT AmtVT = Amt.getValueType();
301 Amt = DAG.getNode(ISD::AND, dl, AmtVT, Amt,
302 DAG.getConstant(VT.getSizeInBits() - 1, dl, AmtVT));
303 return DAG.getNode(AVRISD::RORLOOP, dl, VT, N->getOperand(0), Amt);
304 }
305 case ISD::SRA:
306 return DAG.getNode(AVRISD::ASRLOOP, dl, VT, N->getOperand(0),
307 N->getOperand(1));
308 }
309 }
310
311 uint64_t ShiftAmount = cast<ConstantSDNode>(N->getOperand(1))->getZExtValue();
312 SDValue Victim = N->getOperand(0);
313
314 switch (Op.getOpcode()) {
315 case ISD::SRA:
316 Opc8 = AVRISD::ASR;
317 break;
318 case ISD::ROTL:
319 Opc8 = AVRISD::ROL;
320 ShiftAmount = ShiftAmount % VT.getSizeInBits();
321 break;
322 case ISD::ROTR:
323 Opc8 = AVRISD::ROR;
324 ShiftAmount = ShiftAmount % VT.getSizeInBits();
325 break;
326 case ISD::SRL:
327 Opc8 = AVRISD::LSR;
328 break;
329 case ISD::SHL:
330 Opc8 = AVRISD::LSL;
331 break;
332 default:
333 llvm_unreachable("Invalid shift opcode");
334 }
335
336 // Optimize int8/int16 shifts.
337 if (VT.getSizeInBits() == 8) {
338 if (Op.getOpcode() == ISD::SHL && 4 <= ShiftAmount && ShiftAmount < 7) {
339 // Optimize LSL when 4 <= ShiftAmount <= 6.
340 Victim = DAG.getNode(AVRISD::SWAP, dl, VT, Victim);
341 Victim =
342 DAG.getNode(ISD::AND, dl, VT, Victim, DAG.getConstant(0xf0, dl, VT));
343 ShiftAmount -= 4;
344 } else if (Op.getOpcode() == ISD::SRL && 4 <= ShiftAmount &&
345 ShiftAmount < 7) {
346 // Optimize LSR when 4 <= ShiftAmount <= 6.
347 Victim = DAG.getNode(AVRISD::SWAP, dl, VT, Victim);
348 Victim =
349 DAG.getNode(ISD::AND, dl, VT, Victim, DAG.getConstant(0x0f, dl, VT));
350 ShiftAmount -= 4;
351 } else if (Op.getOpcode() == ISD::SHL && ShiftAmount == 7) {
352 // Optimize LSL when ShiftAmount == 7.
353 Victim = DAG.getNode(AVRISD::LSLBN, dl, VT, Victim,
354 DAG.getConstant(7, dl, VT));
355 ShiftAmount = 0;
356 } else if (Op.getOpcode() == ISD::SRL && ShiftAmount == 7) {
357 // Optimize LSR when ShiftAmount == 7.
358 Victim = DAG.getNode(AVRISD::LSRBN, dl, VT, Victim,
359 DAG.getConstant(7, dl, VT));
360 ShiftAmount = 0;
361 } else if (Op.getOpcode() == ISD::SRA && ShiftAmount == 6) {
362 // Optimize ASR when ShiftAmount == 6.
363 Victim = DAG.getNode(AVRISD::ASRBN, dl, VT, Victim,
364 DAG.getConstant(6, dl, VT));
365 ShiftAmount = 0;
366 } else if (Op.getOpcode() == ISD::SRA && ShiftAmount == 7) {
367 // Optimize ASR when ShiftAmount == 7.
368 Victim = DAG.getNode(AVRISD::ASRBN, dl, VT, Victim,
369 DAG.getConstant(7, dl, VT));
370 ShiftAmount = 0;
371 }
372 } else if (VT.getSizeInBits() == 16) {
373 if (Op.getOpcode() == ISD::SRA)
374 // Special optimization for int16 arithmetic right shift.
375 switch (ShiftAmount) {
376 case 15:
377 Victim = DAG.getNode(AVRISD::ASRWN, dl, VT, Victim,
378 DAG.getConstant(15, dl, VT));
379 ShiftAmount = 0;
380 break;
381 case 14:
382 Victim = DAG.getNode(AVRISD::ASRWN, dl, VT, Victim,
383 DAG.getConstant(14, dl, VT));
384 ShiftAmount = 0;
385 break;
386 case 7:
387 Victim = DAG.getNode(AVRISD::ASRWN, dl, VT, Victim,
388 DAG.getConstant(7, dl, VT));
389 ShiftAmount = 0;
390 break;
391 default:
392 break;
393 }
394 if (4 <= ShiftAmount && ShiftAmount < 8)
395 switch (Op.getOpcode()) {
396 case ISD::SHL:
397 Victim = DAG.getNode(AVRISD::LSLWN, dl, VT, Victim,
398 DAG.getConstant(4, dl, VT));
399 ShiftAmount -= 4;
400 break;
401 case ISD::SRL:
402 Victim = DAG.getNode(AVRISD::LSRWN, dl, VT, Victim,
403 DAG.getConstant(4, dl, VT));
404 ShiftAmount -= 4;
405 break;
406 default:
407 break;
408 }
409 else if (8 <= ShiftAmount && ShiftAmount < 12)
410 switch (Op.getOpcode()) {
411 case ISD::SHL:
412 Victim = DAG.getNode(AVRISD::LSLWN, dl, VT, Victim,
413 DAG.getConstant(8, dl, VT));
414 ShiftAmount -= 8;
415 // Only operate on the higher byte for remaining shift bits.
416 Opc8 = AVRISD::LSLHI;
417 break;
418 case ISD::SRL:
419 Victim = DAG.getNode(AVRISD::LSRWN, dl, VT, Victim,
420 DAG.getConstant(8, dl, VT));
421 ShiftAmount -= 8;
422 // Only operate on the lower byte for remaining shift bits.
423 Opc8 = AVRISD::LSRLO;
424 break;
425 case ISD::SRA:
426 Victim = DAG.getNode(AVRISD::ASRWN, dl, VT, Victim,
427 DAG.getConstant(8, dl, VT));
428 ShiftAmount -= 8;
429 // Only operate on the lower byte for remaining shift bits.
430 Opc8 = AVRISD::ASRLO;
431 break;
432 default:
433 break;
434 }
435 else if (12 <= ShiftAmount)
436 switch (Op.getOpcode()) {
437 case ISD::SHL:
438 Victim = DAG.getNode(AVRISD::LSLWN, dl, VT, Victim,
439 DAG.getConstant(12, dl, VT));
440 ShiftAmount -= 12;
441 // Only operate on the higher byte for remaining shift bits.
442 Opc8 = AVRISD::LSLHI;
443 break;
444 case ISD::SRL:
445 Victim = DAG.getNode(AVRISD::LSRWN, dl, VT, Victim,
446 DAG.getConstant(12, dl, VT));
447 ShiftAmount -= 12;
448 // Only operate on the lower byte for remaining shift bits.
449 Opc8 = AVRISD::LSRLO;
450 break;
451 case ISD::SRA:
452 Victim = DAG.getNode(AVRISD::ASRWN, dl, VT, Victim,
453 DAG.getConstant(8, dl, VT));
454 ShiftAmount -= 8;
455 // Only operate on the lower byte for remaining shift bits.
456 Opc8 = AVRISD::ASRLO;
457 break;
458 default:
459 break;
460 }
461 }
462
463 while (ShiftAmount--) {
464 Victim = DAG.getNode(Opc8, dl, VT, Victim);
465 }
466
467 return Victim;
468 }
469
LowerDivRem(SDValue Op,SelectionDAG & DAG) const470 SDValue AVRTargetLowering::LowerDivRem(SDValue Op, SelectionDAG &DAG) const {
471 unsigned Opcode = Op->getOpcode();
472 assert((Opcode == ISD::SDIVREM || Opcode == ISD::UDIVREM) &&
473 "Invalid opcode for Div/Rem lowering");
474 bool IsSigned = (Opcode == ISD::SDIVREM);
475 EVT VT = Op->getValueType(0);
476 Type *Ty = VT.getTypeForEVT(*DAG.getContext());
477
478 RTLIB::Libcall LC;
479 switch (VT.getSimpleVT().SimpleTy) {
480 default:
481 llvm_unreachable("Unexpected request for libcall!");
482 case MVT::i8:
483 LC = IsSigned ? RTLIB::SDIVREM_I8 : RTLIB::UDIVREM_I8;
484 break;
485 case MVT::i16:
486 LC = IsSigned ? RTLIB::SDIVREM_I16 : RTLIB::UDIVREM_I16;
487 break;
488 case MVT::i32:
489 LC = IsSigned ? RTLIB::SDIVREM_I32 : RTLIB::UDIVREM_I32;
490 break;
491 }
492
493 SDValue InChain = DAG.getEntryNode();
494
495 TargetLowering::ArgListTy Args;
496 TargetLowering::ArgListEntry Entry;
497 for (SDValue const &Value : Op->op_values()) {
498 Entry.Node = Value;
499 Entry.Ty = Value.getValueType().getTypeForEVT(*DAG.getContext());
500 Entry.IsSExt = IsSigned;
501 Entry.IsZExt = !IsSigned;
502 Args.push_back(Entry);
503 }
504
505 SDValue Callee = DAG.getExternalSymbol(getLibcallName(LC),
506 getPointerTy(DAG.getDataLayout()));
507
508 Type *RetTy = (Type *)StructType::get(Ty, Ty);
509
510 SDLoc dl(Op);
511 TargetLowering::CallLoweringInfo CLI(DAG);
512 CLI.setDebugLoc(dl)
513 .setChain(InChain)
514 .setLibCallee(getLibcallCallingConv(LC), RetTy, Callee, std::move(Args))
515 .setInRegister()
516 .setSExtResult(IsSigned)
517 .setZExtResult(!IsSigned);
518
519 std::pair<SDValue, SDValue> CallInfo = LowerCallTo(CLI);
520 return CallInfo.first;
521 }
522
LowerGlobalAddress(SDValue Op,SelectionDAG & DAG) const523 SDValue AVRTargetLowering::LowerGlobalAddress(SDValue Op,
524 SelectionDAG &DAG) const {
525 auto DL = DAG.getDataLayout();
526
527 const GlobalValue *GV = cast<GlobalAddressSDNode>(Op)->getGlobal();
528 int64_t Offset = cast<GlobalAddressSDNode>(Op)->getOffset();
529
530 // Create the TargetGlobalAddress node, folding in the constant offset.
531 SDValue Result =
532 DAG.getTargetGlobalAddress(GV, SDLoc(Op), getPointerTy(DL), Offset);
533 return DAG.getNode(AVRISD::WRAPPER, SDLoc(Op), getPointerTy(DL), Result);
534 }
535
LowerBlockAddress(SDValue Op,SelectionDAG & DAG) const536 SDValue AVRTargetLowering::LowerBlockAddress(SDValue Op,
537 SelectionDAG &DAG) const {
538 auto DL = DAG.getDataLayout();
539 const BlockAddress *BA = cast<BlockAddressSDNode>(Op)->getBlockAddress();
540
541 SDValue Result = DAG.getTargetBlockAddress(BA, getPointerTy(DL));
542
543 return DAG.getNode(AVRISD::WRAPPER, SDLoc(Op), getPointerTy(DL), Result);
544 }
545
546 /// IntCCToAVRCC - Convert a DAG integer condition code to an AVR CC.
intCCToAVRCC(ISD::CondCode CC)547 static AVRCC::CondCodes intCCToAVRCC(ISD::CondCode CC) {
548 switch (CC) {
549 default:
550 llvm_unreachable("Unknown condition code!");
551 case ISD::SETEQ:
552 return AVRCC::COND_EQ;
553 case ISD::SETNE:
554 return AVRCC::COND_NE;
555 case ISD::SETGE:
556 return AVRCC::COND_GE;
557 case ISD::SETLT:
558 return AVRCC::COND_LT;
559 case ISD::SETUGE:
560 return AVRCC::COND_SH;
561 case ISD::SETULT:
562 return AVRCC::COND_LO;
563 }
564 }
565
566 /// Returns appropriate CP/CPI/CPC nodes code for the given 8/16-bit operands.
getAVRCmp(SDValue LHS,SDValue RHS,SelectionDAG & DAG,SDLoc DL) const567 SDValue AVRTargetLowering::getAVRCmp(SDValue LHS, SDValue RHS,
568 SelectionDAG &DAG, SDLoc DL) const {
569 assert((LHS.getSimpleValueType() == RHS.getSimpleValueType()) &&
570 "LHS and RHS have different types");
571 assert(((LHS.getSimpleValueType() == MVT::i16) ||
572 (LHS.getSimpleValueType() == MVT::i8)) &&
573 "invalid comparison type");
574
575 SDValue Cmp;
576
577 if (LHS.getSimpleValueType() == MVT::i16 && isa<ConstantSDNode>(RHS)) {
578 // Generate a CPI/CPC pair if RHS is a 16-bit constant.
579 SDValue LHSlo = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i8, LHS,
580 DAG.getIntPtrConstant(0, DL));
581 SDValue LHShi = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i8, LHS,
582 DAG.getIntPtrConstant(1, DL));
583 SDValue RHSlo = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i8, RHS,
584 DAG.getIntPtrConstant(0, DL));
585 SDValue RHShi = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i8, RHS,
586 DAG.getIntPtrConstant(1, DL));
587 Cmp = DAG.getNode(AVRISD::CMP, DL, MVT::Glue, LHSlo, RHSlo);
588 Cmp = DAG.getNode(AVRISD::CMPC, DL, MVT::Glue, LHShi, RHShi, Cmp);
589 } else {
590 // Generate ordinary 16-bit comparison.
591 Cmp = DAG.getNode(AVRISD::CMP, DL, MVT::Glue, LHS, RHS);
592 }
593
594 return Cmp;
595 }
596
597 /// Returns appropriate AVR CMP/CMPC nodes and corresponding condition code for
598 /// the given operands.
getAVRCmp(SDValue LHS,SDValue RHS,ISD::CondCode CC,SDValue & AVRcc,SelectionDAG & DAG,SDLoc DL) const599 SDValue AVRTargetLowering::getAVRCmp(SDValue LHS, SDValue RHS, ISD::CondCode CC,
600 SDValue &AVRcc, SelectionDAG &DAG,
601 SDLoc DL) const {
602 SDValue Cmp;
603 EVT VT = LHS.getValueType();
604 bool UseTest = false;
605
606 switch (CC) {
607 default:
608 break;
609 case ISD::SETLE: {
610 // Swap operands and reverse the branching condition.
611 std::swap(LHS, RHS);
612 CC = ISD::SETGE;
613 break;
614 }
615 case ISD::SETGT: {
616 if (const ConstantSDNode *C = dyn_cast<ConstantSDNode>(RHS)) {
617 switch (C->getSExtValue()) {
618 case -1: {
619 // When doing lhs > -1 use a tst instruction on the top part of lhs
620 // and use brpl instead of using a chain of cp/cpc.
621 UseTest = true;
622 AVRcc = DAG.getConstant(AVRCC::COND_PL, DL, MVT::i8);
623 break;
624 }
625 case 0: {
626 // Turn lhs > 0 into 0 < lhs since 0 can be materialized with
627 // __zero_reg__ in lhs.
628 RHS = LHS;
629 LHS = DAG.getConstant(0, DL, VT);
630 CC = ISD::SETLT;
631 break;
632 }
633 default: {
634 // Turn lhs < rhs with lhs constant into rhs >= lhs+1, this allows
635 // us to fold the constant into the cmp instruction.
636 RHS = DAG.getConstant(C->getSExtValue() + 1, DL, VT);
637 CC = ISD::SETGE;
638 break;
639 }
640 }
641 break;
642 }
643 // Swap operands and reverse the branching condition.
644 std::swap(LHS, RHS);
645 CC = ISD::SETLT;
646 break;
647 }
648 case ISD::SETLT: {
649 if (const ConstantSDNode *C = dyn_cast<ConstantSDNode>(RHS)) {
650 switch (C->getSExtValue()) {
651 case 1: {
652 // Turn lhs < 1 into 0 >= lhs since 0 can be materialized with
653 // __zero_reg__ in lhs.
654 RHS = LHS;
655 LHS = DAG.getConstant(0, DL, VT);
656 CC = ISD::SETGE;
657 break;
658 }
659 case 0: {
660 // When doing lhs < 0 use a tst instruction on the top part of lhs
661 // and use brmi instead of using a chain of cp/cpc.
662 UseTest = true;
663 AVRcc = DAG.getConstant(AVRCC::COND_MI, DL, MVT::i8);
664 break;
665 }
666 }
667 }
668 break;
669 }
670 case ISD::SETULE: {
671 // Swap operands and reverse the branching condition.
672 std::swap(LHS, RHS);
673 CC = ISD::SETUGE;
674 break;
675 }
676 case ISD::SETUGT: {
677 // Turn lhs < rhs with lhs constant into rhs >= lhs+1, this allows us to
678 // fold the constant into the cmp instruction.
679 if (const ConstantSDNode *C = dyn_cast<ConstantSDNode>(RHS)) {
680 RHS = DAG.getConstant(C->getSExtValue() + 1, DL, VT);
681 CC = ISD::SETUGE;
682 break;
683 }
684 // Swap operands and reverse the branching condition.
685 std::swap(LHS, RHS);
686 CC = ISD::SETULT;
687 break;
688 }
689 }
690
691 // Expand 32 and 64 bit comparisons with custom CMP and CMPC nodes instead of
692 // using the default and/or/xor expansion code which is much longer.
693 if (VT == MVT::i32) {
694 SDValue LHSlo = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i16, LHS,
695 DAG.getIntPtrConstant(0, DL));
696 SDValue LHShi = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i16, LHS,
697 DAG.getIntPtrConstant(1, DL));
698 SDValue RHSlo = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i16, RHS,
699 DAG.getIntPtrConstant(0, DL));
700 SDValue RHShi = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i16, RHS,
701 DAG.getIntPtrConstant(1, DL));
702
703 if (UseTest) {
704 // When using tst we only care about the highest part.
705 SDValue Top = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i8, LHShi,
706 DAG.getIntPtrConstant(1, DL));
707 Cmp = DAG.getNode(AVRISD::TST, DL, MVT::Glue, Top);
708 } else {
709 Cmp = getAVRCmp(LHSlo, RHSlo, DAG, DL);
710 Cmp = DAG.getNode(AVRISD::CMPC, DL, MVT::Glue, LHShi, RHShi, Cmp);
711 }
712 } else if (VT == MVT::i64) {
713 SDValue LHS_0 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i32, LHS,
714 DAG.getIntPtrConstant(0, DL));
715 SDValue LHS_1 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i32, LHS,
716 DAG.getIntPtrConstant(1, DL));
717
718 SDValue LHS0 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i16, LHS_0,
719 DAG.getIntPtrConstant(0, DL));
720 SDValue LHS1 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i16, LHS_0,
721 DAG.getIntPtrConstant(1, DL));
722 SDValue LHS2 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i16, LHS_1,
723 DAG.getIntPtrConstant(0, DL));
724 SDValue LHS3 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i16, LHS_1,
725 DAG.getIntPtrConstant(1, DL));
726
727 SDValue RHS_0 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i32, RHS,
728 DAG.getIntPtrConstant(0, DL));
729 SDValue RHS_1 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i32, RHS,
730 DAG.getIntPtrConstant(1, DL));
731
732 SDValue RHS0 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i16, RHS_0,
733 DAG.getIntPtrConstant(0, DL));
734 SDValue RHS1 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i16, RHS_0,
735 DAG.getIntPtrConstant(1, DL));
736 SDValue RHS2 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i16, RHS_1,
737 DAG.getIntPtrConstant(0, DL));
738 SDValue RHS3 = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i16, RHS_1,
739 DAG.getIntPtrConstant(1, DL));
740
741 if (UseTest) {
742 // When using tst we only care about the highest part.
743 SDValue Top = DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i8, LHS3,
744 DAG.getIntPtrConstant(1, DL));
745 Cmp = DAG.getNode(AVRISD::TST, DL, MVT::Glue, Top);
746 } else {
747 Cmp = getAVRCmp(LHS0, RHS0, DAG, DL);
748 Cmp = DAG.getNode(AVRISD::CMPC, DL, MVT::Glue, LHS1, RHS1, Cmp);
749 Cmp = DAG.getNode(AVRISD::CMPC, DL, MVT::Glue, LHS2, RHS2, Cmp);
750 Cmp = DAG.getNode(AVRISD::CMPC, DL, MVT::Glue, LHS3, RHS3, Cmp);
751 }
752 } else if (VT == MVT::i8 || VT == MVT::i16) {
753 if (UseTest) {
754 // When using tst we only care about the highest part.
755 Cmp = DAG.getNode(AVRISD::TST, DL, MVT::Glue,
756 (VT == MVT::i8)
757 ? LHS
758 : DAG.getNode(ISD::EXTRACT_ELEMENT, DL, MVT::i8,
759 LHS, DAG.getIntPtrConstant(1, DL)));
760 } else {
761 Cmp = getAVRCmp(LHS, RHS, DAG, DL);
762 }
763 } else {
764 llvm_unreachable("Invalid comparison size");
765 }
766
767 // When using a test instruction AVRcc is already set.
768 if (!UseTest) {
769 AVRcc = DAG.getConstant(intCCToAVRCC(CC), DL, MVT::i8);
770 }
771
772 return Cmp;
773 }
774
LowerBR_CC(SDValue Op,SelectionDAG & DAG) const775 SDValue AVRTargetLowering::LowerBR_CC(SDValue Op, SelectionDAG &DAG) const {
776 SDValue Chain = Op.getOperand(0);
777 ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(1))->get();
778 SDValue LHS = Op.getOperand(2);
779 SDValue RHS = Op.getOperand(3);
780 SDValue Dest = Op.getOperand(4);
781 SDLoc dl(Op);
782
783 SDValue TargetCC;
784 SDValue Cmp = getAVRCmp(LHS, RHS, CC, TargetCC, DAG, dl);
785
786 return DAG.getNode(AVRISD::BRCOND, dl, MVT::Other, Chain, Dest, TargetCC,
787 Cmp);
788 }
789
LowerSELECT_CC(SDValue Op,SelectionDAG & DAG) const790 SDValue AVRTargetLowering::LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const {
791 SDValue LHS = Op.getOperand(0);
792 SDValue RHS = Op.getOperand(1);
793 SDValue TrueV = Op.getOperand(2);
794 SDValue FalseV = Op.getOperand(3);
795 ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(4))->get();
796 SDLoc dl(Op);
797
798 SDValue TargetCC;
799 SDValue Cmp = getAVRCmp(LHS, RHS, CC, TargetCC, DAG, dl);
800
801 SDVTList VTs = DAG.getVTList(Op.getValueType(), MVT::Glue);
802 SDValue Ops[] = {TrueV, FalseV, TargetCC, Cmp};
803
804 return DAG.getNode(AVRISD::SELECT_CC, dl, VTs, Ops);
805 }
806
LowerSETCC(SDValue Op,SelectionDAG & DAG) const807 SDValue AVRTargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) const {
808 SDValue LHS = Op.getOperand(0);
809 SDValue RHS = Op.getOperand(1);
810 ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(2))->get();
811 SDLoc DL(Op);
812
813 SDValue TargetCC;
814 SDValue Cmp = getAVRCmp(LHS, RHS, CC, TargetCC, DAG, DL);
815
816 SDValue TrueV = DAG.getConstant(1, DL, Op.getValueType());
817 SDValue FalseV = DAG.getConstant(0, DL, Op.getValueType());
818 SDVTList VTs = DAG.getVTList(Op.getValueType(), MVT::Glue);
819 SDValue Ops[] = {TrueV, FalseV, TargetCC, Cmp};
820
821 return DAG.getNode(AVRISD::SELECT_CC, DL, VTs, Ops);
822 }
823
LowerVASTART(SDValue Op,SelectionDAG & DAG) const824 SDValue AVRTargetLowering::LowerVASTART(SDValue Op, SelectionDAG &DAG) const {
825 const MachineFunction &MF = DAG.getMachineFunction();
826 const AVRMachineFunctionInfo *AFI = MF.getInfo<AVRMachineFunctionInfo>();
827 const Value *SV = cast<SrcValueSDNode>(Op.getOperand(2))->getValue();
828 auto DL = DAG.getDataLayout();
829 SDLoc dl(Op);
830
831 // Vastart just stores the address of the VarArgsFrameIndex slot into the
832 // memory location argument.
833 SDValue FI = DAG.getFrameIndex(AFI->getVarArgsFrameIndex(), getPointerTy(DL));
834
835 return DAG.getStore(Op.getOperand(0), dl, FI, Op.getOperand(1),
836 MachinePointerInfo(SV));
837 }
838
LowerOperation(SDValue Op,SelectionDAG & DAG) const839 SDValue AVRTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
840 switch (Op.getOpcode()) {
841 default:
842 llvm_unreachable("Don't know how to custom lower this!");
843 case ISD::SHL:
844 case ISD::SRA:
845 case ISD::SRL:
846 case ISD::ROTL:
847 case ISD::ROTR:
848 return LowerShifts(Op, DAG);
849 case ISD::GlobalAddress:
850 return LowerGlobalAddress(Op, DAG);
851 case ISD::BlockAddress:
852 return LowerBlockAddress(Op, DAG);
853 case ISD::BR_CC:
854 return LowerBR_CC(Op, DAG);
855 case ISD::SELECT_CC:
856 return LowerSELECT_CC(Op, DAG);
857 case ISD::SETCC:
858 return LowerSETCC(Op, DAG);
859 case ISD::VASTART:
860 return LowerVASTART(Op, DAG);
861 case ISD::SDIVREM:
862 case ISD::UDIVREM:
863 return LowerDivRem(Op, DAG);
864 }
865
866 return SDValue();
867 }
868
869 /// Replace a node with an illegal result type
870 /// with a new node built out of custom code.
ReplaceNodeResults(SDNode * N,SmallVectorImpl<SDValue> & Results,SelectionDAG & DAG) const871 void AVRTargetLowering::ReplaceNodeResults(SDNode *N,
872 SmallVectorImpl<SDValue> &Results,
873 SelectionDAG &DAG) const {
874 SDLoc DL(N);
875
876 switch (N->getOpcode()) {
877 case ISD::ADD: {
878 // Convert add (x, imm) into sub (x, -imm).
879 if (const ConstantSDNode *C = dyn_cast<ConstantSDNode>(N->getOperand(1))) {
880 SDValue Sub = DAG.getNode(
881 ISD::SUB, DL, N->getValueType(0), N->getOperand(0),
882 DAG.getConstant(-C->getAPIntValue(), DL, C->getValueType(0)));
883 Results.push_back(Sub);
884 }
885 break;
886 }
887 default: {
888 SDValue Res = LowerOperation(SDValue(N, 0), DAG);
889
890 for (unsigned I = 0, E = Res->getNumValues(); I != E; ++I)
891 Results.push_back(Res.getValue(I));
892
893 break;
894 }
895 }
896 }
897
898 /// Return true if the addressing mode represented
899 /// by AM is legal for this target, for a load/store of the specified type.
isLegalAddressingMode(const DataLayout & DL,const AddrMode & AM,Type * Ty,unsigned AS,Instruction * I) const900 bool AVRTargetLowering::isLegalAddressingMode(const DataLayout &DL,
901 const AddrMode &AM, Type *Ty,
902 unsigned AS,
903 Instruction *I) const {
904 int64_t Offs = AM.BaseOffs;
905
906 // Allow absolute addresses.
907 if (AM.BaseGV && !AM.HasBaseReg && AM.Scale == 0 && Offs == 0) {
908 return true;
909 }
910
911 // Flash memory instructions only allow zero offsets.
912 if (isa<PointerType>(Ty) && AS == AVR::ProgramMemory) {
913 return false;
914 }
915
916 // Allow reg+<6bit> offset.
917 if (Offs < 0)
918 Offs = -Offs;
919 if (AM.BaseGV == nullptr && AM.HasBaseReg && AM.Scale == 0 &&
920 isUInt<6>(Offs)) {
921 return true;
922 }
923
924 return false;
925 }
926
927 /// Returns true by value, base pointer and
928 /// offset pointer and addressing mode by reference if the node's address
929 /// can be legally represented as pre-indexed load / store address.
getPreIndexedAddressParts(SDNode * N,SDValue & Base,SDValue & Offset,ISD::MemIndexedMode & AM,SelectionDAG & DAG) const930 bool AVRTargetLowering::getPreIndexedAddressParts(SDNode *N, SDValue &Base,
931 SDValue &Offset,
932 ISD::MemIndexedMode &AM,
933 SelectionDAG &DAG) const {
934 EVT VT;
935 const SDNode *Op;
936 SDLoc DL(N);
937
938 if (const LoadSDNode *LD = dyn_cast<LoadSDNode>(N)) {
939 VT = LD->getMemoryVT();
940 Op = LD->getBasePtr().getNode();
941 if (LD->getExtensionType() != ISD::NON_EXTLOAD)
942 return false;
943 if (AVR::isProgramMemoryAccess(LD)) {
944 return false;
945 }
946 } else if (const StoreSDNode *ST = dyn_cast<StoreSDNode>(N)) {
947 VT = ST->getMemoryVT();
948 Op = ST->getBasePtr().getNode();
949 if (AVR::isProgramMemoryAccess(ST)) {
950 return false;
951 }
952 } else {
953 return false;
954 }
955
956 if (VT != MVT::i8 && VT != MVT::i16) {
957 return false;
958 }
959
960 if (Op->getOpcode() != ISD::ADD && Op->getOpcode() != ISD::SUB) {
961 return false;
962 }
963
964 if (const ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(Op->getOperand(1))) {
965 int RHSC = RHS->getSExtValue();
966 if (Op->getOpcode() == ISD::SUB)
967 RHSC = -RHSC;
968
969 if ((VT == MVT::i16 && RHSC != -2) || (VT == MVT::i8 && RHSC != -1)) {
970 return false;
971 }
972
973 Base = Op->getOperand(0);
974 Offset = DAG.getConstant(RHSC, DL, MVT::i8);
975 AM = ISD::PRE_DEC;
976
977 return true;
978 }
979
980 return false;
981 }
982
983 /// Returns true by value, base pointer and
984 /// offset pointer and addressing mode by reference if this node can be
985 /// combined with a load / store to form a post-indexed load / store.
getPostIndexedAddressParts(SDNode * N,SDNode * Op,SDValue & Base,SDValue & Offset,ISD::MemIndexedMode & AM,SelectionDAG & DAG) const986 bool AVRTargetLowering::getPostIndexedAddressParts(SDNode *N, SDNode *Op,
987 SDValue &Base,
988 SDValue &Offset,
989 ISD::MemIndexedMode &AM,
990 SelectionDAG &DAG) const {
991 EVT VT;
992 SDLoc DL(N);
993
994 if (const LoadSDNode *LD = dyn_cast<LoadSDNode>(N)) {
995 VT = LD->getMemoryVT();
996 if (LD->getExtensionType() != ISD::NON_EXTLOAD)
997 return false;
998 } else if (const StoreSDNode *ST = dyn_cast<StoreSDNode>(N)) {
999 VT = ST->getMemoryVT();
1000 if (AVR::isProgramMemoryAccess(ST)) {
1001 return false;
1002 }
1003 } else {
1004 return false;
1005 }
1006
1007 if (VT != MVT::i8 && VT != MVT::i16) {
1008 return false;
1009 }
1010
1011 if (Op->getOpcode() != ISD::ADD && Op->getOpcode() != ISD::SUB) {
1012 return false;
1013 }
1014
1015 if (const ConstantSDNode *RHS = dyn_cast<ConstantSDNode>(Op->getOperand(1))) {
1016 int RHSC = RHS->getSExtValue();
1017 if (Op->getOpcode() == ISD::SUB)
1018 RHSC = -RHSC;
1019 if ((VT == MVT::i16 && RHSC != 2) || (VT == MVT::i8 && RHSC != 1)) {
1020 return false;
1021 }
1022
1023 Base = Op->getOperand(0);
1024 Offset = DAG.getConstant(RHSC, DL, MVT::i8);
1025 AM = ISD::POST_INC;
1026
1027 return true;
1028 }
1029
1030 return false;
1031 }
1032
isOffsetFoldingLegal(const GlobalAddressSDNode * GA) const1033 bool AVRTargetLowering::isOffsetFoldingLegal(
1034 const GlobalAddressSDNode *GA) const {
1035 return true;
1036 }
1037
1038 //===----------------------------------------------------------------------===//
1039 // Formal Arguments Calling Convention Implementation
1040 //===----------------------------------------------------------------------===//
1041
1042 #include "AVRGenCallingConv.inc"
1043
1044 /// Registers for calling conventions, ordered in reverse as required by ABI.
1045 /// Both arrays must be of the same length.
1046 static const MCPhysReg RegList8AVR[] = {
1047 AVR::R25, AVR::R24, AVR::R23, AVR::R22, AVR::R21, AVR::R20,
1048 AVR::R19, AVR::R18, AVR::R17, AVR::R16, AVR::R15, AVR::R14,
1049 AVR::R13, AVR::R12, AVR::R11, AVR::R10, AVR::R9, AVR::R8};
1050 static const MCPhysReg RegList8Tiny[] = {AVR::R25, AVR::R24, AVR::R23,
1051 AVR::R22, AVR::R21, AVR::R20};
1052 static const MCPhysReg RegList16AVR[] = {
1053 AVR::R26R25, AVR::R25R24, AVR::R24R23, AVR::R23R22, AVR::R22R21,
1054 AVR::R21R20, AVR::R20R19, AVR::R19R18, AVR::R18R17, AVR::R17R16,
1055 AVR::R16R15, AVR::R15R14, AVR::R14R13, AVR::R13R12, AVR::R12R11,
1056 AVR::R11R10, AVR::R10R9, AVR::R9R8};
1057 static const MCPhysReg RegList16Tiny[] = {AVR::R26R25, AVR::R25R24,
1058 AVR::R24R23, AVR::R23R22,
1059 AVR::R22R21, AVR::R21R20};
1060
1061 static_assert(array_lengthof(RegList8AVR) == array_lengthof(RegList16AVR),
1062 "8-bit and 16-bit register arrays must be of equal length");
1063 static_assert(array_lengthof(RegList8Tiny) == array_lengthof(RegList16Tiny),
1064 "8-bit and 16-bit register arrays must be of equal length");
1065
1066 /// Analyze incoming and outgoing function arguments. We need custom C++ code
1067 /// to handle special constraints in the ABI.
1068 /// In addition, all pieces of a certain argument have to be passed either
1069 /// using registers or the stack but never mixing both.
1070 template <typename ArgT>
analyzeArguments(TargetLowering::CallLoweringInfo * CLI,const Function * F,const DataLayout * TD,const SmallVectorImpl<ArgT> & Args,SmallVectorImpl<CCValAssign> & ArgLocs,CCState & CCInfo,bool Tiny)1071 static void analyzeArguments(TargetLowering::CallLoweringInfo *CLI,
1072 const Function *F, const DataLayout *TD,
1073 const SmallVectorImpl<ArgT> &Args,
1074 SmallVectorImpl<CCValAssign> &ArgLocs,
1075 CCState &CCInfo, bool Tiny) {
1076 // Choose the proper register list for argument passing according to the ABI.
1077 ArrayRef<MCPhysReg> RegList8;
1078 ArrayRef<MCPhysReg> RegList16;
1079 if (Tiny) {
1080 RegList8 = makeArrayRef(RegList8Tiny, array_lengthof(RegList8Tiny));
1081 RegList16 = makeArrayRef(RegList16Tiny, array_lengthof(RegList16Tiny));
1082 } else {
1083 RegList8 = makeArrayRef(RegList8AVR, array_lengthof(RegList8AVR));
1084 RegList16 = makeArrayRef(RegList16AVR, array_lengthof(RegList16AVR));
1085 }
1086
1087 unsigned NumArgs = Args.size();
1088 // This is the index of the last used register, in RegList*.
1089 // -1 means R26 (R26 is never actually used in CC).
1090 int RegLastIdx = -1;
1091 // Once a value is passed to the stack it will always be used
1092 bool UseStack = false;
1093 for (unsigned i = 0; i != NumArgs;) {
1094 MVT VT = Args[i].VT;
1095 // We have to count the number of bytes for each function argument, that is
1096 // those Args with the same OrigArgIndex. This is important in case the
1097 // function takes an aggregate type.
1098 // Current argument will be between [i..j).
1099 unsigned ArgIndex = Args[i].OrigArgIndex;
1100 unsigned TotalBytes = VT.getStoreSize();
1101 unsigned j = i + 1;
1102 for (; j != NumArgs; ++j) {
1103 if (Args[j].OrigArgIndex != ArgIndex)
1104 break;
1105 TotalBytes += Args[j].VT.getStoreSize();
1106 }
1107 // Round up to even number of bytes.
1108 TotalBytes = alignTo(TotalBytes, 2);
1109 // Skip zero sized arguments
1110 if (TotalBytes == 0)
1111 continue;
1112 // The index of the first register to be used
1113 unsigned RegIdx = RegLastIdx + TotalBytes;
1114 RegLastIdx = RegIdx;
1115 // If there are not enough registers, use the stack
1116 if (RegIdx >= RegList8.size()) {
1117 UseStack = true;
1118 }
1119 for (; i != j; ++i) {
1120 MVT VT = Args[i].VT;
1121
1122 if (UseStack) {
1123 auto evt = EVT(VT).getTypeForEVT(CCInfo.getContext());
1124 unsigned Offset = CCInfo.AllocateStack(TD->getTypeAllocSize(evt),
1125 TD->getABITypeAlign(evt));
1126 CCInfo.addLoc(
1127 CCValAssign::getMem(i, VT, Offset, VT, CCValAssign::Full));
1128 } else {
1129 unsigned Reg;
1130 if (VT == MVT::i8) {
1131 Reg = CCInfo.AllocateReg(RegList8[RegIdx]);
1132 } else if (VT == MVT::i16) {
1133 Reg = CCInfo.AllocateReg(RegList16[RegIdx]);
1134 } else {
1135 llvm_unreachable(
1136 "calling convention can only manage i8 and i16 types");
1137 }
1138 assert(Reg && "register not available in calling convention");
1139 CCInfo.addLoc(CCValAssign::getReg(i, VT, Reg, VT, CCValAssign::Full));
1140 // Registers inside a particular argument are sorted in increasing order
1141 // (remember the array is reversed).
1142 RegIdx -= VT.getStoreSize();
1143 }
1144 }
1145 }
1146 }
1147
1148 /// Count the total number of bytes needed to pass or return these arguments.
1149 template <typename ArgT>
1150 static unsigned
getTotalArgumentsSizeInBytes(const SmallVectorImpl<ArgT> & Args)1151 getTotalArgumentsSizeInBytes(const SmallVectorImpl<ArgT> &Args) {
1152 unsigned TotalBytes = 0;
1153
1154 for (const ArgT &Arg : Args) {
1155 TotalBytes += Arg.VT.getStoreSize();
1156 }
1157 return TotalBytes;
1158 }
1159
1160 /// Analyze incoming and outgoing value of returning from a function.
1161 /// The algorithm is similar to analyzeArguments, but there can only be
1162 /// one value, possibly an aggregate, and it is limited to 8 bytes.
1163 template <typename ArgT>
analyzeReturnValues(const SmallVectorImpl<ArgT> & Args,CCState & CCInfo,bool Tiny)1164 static void analyzeReturnValues(const SmallVectorImpl<ArgT> &Args,
1165 CCState &CCInfo, bool Tiny) {
1166 unsigned NumArgs = Args.size();
1167 unsigned TotalBytes = getTotalArgumentsSizeInBytes(Args);
1168 // CanLowerReturn() guarantees this assertion.
1169 assert(TotalBytes <= 8 &&
1170 "return values greater than 8 bytes cannot be lowered");
1171
1172 // Choose the proper register list for argument passing according to the ABI.
1173 ArrayRef<MCPhysReg> RegList8;
1174 ArrayRef<MCPhysReg> RegList16;
1175 if (Tiny) {
1176 RegList8 = makeArrayRef(RegList8Tiny, array_lengthof(RegList8Tiny));
1177 RegList16 = makeArrayRef(RegList16Tiny, array_lengthof(RegList16Tiny));
1178 } else {
1179 RegList8 = makeArrayRef(RegList8AVR, array_lengthof(RegList8AVR));
1180 RegList16 = makeArrayRef(RegList16AVR, array_lengthof(RegList16AVR));
1181 }
1182
1183 // GCC-ABI says that the size is rounded up to the next even number,
1184 // but actually once it is more than 4 it will always round up to 8.
1185 if (TotalBytes > 4) {
1186 TotalBytes = 8;
1187 } else {
1188 TotalBytes = alignTo(TotalBytes, 2);
1189 }
1190
1191 // The index of the first register to use.
1192 int RegIdx = TotalBytes - 1;
1193 for (unsigned i = 0; i != NumArgs; ++i) {
1194 MVT VT = Args[i].VT;
1195 unsigned Reg;
1196 if (VT == MVT::i8) {
1197 Reg = CCInfo.AllocateReg(RegList8[RegIdx]);
1198 } else if (VT == MVT::i16) {
1199 Reg = CCInfo.AllocateReg(RegList16[RegIdx]);
1200 } else {
1201 llvm_unreachable("calling convention can only manage i8 and i16 types");
1202 }
1203 assert(Reg && "register not available in calling convention");
1204 CCInfo.addLoc(CCValAssign::getReg(i, VT, Reg, VT, CCValAssign::Full));
1205 // Registers sort in increasing order
1206 RegIdx -= VT.getStoreSize();
1207 }
1208 }
1209
LowerFormalArguments(SDValue Chain,CallingConv::ID CallConv,bool isVarArg,const SmallVectorImpl<ISD::InputArg> & Ins,const SDLoc & dl,SelectionDAG & DAG,SmallVectorImpl<SDValue> & InVals) const1210 SDValue AVRTargetLowering::LowerFormalArguments(
1211 SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
1212 const SmallVectorImpl<ISD::InputArg> &Ins, const SDLoc &dl,
1213 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
1214 MachineFunction &MF = DAG.getMachineFunction();
1215 MachineFrameInfo &MFI = MF.getFrameInfo();
1216 auto DL = DAG.getDataLayout();
1217
1218 // Assign locations to all of the incoming arguments.
1219 SmallVector<CCValAssign, 16> ArgLocs;
1220 CCState CCInfo(CallConv, isVarArg, DAG.getMachineFunction(), ArgLocs,
1221 *DAG.getContext());
1222
1223 // Variadic functions do not need all the analysis below.
1224 if (isVarArg) {
1225 CCInfo.AnalyzeFormalArguments(Ins, ArgCC_AVR_Vararg);
1226 } else {
1227 analyzeArguments(nullptr, &MF.getFunction(), &DL, Ins, ArgLocs, CCInfo,
1228 Subtarget.hasTinyEncoding());
1229 }
1230
1231 SDValue ArgValue;
1232 for (CCValAssign &VA : ArgLocs) {
1233
1234 // Arguments stored on registers.
1235 if (VA.isRegLoc()) {
1236 EVT RegVT = VA.getLocVT();
1237 const TargetRegisterClass *RC;
1238 if (RegVT == MVT::i8) {
1239 RC = &AVR::GPR8RegClass;
1240 } else if (RegVT == MVT::i16) {
1241 RC = &AVR::DREGSRegClass;
1242 } else {
1243 llvm_unreachable("Unknown argument type!");
1244 }
1245
1246 Register Reg = MF.addLiveIn(VA.getLocReg(), RC);
1247 ArgValue = DAG.getCopyFromReg(Chain, dl, Reg, RegVT);
1248
1249 // :NOTE: Clang should not promote any i8 into i16 but for safety the
1250 // following code will handle zexts or sexts generated by other
1251 // front ends. Otherwise:
1252 // If this is an 8 bit value, it is really passed promoted
1253 // to 16 bits. Insert an assert[sz]ext to capture this, then
1254 // truncate to the right size.
1255 switch (VA.getLocInfo()) {
1256 default:
1257 llvm_unreachable("Unknown loc info!");
1258 case CCValAssign::Full:
1259 break;
1260 case CCValAssign::BCvt:
1261 ArgValue = DAG.getNode(ISD::BITCAST, dl, VA.getValVT(), ArgValue);
1262 break;
1263 case CCValAssign::SExt:
1264 ArgValue = DAG.getNode(ISD::AssertSext, dl, RegVT, ArgValue,
1265 DAG.getValueType(VA.getValVT()));
1266 ArgValue = DAG.getNode(ISD::TRUNCATE, dl, VA.getValVT(), ArgValue);
1267 break;
1268 case CCValAssign::ZExt:
1269 ArgValue = DAG.getNode(ISD::AssertZext, dl, RegVT, ArgValue,
1270 DAG.getValueType(VA.getValVT()));
1271 ArgValue = DAG.getNode(ISD::TRUNCATE, dl, VA.getValVT(), ArgValue);
1272 break;
1273 }
1274
1275 InVals.push_back(ArgValue);
1276 } else {
1277 // Only arguments passed on the stack should make it here.
1278 assert(VA.isMemLoc());
1279
1280 EVT LocVT = VA.getLocVT();
1281
1282 // Create the frame index object for this incoming parameter.
1283 int FI = MFI.CreateFixedObject(LocVT.getSizeInBits() / 8,
1284 VA.getLocMemOffset(), true);
1285
1286 // Create the SelectionDAG nodes corresponding to a load
1287 // from this parameter.
1288 SDValue FIN = DAG.getFrameIndex(FI, getPointerTy(DL));
1289 InVals.push_back(DAG.getLoad(LocVT, dl, Chain, FIN,
1290 MachinePointerInfo::getFixedStack(MF, FI)));
1291 }
1292 }
1293
1294 // If the function takes variable number of arguments, make a frame index for
1295 // the start of the first vararg value... for expansion of llvm.va_start.
1296 if (isVarArg) {
1297 unsigned StackSize = CCInfo.getNextStackOffset();
1298 AVRMachineFunctionInfo *AFI = MF.getInfo<AVRMachineFunctionInfo>();
1299
1300 AFI->setVarArgsFrameIndex(MFI.CreateFixedObject(2, StackSize, true));
1301 }
1302
1303 return Chain;
1304 }
1305
1306 //===----------------------------------------------------------------------===//
1307 // Call Calling Convention Implementation
1308 //===----------------------------------------------------------------------===//
1309
LowerCall(TargetLowering::CallLoweringInfo & CLI,SmallVectorImpl<SDValue> & InVals) const1310 SDValue AVRTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
1311 SmallVectorImpl<SDValue> &InVals) const {
1312 SelectionDAG &DAG = CLI.DAG;
1313 SDLoc &DL = CLI.DL;
1314 SmallVectorImpl<ISD::OutputArg> &Outs = CLI.Outs;
1315 SmallVectorImpl<SDValue> &OutVals = CLI.OutVals;
1316 SmallVectorImpl<ISD::InputArg> &Ins = CLI.Ins;
1317 SDValue Chain = CLI.Chain;
1318 SDValue Callee = CLI.Callee;
1319 bool &isTailCall = CLI.IsTailCall;
1320 CallingConv::ID CallConv = CLI.CallConv;
1321 bool isVarArg = CLI.IsVarArg;
1322
1323 MachineFunction &MF = DAG.getMachineFunction();
1324
1325 // AVR does not yet support tail call optimization.
1326 isTailCall = false;
1327
1328 // Analyze operands of the call, assigning locations to each operand.
1329 SmallVector<CCValAssign, 16> ArgLocs;
1330 CCState CCInfo(CallConv, isVarArg, DAG.getMachineFunction(), ArgLocs,
1331 *DAG.getContext());
1332
1333 // If the callee is a GlobalAddress/ExternalSymbol node (quite common, every
1334 // direct call is) turn it into a TargetGlobalAddress/TargetExternalSymbol
1335 // node so that legalize doesn't hack it.
1336 const Function *F = nullptr;
1337 if (const GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee)) {
1338 const GlobalValue *GV = G->getGlobal();
1339 if (isa<Function>(GV))
1340 F = cast<Function>(GV);
1341 Callee =
1342 DAG.getTargetGlobalAddress(GV, DL, getPointerTy(DAG.getDataLayout()));
1343 } else if (const ExternalSymbolSDNode *ES =
1344 dyn_cast<ExternalSymbolSDNode>(Callee)) {
1345 Callee = DAG.getTargetExternalSymbol(ES->getSymbol(),
1346 getPointerTy(DAG.getDataLayout()));
1347 }
1348
1349 // Variadic functions do not need all the analysis below.
1350 if (isVarArg) {
1351 CCInfo.AnalyzeCallOperands(Outs, ArgCC_AVR_Vararg);
1352 } else {
1353 analyzeArguments(&CLI, F, &DAG.getDataLayout(), Outs, ArgLocs, CCInfo,
1354 Subtarget.hasTinyEncoding());
1355 }
1356
1357 // Get a count of how many bytes are to be pushed on the stack.
1358 unsigned NumBytes = CCInfo.getNextStackOffset();
1359
1360 Chain = DAG.getCALLSEQ_START(Chain, NumBytes, 0, DL);
1361
1362 SmallVector<std::pair<unsigned, SDValue>, 8> RegsToPass;
1363
1364 // First, walk the register assignments, inserting copies.
1365 unsigned AI, AE;
1366 bool HasStackArgs = false;
1367 for (AI = 0, AE = ArgLocs.size(); AI != AE; ++AI) {
1368 CCValAssign &VA = ArgLocs[AI];
1369 EVT RegVT = VA.getLocVT();
1370 SDValue Arg = OutVals[AI];
1371
1372 // Promote the value if needed. With Clang this should not happen.
1373 switch (VA.getLocInfo()) {
1374 default:
1375 llvm_unreachable("Unknown loc info!");
1376 case CCValAssign::Full:
1377 break;
1378 case CCValAssign::SExt:
1379 Arg = DAG.getNode(ISD::SIGN_EXTEND, DL, RegVT, Arg);
1380 break;
1381 case CCValAssign::ZExt:
1382 Arg = DAG.getNode(ISD::ZERO_EXTEND, DL, RegVT, Arg);
1383 break;
1384 case CCValAssign::AExt:
1385 Arg = DAG.getNode(ISD::ANY_EXTEND, DL, RegVT, Arg);
1386 break;
1387 case CCValAssign::BCvt:
1388 Arg = DAG.getNode(ISD::BITCAST, DL, RegVT, Arg);
1389 break;
1390 }
1391
1392 // Stop when we encounter a stack argument, we need to process them
1393 // in reverse order in the loop below.
1394 if (VA.isMemLoc()) {
1395 HasStackArgs = true;
1396 break;
1397 }
1398
1399 // Arguments that can be passed on registers must be kept in the RegsToPass
1400 // vector.
1401 RegsToPass.push_back(std::make_pair(VA.getLocReg(), Arg));
1402 }
1403
1404 // Second, stack arguments have to walked.
1405 // Previously this code created chained stores but those chained stores appear
1406 // to be unchained in the legalization phase. Therefore, do not attempt to
1407 // chain them here. In fact, chaining them here somehow causes the first and
1408 // second store to be reversed which is the exact opposite of the intended
1409 // effect.
1410 if (HasStackArgs) {
1411 SmallVector<SDValue, 8> MemOpChains;
1412 for (; AI != AE; AI++) {
1413 CCValAssign &VA = ArgLocs[AI];
1414 SDValue Arg = OutVals[AI];
1415
1416 assert(VA.isMemLoc());
1417
1418 // SP points to one stack slot further so add one to adjust it.
1419 SDValue PtrOff = DAG.getNode(
1420 ISD::ADD, DL, getPointerTy(DAG.getDataLayout()),
1421 DAG.getRegister(AVR::SP, getPointerTy(DAG.getDataLayout())),
1422 DAG.getIntPtrConstant(VA.getLocMemOffset() + 1, DL));
1423
1424 MemOpChains.push_back(
1425 DAG.getStore(Chain, DL, Arg, PtrOff,
1426 MachinePointerInfo::getStack(MF, VA.getLocMemOffset())));
1427 }
1428
1429 if (!MemOpChains.empty())
1430 Chain = DAG.getNode(ISD::TokenFactor, DL, MVT::Other, MemOpChains);
1431 }
1432
1433 // Build a sequence of copy-to-reg nodes chained together with token chain and
1434 // flag operands which copy the outgoing args into registers. The InFlag in
1435 // necessary since all emited instructions must be stuck together.
1436 SDValue InFlag;
1437 for (auto Reg : RegsToPass) {
1438 Chain = DAG.getCopyToReg(Chain, DL, Reg.first, Reg.second, InFlag);
1439 InFlag = Chain.getValue(1);
1440 }
1441
1442 // Returns a chain & a flag for retval copy to use.
1443 SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Glue);
1444 SmallVector<SDValue, 8> Ops;
1445 Ops.push_back(Chain);
1446 Ops.push_back(Callee);
1447
1448 // Add argument registers to the end of the list so that they are known live
1449 // into the call.
1450 for (auto Reg : RegsToPass) {
1451 Ops.push_back(DAG.getRegister(Reg.first, Reg.second.getValueType()));
1452 }
1453
1454 // Add a register mask operand representing the call-preserved registers.
1455 const TargetRegisterInfo *TRI = Subtarget.getRegisterInfo();
1456 const uint32_t *Mask =
1457 TRI->getCallPreservedMask(DAG.getMachineFunction(), CallConv);
1458 assert(Mask && "Missing call preserved mask for calling convention");
1459 Ops.push_back(DAG.getRegisterMask(Mask));
1460
1461 if (InFlag.getNode()) {
1462 Ops.push_back(InFlag);
1463 }
1464
1465 Chain = DAG.getNode(AVRISD::CALL, DL, NodeTys, Ops);
1466 InFlag = Chain.getValue(1);
1467
1468 // Create the CALLSEQ_END node.
1469 Chain = DAG.getCALLSEQ_END(Chain, DAG.getIntPtrConstant(NumBytes, DL, true),
1470 DAG.getIntPtrConstant(0, DL, true), InFlag, DL);
1471
1472 if (!Ins.empty()) {
1473 InFlag = Chain.getValue(1);
1474 }
1475
1476 // Handle result values, copying them out of physregs into vregs that we
1477 // return.
1478 return LowerCallResult(Chain, InFlag, CallConv, isVarArg, Ins, DL, DAG,
1479 InVals);
1480 }
1481
1482 /// Lower the result values of a call into the
1483 /// appropriate copies out of appropriate physical registers.
1484 ///
LowerCallResult(SDValue Chain,SDValue InFlag,CallingConv::ID CallConv,bool isVarArg,const SmallVectorImpl<ISD::InputArg> & Ins,const SDLoc & dl,SelectionDAG & DAG,SmallVectorImpl<SDValue> & InVals) const1485 SDValue AVRTargetLowering::LowerCallResult(
1486 SDValue Chain, SDValue InFlag, CallingConv::ID CallConv, bool isVarArg,
1487 const SmallVectorImpl<ISD::InputArg> &Ins, const SDLoc &dl,
1488 SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const {
1489
1490 // Assign locations to each value returned by this call.
1491 SmallVector<CCValAssign, 16> RVLocs;
1492 CCState CCInfo(CallConv, isVarArg, DAG.getMachineFunction(), RVLocs,
1493 *DAG.getContext());
1494
1495 // Handle runtime calling convs.
1496 if (CallConv == CallingConv::AVR_BUILTIN) {
1497 CCInfo.AnalyzeCallResult(Ins, RetCC_AVR_BUILTIN);
1498 } else {
1499 analyzeReturnValues(Ins, CCInfo, Subtarget.hasTinyEncoding());
1500 }
1501
1502 // Copy all of the result registers out of their specified physreg.
1503 for (CCValAssign const &RVLoc : RVLocs) {
1504 Chain = DAG.getCopyFromReg(Chain, dl, RVLoc.getLocReg(), RVLoc.getValVT(),
1505 InFlag)
1506 .getValue(1);
1507 InFlag = Chain.getValue(2);
1508 InVals.push_back(Chain.getValue(0));
1509 }
1510
1511 return Chain;
1512 }
1513
1514 //===----------------------------------------------------------------------===//
1515 // Return Value Calling Convention Implementation
1516 //===----------------------------------------------------------------------===//
1517
CanLowerReturn(CallingConv::ID CallConv,MachineFunction & MF,bool isVarArg,const SmallVectorImpl<ISD::OutputArg> & Outs,LLVMContext & Context) const1518 bool AVRTargetLowering::CanLowerReturn(
1519 CallingConv::ID CallConv, MachineFunction &MF, bool isVarArg,
1520 const SmallVectorImpl<ISD::OutputArg> &Outs, LLVMContext &Context) const {
1521 if (CallConv == CallingConv::AVR_BUILTIN) {
1522 SmallVector<CCValAssign, 16> RVLocs;
1523 CCState CCInfo(CallConv, isVarArg, MF, RVLocs, Context);
1524 return CCInfo.CheckReturn(Outs, RetCC_AVR_BUILTIN);
1525 }
1526
1527 unsigned TotalBytes = getTotalArgumentsSizeInBytes(Outs);
1528 return TotalBytes <= 8;
1529 }
1530
1531 SDValue
LowerReturn(SDValue Chain,CallingConv::ID CallConv,bool isVarArg,const SmallVectorImpl<ISD::OutputArg> & Outs,const SmallVectorImpl<SDValue> & OutVals,const SDLoc & dl,SelectionDAG & DAG) const1532 AVRTargetLowering::LowerReturn(SDValue Chain, CallingConv::ID CallConv,
1533 bool isVarArg,
1534 const SmallVectorImpl<ISD::OutputArg> &Outs,
1535 const SmallVectorImpl<SDValue> &OutVals,
1536 const SDLoc &dl, SelectionDAG &DAG) const {
1537 // CCValAssign - represent the assignment of the return value to locations.
1538 SmallVector<CCValAssign, 16> RVLocs;
1539
1540 // CCState - Info about the registers and stack slot.
1541 CCState CCInfo(CallConv, isVarArg, DAG.getMachineFunction(), RVLocs,
1542 *DAG.getContext());
1543
1544 MachineFunction &MF = DAG.getMachineFunction();
1545
1546 // Analyze return values.
1547 if (CallConv == CallingConv::AVR_BUILTIN) {
1548 CCInfo.AnalyzeReturn(Outs, RetCC_AVR_BUILTIN);
1549 } else {
1550 analyzeReturnValues(Outs, CCInfo, Subtarget.hasTinyEncoding());
1551 }
1552
1553 SDValue Flag;
1554 SmallVector<SDValue, 4> RetOps(1, Chain);
1555 // Copy the result values into the output registers.
1556 for (unsigned i = 0, e = RVLocs.size(); i != e; ++i) {
1557 CCValAssign &VA = RVLocs[i];
1558 assert(VA.isRegLoc() && "Can only return in registers!");
1559
1560 Chain = DAG.getCopyToReg(Chain, dl, VA.getLocReg(), OutVals[i], Flag);
1561
1562 // Guarantee that all emitted copies are stuck together with flags.
1563 Flag = Chain.getValue(1);
1564 RetOps.push_back(DAG.getRegister(VA.getLocReg(), VA.getLocVT()));
1565 }
1566
1567 // Don't emit the ret/reti instruction when the naked attribute is present in
1568 // the function being compiled.
1569 if (MF.getFunction().getAttributes().hasFnAttr(Attribute::Naked)) {
1570 return Chain;
1571 }
1572
1573 const AVRMachineFunctionInfo *AFI = MF.getInfo<AVRMachineFunctionInfo>();
1574
1575 unsigned RetOpc =
1576 AFI->isInterruptOrSignalHandler() ? AVRISD::RETI_FLAG : AVRISD::RET_FLAG;
1577
1578 RetOps[0] = Chain; // Update chain.
1579
1580 if (Flag.getNode()) {
1581 RetOps.push_back(Flag);
1582 }
1583
1584 return DAG.getNode(RetOpc, dl, MVT::Other, RetOps);
1585 }
1586
1587 //===----------------------------------------------------------------------===//
1588 // Custom Inserters
1589 //===----------------------------------------------------------------------===//
1590
insertShift(MachineInstr & MI,MachineBasicBlock * BB) const1591 MachineBasicBlock *AVRTargetLowering::insertShift(MachineInstr &MI,
1592 MachineBasicBlock *BB) const {
1593 unsigned Opc;
1594 const TargetRegisterClass *RC;
1595 bool HasRepeatedOperand = false;
1596 MachineFunction *F = BB->getParent();
1597 MachineRegisterInfo &RI = F->getRegInfo();
1598 const TargetInstrInfo &TII = *Subtarget.getInstrInfo();
1599 DebugLoc dl = MI.getDebugLoc();
1600
1601 switch (MI.getOpcode()) {
1602 default:
1603 llvm_unreachable("Invalid shift opcode!");
1604 case AVR::Lsl8:
1605 Opc = AVR::ADDRdRr; // LSL is an alias of ADD Rd, Rd
1606 RC = &AVR::GPR8RegClass;
1607 HasRepeatedOperand = true;
1608 break;
1609 case AVR::Lsl16:
1610 Opc = AVR::LSLWRd;
1611 RC = &AVR::DREGSRegClass;
1612 break;
1613 case AVR::Asr8:
1614 Opc = AVR::ASRRd;
1615 RC = &AVR::GPR8RegClass;
1616 break;
1617 case AVR::Asr16:
1618 Opc = AVR::ASRWRd;
1619 RC = &AVR::DREGSRegClass;
1620 break;
1621 case AVR::Lsr8:
1622 Opc = AVR::LSRRd;
1623 RC = &AVR::GPR8RegClass;
1624 break;
1625 case AVR::Lsr16:
1626 Opc = AVR::LSRWRd;
1627 RC = &AVR::DREGSRegClass;
1628 break;
1629 case AVR::Rol8:
1630 Opc = AVR::ROLBRd;
1631 RC = &AVR::GPR8RegClass;
1632 break;
1633 case AVR::Rol16:
1634 Opc = AVR::ROLWRd;
1635 RC = &AVR::DREGSRegClass;
1636 break;
1637 case AVR::Ror8:
1638 Opc = AVR::RORBRd;
1639 RC = &AVR::GPR8RegClass;
1640 break;
1641 case AVR::Ror16:
1642 Opc = AVR::RORWRd;
1643 RC = &AVR::DREGSRegClass;
1644 break;
1645 }
1646
1647 const BasicBlock *LLVM_BB = BB->getBasicBlock();
1648
1649 MachineFunction::iterator I;
1650 for (I = BB->getIterator(); I != F->end() && &(*I) != BB; ++I)
1651 ;
1652 if (I != F->end())
1653 ++I;
1654
1655 // Create loop block.
1656 MachineBasicBlock *LoopBB = F->CreateMachineBasicBlock(LLVM_BB);
1657 MachineBasicBlock *CheckBB = F->CreateMachineBasicBlock(LLVM_BB);
1658 MachineBasicBlock *RemBB = F->CreateMachineBasicBlock(LLVM_BB);
1659
1660 F->insert(I, LoopBB);
1661 F->insert(I, CheckBB);
1662 F->insert(I, RemBB);
1663
1664 // Update machine-CFG edges by transferring all successors of the current
1665 // block to the block containing instructions after shift.
1666 RemBB->splice(RemBB->begin(), BB, std::next(MachineBasicBlock::iterator(MI)),
1667 BB->end());
1668 RemBB->transferSuccessorsAndUpdatePHIs(BB);
1669
1670 // Add edges BB => LoopBB => CheckBB => RemBB, CheckBB => LoopBB.
1671 BB->addSuccessor(CheckBB);
1672 LoopBB->addSuccessor(CheckBB);
1673 CheckBB->addSuccessor(LoopBB);
1674 CheckBB->addSuccessor(RemBB);
1675
1676 Register ShiftAmtReg = RI.createVirtualRegister(&AVR::GPR8RegClass);
1677 Register ShiftAmtReg2 = RI.createVirtualRegister(&AVR::GPR8RegClass);
1678 Register ShiftReg = RI.createVirtualRegister(RC);
1679 Register ShiftReg2 = RI.createVirtualRegister(RC);
1680 Register ShiftAmtSrcReg = MI.getOperand(2).getReg();
1681 Register SrcReg = MI.getOperand(1).getReg();
1682 Register DstReg = MI.getOperand(0).getReg();
1683
1684 // BB:
1685 // rjmp CheckBB
1686 BuildMI(BB, dl, TII.get(AVR::RJMPk)).addMBB(CheckBB);
1687
1688 // LoopBB:
1689 // ShiftReg2 = shift ShiftReg
1690 auto ShiftMI = BuildMI(LoopBB, dl, TII.get(Opc), ShiftReg2).addReg(ShiftReg);
1691 if (HasRepeatedOperand)
1692 ShiftMI.addReg(ShiftReg);
1693
1694 // CheckBB:
1695 // ShiftReg = phi [%SrcReg, BB], [%ShiftReg2, LoopBB]
1696 // ShiftAmt = phi [%N, BB], [%ShiftAmt2, LoopBB]
1697 // DestReg = phi [%SrcReg, BB], [%ShiftReg, LoopBB]
1698 // ShiftAmt2 = ShiftAmt - 1;
1699 // if (ShiftAmt2 >= 0) goto LoopBB;
1700 BuildMI(CheckBB, dl, TII.get(AVR::PHI), ShiftReg)
1701 .addReg(SrcReg)
1702 .addMBB(BB)
1703 .addReg(ShiftReg2)
1704 .addMBB(LoopBB);
1705 BuildMI(CheckBB, dl, TII.get(AVR::PHI), ShiftAmtReg)
1706 .addReg(ShiftAmtSrcReg)
1707 .addMBB(BB)
1708 .addReg(ShiftAmtReg2)
1709 .addMBB(LoopBB);
1710 BuildMI(CheckBB, dl, TII.get(AVR::PHI), DstReg)
1711 .addReg(SrcReg)
1712 .addMBB(BB)
1713 .addReg(ShiftReg2)
1714 .addMBB(LoopBB);
1715
1716 BuildMI(CheckBB, dl, TII.get(AVR::DECRd), ShiftAmtReg2).addReg(ShiftAmtReg);
1717 BuildMI(CheckBB, dl, TII.get(AVR::BRPLk)).addMBB(LoopBB);
1718
1719 MI.eraseFromParent(); // The pseudo instruction is gone now.
1720 return RemBB;
1721 }
1722
isCopyMulResult(MachineBasicBlock::iterator const & I)1723 static bool isCopyMulResult(MachineBasicBlock::iterator const &I) {
1724 if (I->getOpcode() == AVR::COPY) {
1725 Register SrcReg = I->getOperand(1).getReg();
1726 return (SrcReg == AVR::R0 || SrcReg == AVR::R1);
1727 }
1728
1729 return false;
1730 }
1731
1732 // The mul instructions wreak havock on our zero_reg R1. We need to clear it
1733 // after the result has been evacuated. This is probably not the best way to do
1734 // it, but it works for now.
insertMul(MachineInstr & MI,MachineBasicBlock * BB) const1735 MachineBasicBlock *AVRTargetLowering::insertMul(MachineInstr &MI,
1736 MachineBasicBlock *BB) const {
1737 const TargetInstrInfo &TII = *Subtarget.getInstrInfo();
1738 MachineBasicBlock::iterator I(MI);
1739 ++I; // in any case insert *after* the mul instruction
1740 if (isCopyMulResult(I))
1741 ++I;
1742 if (isCopyMulResult(I))
1743 ++I;
1744 BuildMI(*BB, I, MI.getDebugLoc(), TII.get(AVR::EORRdRr), AVR::R1)
1745 .addReg(AVR::R1)
1746 .addReg(AVR::R1);
1747 return BB;
1748 }
1749
1750 // Insert a read from R1, which almost always contains the value 0.
1751 MachineBasicBlock *
insertCopyR1(MachineInstr & MI,MachineBasicBlock * BB) const1752 AVRTargetLowering::insertCopyR1(MachineInstr &MI, MachineBasicBlock *BB) const {
1753 const TargetInstrInfo &TII = *Subtarget.getInstrInfo();
1754 MachineBasicBlock::iterator I(MI);
1755 BuildMI(*BB, I, MI.getDebugLoc(), TII.get(AVR::COPY))
1756 .add(MI.getOperand(0))
1757 .addReg(AVR::R1);
1758 MI.eraseFromParent();
1759 return BB;
1760 }
1761
1762 // Lower atomicrmw operation to disable interrupts, do operation, and restore
1763 // interrupts. This works because all AVR microcontrollers are single core.
insertAtomicArithmeticOp(MachineInstr & MI,MachineBasicBlock * BB,unsigned Opcode,int Width) const1764 MachineBasicBlock *AVRTargetLowering::insertAtomicArithmeticOp(
1765 MachineInstr &MI, MachineBasicBlock *BB, unsigned Opcode, int Width) const {
1766 MachineRegisterInfo &MRI = BB->getParent()->getRegInfo();
1767 const TargetInstrInfo &TII = *Subtarget.getInstrInfo();
1768 MachineBasicBlock::iterator I(MI);
1769 const Register SCRATCH_REGISTER = AVR::R0;
1770 DebugLoc dl = MI.getDebugLoc();
1771
1772 // Example instruction sequence, for an atomic 8-bit add:
1773 // ldi r25, 5
1774 // in r0, SREG
1775 // cli
1776 // ld r24, X
1777 // add r25, r24
1778 // st X, r25
1779 // out SREG, r0
1780
1781 const TargetRegisterClass *RC =
1782 (Width == 8) ? &AVR::GPR8RegClass : &AVR::DREGSRegClass;
1783 unsigned LoadOpcode = (Width == 8) ? AVR::LDRdPtr : AVR::LDWRdPtr;
1784 unsigned StoreOpcode = (Width == 8) ? AVR::STPtrRr : AVR::STWPtrRr;
1785
1786 // Disable interrupts.
1787 BuildMI(*BB, I, dl, TII.get(AVR::INRdA), SCRATCH_REGISTER)
1788 .addImm(Subtarget.getIORegSREG());
1789 BuildMI(*BB, I, dl, TII.get(AVR::BCLRs)).addImm(7);
1790
1791 // Load the original value.
1792 BuildMI(*BB, I, dl, TII.get(LoadOpcode), MI.getOperand(0).getReg())
1793 .add(MI.getOperand(1));
1794
1795 // Do the arithmetic operation.
1796 Register Result = MRI.createVirtualRegister(RC);
1797 BuildMI(*BB, I, dl, TII.get(Opcode), Result)
1798 .addReg(MI.getOperand(0).getReg())
1799 .add(MI.getOperand(2));
1800
1801 // Store the result.
1802 BuildMI(*BB, I, dl, TII.get(StoreOpcode))
1803 .add(MI.getOperand(1))
1804 .addReg(Result);
1805
1806 // Restore interrupts.
1807 BuildMI(*BB, I, dl, TII.get(AVR::OUTARr))
1808 .addImm(Subtarget.getIORegSREG())
1809 .addReg(SCRATCH_REGISTER);
1810
1811 // Remove the pseudo instruction.
1812 MI.eraseFromParent();
1813 return BB;
1814 }
1815
1816 MachineBasicBlock *
EmitInstrWithCustomInserter(MachineInstr & MI,MachineBasicBlock * MBB) const1817 AVRTargetLowering::EmitInstrWithCustomInserter(MachineInstr &MI,
1818 MachineBasicBlock *MBB) const {
1819 int Opc = MI.getOpcode();
1820
1821 // Pseudo shift instructions with a non constant shift amount are expanded
1822 // into a loop.
1823 switch (Opc) {
1824 case AVR::Lsl8:
1825 case AVR::Lsl16:
1826 case AVR::Lsr8:
1827 case AVR::Lsr16:
1828 case AVR::Rol8:
1829 case AVR::Rol16:
1830 case AVR::Ror8:
1831 case AVR::Ror16:
1832 case AVR::Asr8:
1833 case AVR::Asr16:
1834 return insertShift(MI, MBB);
1835 case AVR::MULRdRr:
1836 case AVR::MULSRdRr:
1837 return insertMul(MI, MBB);
1838 case AVR::CopyR1:
1839 return insertCopyR1(MI, MBB);
1840 case AVR::AtomicLoadAdd8:
1841 return insertAtomicArithmeticOp(MI, MBB, AVR::ADDRdRr, 8);
1842 case AVR::AtomicLoadAdd16:
1843 return insertAtomicArithmeticOp(MI, MBB, AVR::ADDWRdRr, 16);
1844 case AVR::AtomicLoadSub8:
1845 return insertAtomicArithmeticOp(MI, MBB, AVR::SUBRdRr, 8);
1846 case AVR::AtomicLoadSub16:
1847 return insertAtomicArithmeticOp(MI, MBB, AVR::SUBWRdRr, 16);
1848 case AVR::AtomicLoadAnd8:
1849 return insertAtomicArithmeticOp(MI, MBB, AVR::ANDRdRr, 8);
1850 case AVR::AtomicLoadAnd16:
1851 return insertAtomicArithmeticOp(MI, MBB, AVR::ANDWRdRr, 16);
1852 case AVR::AtomicLoadOr8:
1853 return insertAtomicArithmeticOp(MI, MBB, AVR::ORRdRr, 8);
1854 case AVR::AtomicLoadOr16:
1855 return insertAtomicArithmeticOp(MI, MBB, AVR::ORWRdRr, 16);
1856 case AVR::AtomicLoadXor8:
1857 return insertAtomicArithmeticOp(MI, MBB, AVR::EORRdRr, 8);
1858 case AVR::AtomicLoadXor16:
1859 return insertAtomicArithmeticOp(MI, MBB, AVR::EORWRdRr, 16);
1860 }
1861
1862 assert((Opc == AVR::Select16 || Opc == AVR::Select8) &&
1863 "Unexpected instr type to insert");
1864
1865 const AVRInstrInfo &TII = (const AVRInstrInfo &)*MI.getParent()
1866 ->getParent()
1867 ->getSubtarget()
1868 .getInstrInfo();
1869 DebugLoc dl = MI.getDebugLoc();
1870
1871 // To "insert" a SELECT instruction, we insert the diamond
1872 // control-flow pattern. The incoming instruction knows the
1873 // destination vreg to set, the condition code register to branch
1874 // on, the true/false values to select between, and a branch opcode
1875 // to use.
1876
1877 MachineFunction *MF = MBB->getParent();
1878 const BasicBlock *LLVM_BB = MBB->getBasicBlock();
1879 MachineBasicBlock *FallThrough = MBB->getFallThrough();
1880
1881 // If the current basic block falls through to another basic block,
1882 // we must insert an unconditional branch to the fallthrough destination
1883 // if we are to insert basic blocks at the prior fallthrough point.
1884 if (FallThrough != nullptr) {
1885 BuildMI(MBB, dl, TII.get(AVR::RJMPk)).addMBB(FallThrough);
1886 }
1887
1888 MachineBasicBlock *trueMBB = MF->CreateMachineBasicBlock(LLVM_BB);
1889 MachineBasicBlock *falseMBB = MF->CreateMachineBasicBlock(LLVM_BB);
1890
1891 MachineFunction::iterator I;
1892 for (I = MF->begin(); I != MF->end() && &(*I) != MBB; ++I)
1893 ;
1894 if (I != MF->end())
1895 ++I;
1896 MF->insert(I, trueMBB);
1897 MF->insert(I, falseMBB);
1898
1899 // Transfer remaining instructions and all successors of the current
1900 // block to the block which will contain the Phi node for the
1901 // select.
1902 trueMBB->splice(trueMBB->begin(), MBB,
1903 std::next(MachineBasicBlock::iterator(MI)), MBB->end());
1904 trueMBB->transferSuccessorsAndUpdatePHIs(MBB);
1905
1906 AVRCC::CondCodes CC = (AVRCC::CondCodes)MI.getOperand(3).getImm();
1907 BuildMI(MBB, dl, TII.getBrCond(CC)).addMBB(trueMBB);
1908 BuildMI(MBB, dl, TII.get(AVR::RJMPk)).addMBB(falseMBB);
1909 MBB->addSuccessor(falseMBB);
1910 MBB->addSuccessor(trueMBB);
1911
1912 // Unconditionally flow back to the true block
1913 BuildMI(falseMBB, dl, TII.get(AVR::RJMPk)).addMBB(trueMBB);
1914 falseMBB->addSuccessor(trueMBB);
1915
1916 // Set up the Phi node to determine where we came from
1917 BuildMI(*trueMBB, trueMBB->begin(), dl, TII.get(AVR::PHI),
1918 MI.getOperand(0).getReg())
1919 .addReg(MI.getOperand(1).getReg())
1920 .addMBB(MBB)
1921 .addReg(MI.getOperand(2).getReg())
1922 .addMBB(falseMBB);
1923
1924 MI.eraseFromParent(); // The pseudo instruction is gone now.
1925 return trueMBB;
1926 }
1927
1928 //===----------------------------------------------------------------------===//
1929 // Inline Asm Support
1930 //===----------------------------------------------------------------------===//
1931
1932 AVRTargetLowering::ConstraintType
getConstraintType(StringRef Constraint) const1933 AVRTargetLowering::getConstraintType(StringRef Constraint) const {
1934 if (Constraint.size() == 1) {
1935 // See http://www.nongnu.org/avr-libc/user-manual/inline_asm.html
1936 switch (Constraint[0]) {
1937 default:
1938 break;
1939 case 'a': // Simple upper registers
1940 case 'b': // Base pointer registers pairs
1941 case 'd': // Upper register
1942 case 'l': // Lower registers
1943 case 'e': // Pointer register pairs
1944 case 'q': // Stack pointer register
1945 case 'r': // Any register
1946 case 'w': // Special upper register pairs
1947 return C_RegisterClass;
1948 case 't': // Temporary register
1949 case 'x':
1950 case 'X': // Pointer register pair X
1951 case 'y':
1952 case 'Y': // Pointer register pair Y
1953 case 'z':
1954 case 'Z': // Pointer register pair Z
1955 return C_Register;
1956 case 'Q': // A memory address based on Y or Z pointer with displacement.
1957 return C_Memory;
1958 case 'G': // Floating point constant
1959 case 'I': // 6-bit positive integer constant
1960 case 'J': // 6-bit negative integer constant
1961 case 'K': // Integer constant (Range: 2)
1962 case 'L': // Integer constant (Range: 0)
1963 case 'M': // 8-bit integer constant
1964 case 'N': // Integer constant (Range: -1)
1965 case 'O': // Integer constant (Range: 8, 16, 24)
1966 case 'P': // Integer constant (Range: 1)
1967 case 'R': // Integer constant (Range: -6 to 5)x
1968 return C_Immediate;
1969 }
1970 }
1971
1972 return TargetLowering::getConstraintType(Constraint);
1973 }
1974
1975 unsigned
getInlineAsmMemConstraint(StringRef ConstraintCode) const1976 AVRTargetLowering::getInlineAsmMemConstraint(StringRef ConstraintCode) const {
1977 // Not sure if this is actually the right thing to do, but we got to do
1978 // *something* [agnat]
1979 switch (ConstraintCode[0]) {
1980 case 'Q':
1981 return InlineAsm::Constraint_Q;
1982 }
1983 return TargetLowering::getInlineAsmMemConstraint(ConstraintCode);
1984 }
1985
1986 AVRTargetLowering::ConstraintWeight
getSingleConstraintMatchWeight(AsmOperandInfo & info,const char * constraint) const1987 AVRTargetLowering::getSingleConstraintMatchWeight(
1988 AsmOperandInfo &info, const char *constraint) const {
1989 ConstraintWeight weight = CW_Invalid;
1990 Value *CallOperandVal = info.CallOperandVal;
1991
1992 // If we don't have a value, we can't do a match,
1993 // but allow it at the lowest weight.
1994 // (this behaviour has been copied from the ARM backend)
1995 if (!CallOperandVal) {
1996 return CW_Default;
1997 }
1998
1999 // Look at the constraint type.
2000 switch (*constraint) {
2001 default:
2002 weight = TargetLowering::getSingleConstraintMatchWeight(info, constraint);
2003 break;
2004 case 'd':
2005 case 'r':
2006 case 'l':
2007 weight = CW_Register;
2008 break;
2009 case 'a':
2010 case 'b':
2011 case 'e':
2012 case 'q':
2013 case 't':
2014 case 'w':
2015 case 'x':
2016 case 'X':
2017 case 'y':
2018 case 'Y':
2019 case 'z':
2020 case 'Z':
2021 weight = CW_SpecificReg;
2022 break;
2023 case 'G':
2024 if (const ConstantFP *C = dyn_cast<ConstantFP>(CallOperandVal)) {
2025 if (C->isZero()) {
2026 weight = CW_Constant;
2027 }
2028 }
2029 break;
2030 case 'I':
2031 if (const ConstantInt *C = dyn_cast<ConstantInt>(CallOperandVal)) {
2032 if (isUInt<6>(C->getZExtValue())) {
2033 weight = CW_Constant;
2034 }
2035 }
2036 break;
2037 case 'J':
2038 if (const ConstantInt *C = dyn_cast<ConstantInt>(CallOperandVal)) {
2039 if ((C->getSExtValue() >= -63) && (C->getSExtValue() <= 0)) {
2040 weight = CW_Constant;
2041 }
2042 }
2043 break;
2044 case 'K':
2045 if (const ConstantInt *C = dyn_cast<ConstantInt>(CallOperandVal)) {
2046 if (C->getZExtValue() == 2) {
2047 weight = CW_Constant;
2048 }
2049 }
2050 break;
2051 case 'L':
2052 if (const ConstantInt *C = dyn_cast<ConstantInt>(CallOperandVal)) {
2053 if (C->getZExtValue() == 0) {
2054 weight = CW_Constant;
2055 }
2056 }
2057 break;
2058 case 'M':
2059 if (const ConstantInt *C = dyn_cast<ConstantInt>(CallOperandVal)) {
2060 if (isUInt<8>(C->getZExtValue())) {
2061 weight = CW_Constant;
2062 }
2063 }
2064 break;
2065 case 'N':
2066 if (const ConstantInt *C = dyn_cast<ConstantInt>(CallOperandVal)) {
2067 if (C->getSExtValue() == -1) {
2068 weight = CW_Constant;
2069 }
2070 }
2071 break;
2072 case 'O':
2073 if (const ConstantInt *C = dyn_cast<ConstantInt>(CallOperandVal)) {
2074 if ((C->getZExtValue() == 8) || (C->getZExtValue() == 16) ||
2075 (C->getZExtValue() == 24)) {
2076 weight = CW_Constant;
2077 }
2078 }
2079 break;
2080 case 'P':
2081 if (const ConstantInt *C = dyn_cast<ConstantInt>(CallOperandVal)) {
2082 if (C->getZExtValue() == 1) {
2083 weight = CW_Constant;
2084 }
2085 }
2086 break;
2087 case 'R':
2088 if (const ConstantInt *C = dyn_cast<ConstantInt>(CallOperandVal)) {
2089 if ((C->getSExtValue() >= -6) && (C->getSExtValue() <= 5)) {
2090 weight = CW_Constant;
2091 }
2092 }
2093 break;
2094 case 'Q':
2095 weight = CW_Memory;
2096 break;
2097 }
2098
2099 return weight;
2100 }
2101
2102 std::pair<unsigned, const TargetRegisterClass *>
getRegForInlineAsmConstraint(const TargetRegisterInfo * TRI,StringRef Constraint,MVT VT) const2103 AVRTargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
2104 StringRef Constraint,
2105 MVT VT) const {
2106 if (Constraint.size() == 1) {
2107 switch (Constraint[0]) {
2108 case 'a': // Simple upper registers r16..r23.
2109 if (VT == MVT::i8)
2110 return std::make_pair(0U, &AVR::LD8loRegClass);
2111 else if (VT == MVT::i16)
2112 return std::make_pair(0U, &AVR::DREGSLD8loRegClass);
2113 break;
2114 case 'b': // Base pointer registers: y, z.
2115 if (VT == MVT::i8 || VT == MVT::i16)
2116 return std::make_pair(0U, &AVR::PTRDISPREGSRegClass);
2117 break;
2118 case 'd': // Upper registers r16..r31.
2119 if (VT == MVT::i8)
2120 return std::make_pair(0U, &AVR::LD8RegClass);
2121 else if (VT == MVT::i16)
2122 return std::make_pair(0U, &AVR::DLDREGSRegClass);
2123 break;
2124 case 'l': // Lower registers r0..r15.
2125 if (VT == MVT::i8)
2126 return std::make_pair(0U, &AVR::GPR8loRegClass);
2127 else if (VT == MVT::i16)
2128 return std::make_pair(0U, &AVR::DREGSloRegClass);
2129 break;
2130 case 'e': // Pointer register pairs: x, y, z.
2131 if (VT == MVT::i8 || VT == MVT::i16)
2132 return std::make_pair(0U, &AVR::PTRREGSRegClass);
2133 break;
2134 case 'q': // Stack pointer register: SPH:SPL.
2135 return std::make_pair(0U, &AVR::GPRSPRegClass);
2136 case 'r': // Any register: r0..r31.
2137 if (VT == MVT::i8)
2138 return std::make_pair(0U, &AVR::GPR8RegClass);
2139 else if (VT == MVT::i16)
2140 return std::make_pair(0U, &AVR::DREGSRegClass);
2141 break;
2142 case 't': // Temporary register: r0.
2143 if (VT == MVT::i8)
2144 return std::make_pair(unsigned(AVR::R0), &AVR::GPR8RegClass);
2145 break;
2146 case 'w': // Special upper register pairs: r24, r26, r28, r30.
2147 if (VT == MVT::i8 || VT == MVT::i16)
2148 return std::make_pair(0U, &AVR::IWREGSRegClass);
2149 break;
2150 case 'x': // Pointer register pair X: r27:r26.
2151 case 'X':
2152 if (VT == MVT::i8 || VT == MVT::i16)
2153 return std::make_pair(unsigned(AVR::R27R26), &AVR::PTRREGSRegClass);
2154 break;
2155 case 'y': // Pointer register pair Y: r29:r28.
2156 case 'Y':
2157 if (VT == MVT::i8 || VT == MVT::i16)
2158 return std::make_pair(unsigned(AVR::R29R28), &AVR::PTRREGSRegClass);
2159 break;
2160 case 'z': // Pointer register pair Z: r31:r30.
2161 case 'Z':
2162 if (VT == MVT::i8 || VT == MVT::i16)
2163 return std::make_pair(unsigned(AVR::R31R30), &AVR::PTRREGSRegClass);
2164 break;
2165 default:
2166 break;
2167 }
2168 }
2169
2170 return TargetLowering::getRegForInlineAsmConstraint(
2171 Subtarget.getRegisterInfo(), Constraint, VT);
2172 }
2173
LowerAsmOperandForConstraint(SDValue Op,std::string & Constraint,std::vector<SDValue> & Ops,SelectionDAG & DAG) const2174 void AVRTargetLowering::LowerAsmOperandForConstraint(SDValue Op,
2175 std::string &Constraint,
2176 std::vector<SDValue> &Ops,
2177 SelectionDAG &DAG) const {
2178 SDValue Result;
2179 SDLoc DL(Op);
2180 EVT Ty = Op.getValueType();
2181
2182 // Currently only support length 1 constraints.
2183 if (Constraint.length() != 1) {
2184 return;
2185 }
2186
2187 char ConstraintLetter = Constraint[0];
2188 switch (ConstraintLetter) {
2189 default:
2190 break;
2191 // Deal with integers first:
2192 case 'I':
2193 case 'J':
2194 case 'K':
2195 case 'L':
2196 case 'M':
2197 case 'N':
2198 case 'O':
2199 case 'P':
2200 case 'R': {
2201 const ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op);
2202 if (!C) {
2203 return;
2204 }
2205
2206 int64_t CVal64 = C->getSExtValue();
2207 uint64_t CUVal64 = C->getZExtValue();
2208 switch (ConstraintLetter) {
2209 case 'I': // 0..63
2210 if (!isUInt<6>(CUVal64))
2211 return;
2212 Result = DAG.getTargetConstant(CUVal64, DL, Ty);
2213 break;
2214 case 'J': // -63..0
2215 if (CVal64 < -63 || CVal64 > 0)
2216 return;
2217 Result = DAG.getTargetConstant(CVal64, DL, Ty);
2218 break;
2219 case 'K': // 2
2220 if (CUVal64 != 2)
2221 return;
2222 Result = DAG.getTargetConstant(CUVal64, DL, Ty);
2223 break;
2224 case 'L': // 0
2225 if (CUVal64 != 0)
2226 return;
2227 Result = DAG.getTargetConstant(CUVal64, DL, Ty);
2228 break;
2229 case 'M': // 0..255
2230 if (!isUInt<8>(CUVal64))
2231 return;
2232 // i8 type may be printed as a negative number,
2233 // e.g. 254 would be printed as -2,
2234 // so we force it to i16 at least.
2235 if (Ty.getSimpleVT() == MVT::i8) {
2236 Ty = MVT::i16;
2237 }
2238 Result = DAG.getTargetConstant(CUVal64, DL, Ty);
2239 break;
2240 case 'N': // -1
2241 if (CVal64 != -1)
2242 return;
2243 Result = DAG.getTargetConstant(CVal64, DL, Ty);
2244 break;
2245 case 'O': // 8, 16, 24
2246 if (CUVal64 != 8 && CUVal64 != 16 && CUVal64 != 24)
2247 return;
2248 Result = DAG.getTargetConstant(CUVal64, DL, Ty);
2249 break;
2250 case 'P': // 1
2251 if (CUVal64 != 1)
2252 return;
2253 Result = DAG.getTargetConstant(CUVal64, DL, Ty);
2254 break;
2255 case 'R': // -6..5
2256 if (CVal64 < -6 || CVal64 > 5)
2257 return;
2258 Result = DAG.getTargetConstant(CVal64, DL, Ty);
2259 break;
2260 }
2261
2262 break;
2263 }
2264 case 'G':
2265 const ConstantFPSDNode *FC = dyn_cast<ConstantFPSDNode>(Op);
2266 if (!FC || !FC->isZero())
2267 return;
2268 // Soften float to i8 0
2269 Result = DAG.getTargetConstant(0, DL, MVT::i8);
2270 break;
2271 }
2272
2273 if (Result.getNode()) {
2274 Ops.push_back(Result);
2275 return;
2276 }
2277
2278 return TargetLowering::LowerAsmOperandForConstraint(Op, Constraint, Ops, DAG);
2279 }
2280
getRegisterByName(const char * RegName,LLT VT,const MachineFunction & MF) const2281 Register AVRTargetLowering::getRegisterByName(const char *RegName, LLT VT,
2282 const MachineFunction &MF) const {
2283 Register Reg;
2284
2285 if (VT == LLT::scalar(8)) {
2286 Reg = StringSwitch<unsigned>(RegName)
2287 .Case("r0", AVR::R0)
2288 .Case("r1", AVR::R1)
2289 .Default(0);
2290 } else {
2291 Reg = StringSwitch<unsigned>(RegName)
2292 .Case("r0", AVR::R1R0)
2293 .Case("sp", AVR::SP)
2294 .Default(0);
2295 }
2296
2297 if (Reg)
2298 return Reg;
2299
2300 report_fatal_error(
2301 Twine("Invalid register name \"" + StringRef(RegName) + "\"."));
2302 }
2303
2304 } // end of namespace llvm
2305