1*6bf22ae4SJim Lin//===-- M68kInstrCompiler.td - Pseudos and Patterns --------*- tablegen -*-===// 2bec7b166SMin-Yih Hsu// 3bec7b166SMin-Yih Hsu// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4bec7b166SMin-Yih Hsu// See https://llvm.org/LICENSE.txt for license information. 5bec7b166SMin-Yih Hsu// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6bec7b166SMin-Yih Hsu// 7bec7b166SMin-Yih Hsu//===----------------------------------------------------------------------===// 8bec7b166SMin-Yih Hsu/// 9bec7b166SMin-Yih Hsu/// \file 10bec7b166SMin-Yih Hsu/// This file describes the various pseudo instructions used by the compiler, 11bec7b166SMin-Yih Hsu/// as well as Pat patterns used during instruction selection. 12bec7b166SMin-Yih Hsu/// 13bec7b166SMin-Yih Hsu//===----------------------------------------------------------------------===// 14bec7b166SMin-Yih Hsu 15bec7b166SMin-Yih Hsu//===----------------------------------------------------------------------===// 16bec7b166SMin-Yih Hsu// ConstantPool, GlobalAddress, ExternalSymbol, and JumpTable 17bec7b166SMin-Yih Hsu//===----------------------------------------------------------------------===// 18bec7b166SMin-Yih Hsu 19bec7b166SMin-Yih Hsudef : Pat<(i32 (MxWrapper tconstpool :$src)), (MOV32ri tconstpool :$src)>; 20bec7b166SMin-Yih Hsudef : Pat<(i32 (MxWrapper tglobaladdr :$src)), (MOV32ri tglobaladdr :$src)>; 21bec7b166SMin-Yih Hsudef : Pat<(i32 (MxWrapper texternalsym :$src)), (MOV32ri texternalsym :$src)>; 22bec7b166SMin-Yih Hsudef : Pat<(i32 (MxWrapper tjumptable :$src)), (MOV32ri tjumptable :$src)>; 23bec7b166SMin-Yih Hsudef : Pat<(i32 (MxWrapper tblockaddress :$src)), (MOV32ri tblockaddress :$src)>; 24bec7b166SMin-Yih Hsu 25bec7b166SMin-Yih Hsudef : Pat<(add MxDRD32:$src, (MxWrapper tconstpool:$opd)), 26657bb726SMin-Yih Hsu (ADD32di MxDRD32:$src, tconstpool:$opd)>; 27bec7b166SMin-Yih Hsudef : Pat<(add MxARD32:$src, (MxWrapper tjumptable:$opd)), 28657bb726SMin-Yih Hsu (ADD32ai MxARD32:$src, tjumptable:$opd)>; 29bec7b166SMin-Yih Hsudef : Pat<(add MxARD32:$src, (MxWrapper tglobaladdr :$opd)), 30657bb726SMin-Yih Hsu (ADD32ai MxARD32:$src, tglobaladdr:$opd)>; 31bec7b166SMin-Yih Hsudef : Pat<(add MxARD32:$src, (MxWrapper texternalsym:$opd)), 32657bb726SMin-Yih Hsu (ADD32ai MxARD32:$src, texternalsym:$opd)>; 33bec7b166SMin-Yih Hsudef : Pat<(add MxARD32:$src, (MxWrapper tblockaddress:$opd)), 34657bb726SMin-Yih Hsu (ADD32ai MxARD32:$src, tblockaddress:$opd)>; 35bec7b166SMin-Yih Hsu 36bec7b166SMin-Yih Hsudef : Pat<(store (i32 (MxWrapper tglobaladdr:$src)), iPTR:$dst), 37bec7b166SMin-Yih Hsu (MOV32ji MxARI32:$dst, tglobaladdr:$src)>; 38bec7b166SMin-Yih Hsudef : Pat<(store (i32 (MxWrapper texternalsym:$src)), iPTR:$dst), 39bec7b166SMin-Yih Hsu (MOV32ji MxARI32:$dst, texternalsym:$src)>; 40bec7b166SMin-Yih Hsudef : Pat<(store (i32 (MxWrapper tblockaddress:$src)), iPTR:$dst), 41bec7b166SMin-Yih Hsu (MOV32ji MxARI32:$dst, tblockaddress:$src)>; 42bec7b166SMin-Yih Hsu 43bec7b166SMin-Yih Hsudef : Pat<(i32 (MxWrapperPC tconstpool :$src)), (LEA32q tconstpool :$src)>; 44bec7b166SMin-Yih Hsudef : Pat<(i32 (MxWrapperPC tglobaladdr :$src)), (LEA32q tglobaladdr :$src)>; 45bec7b166SMin-Yih Hsudef : Pat<(i32 (MxWrapperPC texternalsym :$src)), (LEA32q texternalsym :$src)>; 46bec7b166SMin-Yih Hsudef : Pat<(i32 (MxWrapperPC tjumptable :$src)), (LEA32q tjumptable :$src)>; 47bec7b166SMin-Yih Hsudef : Pat<(i32 (MxWrapperPC tblockaddress :$src)), (LEA32q tblockaddress :$src)>; 48bec7b166SMin-Yih Hsu 49bec7b166SMin-Yih Hsu 50bec7b166SMin-Yih Hsu//===----------------------------------------------------------------------===// 51bec7b166SMin-Yih Hsu// Conditional Move Pseudo Instructions 52bec7b166SMin-Yih Hsu// 53bec7b166SMin-Yih Hsu// CMOV* - Used to implement the SELECT DAG operation. Expanded after 54bec7b166SMin-Yih Hsu// instruction selection into a branch sequence. 55bec7b166SMin-Yih Hsu//===----------------------------------------------------------------------===// 56bec7b166SMin-Yih Hsu 57bec7b166SMin-Yih Hsulet usesCustomInserter = 1, Uses = [CCR] in 58bec7b166SMin-Yih Hsuclass MxCMove<MxType TYPE> 59bec7b166SMin-Yih Hsu : MxPseudo<(outs TYPE.ROp:$dst), (ins TYPE.ROp:$t, TYPE.ROp:$f, i8imm:$cond), 60bec7b166SMin-Yih Hsu [(set TYPE.VT:$dst, 61bec7b166SMin-Yih Hsu (TYPE.VT (MxCmov TYPE.VT:$t, TYPE.VT:$f, imm:$cond, CCR)))]>; 62bec7b166SMin-Yih Hsu 63bec7b166SMin-Yih Hsudef CMOV8d : MxCMove<MxType8d>; 64bec7b166SMin-Yih Hsudef CMOV16d : MxCMove<MxType16d>; 65bec7b166SMin-Yih Hsudef CMOV32r : MxCMove<MxType32r>; 66bec7b166SMin-Yih Hsu 67bec7b166SMin-Yih Hsu 68bec7b166SMin-Yih Hsu//===----------------------------------------------------------------------===// 69bec7b166SMin-Yih Hsu// Calls 70bec7b166SMin-Yih Hsu//===----------------------------------------------------------------------===// 71bec7b166SMin-Yih Hsu 72bec7b166SMin-Yih Hsu// ADJCALLSTACKDOWN/UP implicitly use/def %SP because they may be expanded into 73bec7b166SMin-Yih Hsu// a stack adjustment and the codegen must know that they may modify the stack 74bec7b166SMin-Yih Hsu// pointer before prolog-epilog rewriting occurs. 75bec7b166SMin-Yih Hsu// Pessimistically assume ADJCALLSTACKDOWN / ADJCALLSTACKUP will become 76bec7b166SMin-Yih Hsu// sub / add which can clobber CCR. 77bec7b166SMin-Yih Hsulet Defs = [SP, CCR], Uses = [SP] in { 78bec7b166SMin-Yih Hsu 79bec7b166SMin-Yih Hsu def ADJCALLSTACKDOWN 802416f243SRicky Taylor : MxPseudo<(outs), (ins i32imm:$amt1, i32imm:$amt2), 81bec7b166SMin-Yih Hsu [(MxCallSeqStart timm:$amt1, timm:$amt2)]>; 82bec7b166SMin-Yih Hsu 83bec7b166SMin-Yih Hsu def ADJCALLSTACKUP 842416f243SRicky Taylor : MxPseudo<(outs), (ins i32imm:$amt1, i32imm:$amt2), 85bec7b166SMin-Yih Hsu [(MxCallSeqEnd timm:$amt1, timm:$amt2)]>; 86bec7b166SMin-Yih Hsu 87bec7b166SMin-Yih Hsu} // Defs 88bec7b166SMin-Yih Hsu 89bec7b166SMin-Yih Hsu//===----------------------------------------------------------------------===// 90bec7b166SMin-Yih Hsu// Tail Call 91bec7b166SMin-Yih Hsu//===----------------------------------------------------------------------===// 92bec7b166SMin-Yih Hsu 93bec7b166SMin-Yih Hsu// Tailcall stuff. The TCRETURN instructions execute after the epilog, so they 94bec7b166SMin-Yih Hsu// can never use callee-saved registers. That is the purpose of the XR32_TC 95bec7b166SMin-Yih Hsu// register classes. 96bec7b166SMin-Yih Hsu 97bec7b166SMin-Yih Hsu// FIXME TC is disabled for PIC mode because the global base 98bec7b166SMin-Yih Hsu// register which is part of the address mode may be assigned a 99bec7b166SMin-Yih Hsu// callee-saved register. 100bec7b166SMin-Yih Hsudef : Pat<(MxTCRet (load MxCP_ARII:$dst), imm:$adj), 101bec7b166SMin-Yih Hsu (TCRETURNj (MOV32af_TC MxARII32:$dst), imm:$adj)>, 102bec7b166SMin-Yih Hsu Requires<[IsNotPIC]>; 103bec7b166SMin-Yih Hsu 104bec7b166SMin-Yih Hsudef : Pat<(MxTCRet AR32_TC:$dst, imm:$adj), 105bec7b166SMin-Yih Hsu (TCRETURNj MxARI32_TC:$dst, imm:$adj)>; 106bec7b166SMin-Yih Hsu 107bec7b166SMin-Yih Hsudef : Pat<(MxTCRet (i32 tglobaladdr:$dst), imm:$adj), 108bec7b166SMin-Yih Hsu (TCRETURNq MxPCD32:$dst, imm:$adj)>; 109bec7b166SMin-Yih Hsu 110bec7b166SMin-Yih Hsudef : Pat<(MxTCRet (i32 texternalsym:$dst), imm:$adj), 111bec7b166SMin-Yih Hsu (TCRETURNq MxPCD32:$dst, imm:$adj)>; 112bec7b166SMin-Yih Hsu 113bec7b166SMin-Yih Hsu 114bec7b166SMin-Yih Hsu//===----------------------------------------------------------------------===// 115bec7b166SMin-Yih Hsu// Segmented Stack 116bec7b166SMin-Yih Hsu// 117bec7b166SMin-Yih Hsu// When using segmented stacks these are lowered into instructions which first 118bec7b166SMin-Yih Hsu// check if the current stacklet has enough free memory. If it does, memory is 119bec7b166SMin-Yih Hsu// allocated by bumping the stack pointer. Otherwise memory is allocated from 120bec7b166SMin-Yih Hsu// the heap. 121bec7b166SMin-Yih Hsu//===----------------------------------------------------------------------===// 122bec7b166SMin-Yih Hsu 123bec7b166SMin-Yih Hsulet Defs = [SP, CCR], Uses = [SP] in 124bec7b166SMin-Yih Hsulet usesCustomInserter = 1 in 125bec7b166SMin-Yih Hsudef SALLOCA : MxPseudo<(outs MxARD32:$dst), (ins MxARD32:$size), 126bec7b166SMin-Yih Hsu [(set iPTR:$dst, (MxSegAlloca iPTR:$size))]>; 127