xref: /llvm-project/llvm/lib/Target/M68k/M68kInstrCompiler.td (revision 6bf22ae4d31c8ae6171cbcdfee488136257d341f)
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