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