blob: 67d71e48db6711699fb26decac2b0ef0d5ef6425 [file] [log] [blame]
Duraid Madina91ed0a12005-03-17 18:17:03 +00001//===- IA64InstrInfo.td - Describe the IA64 Instruction Set -----*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by Duraid Madina and is distributed under the
6// University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file describes the IA64 instruction set, defining the instructions, and
11// properties of the instructions which are needed for code generation, machine
12// code emission, and analysis.
13//
14//===----------------------------------------------------------------------===//
15
16include "IA64InstrFormats.td"
17
Duraid Madinaa8de8a52005-12-22 06:38:38 +000018//===----------------------------------------------------------------------===//
19// IA-64 specific DAG Nodes.
20//
21
22def IA64getfd : SDNode<"IA64ISD::GETFD", SDTFPToIntOp, []>;
23
Duraid Madinaf54c9392006-01-20 20:24:31 +000024def SDT_IA64RetFlag : SDTypeProfile<0, 0, []>;
25def retflag : SDNode<"IA64ISD::RET_FLAG", SDT_IA64RetFlag,
26 [SDNPHasChain, SDNPOptInFlag]>;
27
Duraid Madinaa8de8a52005-12-22 06:38:38 +000028//===---------
29
Duraid Madinac252f332005-10-29 04:13:40 +000030def u2imm : Operand<i8>;
Duraid Madina91ed0a12005-03-17 18:17:03 +000031def u6imm : Operand<i8>;
Duraid Madinab484f7c2005-04-07 12:32:24 +000032def s8imm : Operand<i8> {
33 let PrintMethod = "printS8ImmOperand";
34}
Duraid Madinaf221c262005-10-28 17:46:35 +000035def s14imm : Operand<i64> {
Duraid Madinab484f7c2005-04-07 12:32:24 +000036 let PrintMethod = "printS14ImmOperand";
37}
Duraid Madinaa743e002005-12-22 03:56:03 +000038def s22imm : Operand<i64> {
Duraid Madinafb43ef72005-04-11 05:55:56 +000039 let PrintMethod = "printS22ImmOperand";
Duraid Madina91ed0a12005-03-17 18:17:03 +000040}
41def u64imm : Operand<i64> {
42 let PrintMethod = "printU64ImmOperand";
43}
Duraid Madina0a7c2b92005-04-14 10:08:01 +000044def s64imm : Operand<i64> {
45 let PrintMethod = "printS64ImmOperand";
46}
Duraid Madina91ed0a12005-03-17 18:17:03 +000047
Duraid Madinaf221c262005-10-28 17:46:35 +000048let PrintMethod = "printGlobalOperand" in
49 def globaladdress : Operand<i64>;
50
Duraid Madina91ed0a12005-03-17 18:17:03 +000051// the asmprinter needs to know about calls
52let PrintMethod = "printCallOperand" in
53 def calltarget : Operand<i64>;
54
Duraid Madinaf221c262005-10-28 17:46:35 +000055/* new daggy action!!! */
56
Duraid Madinac252f332005-10-29 04:13:40 +000057def is32ones : PatLeaf<(i64 imm), [{
58 // is32ones predicate - True if the immediate is 0x00000000FFFFFFFF
59 // Used to create ZXT4s appropriately
Duraid Madina7abaf902005-10-29 16:08:30 +000060 uint64_t v = (uint64_t)N->getValue();
Duraid Madinac252f332005-10-29 04:13:40 +000061 return (v == 0x00000000FFFFFFFFLL);
62}]>;
63
Duraid Madina7abaf902005-10-29 16:08:30 +000064// isMIXable predicates - True if the immediate is
65// 0xFF00FF00FF00FF00, 0x00FF00FF00FF00FF
66// etc, through 0x00000000FFFFFFFF
67// Used to test for the suitability of mix*
68def isMIX1Lable: PatLeaf<(i64 imm), [{
69 return((uint64_t)N->getValue()==0xFF00FF00FF00FF00LL);
70}]>;
71def isMIX1Rable: PatLeaf<(i64 imm), [{
72 return((uint64_t)N->getValue()==0x00FF00FF00FF00FFLL);
73}]>;
74def isMIX2Lable: PatLeaf<(i64 imm), [{
75 return((uint64_t)N->getValue()==0xFFFF0000FFFF0000LL);
76}]>;
77def isMIX2Rable: PatLeaf<(i64 imm), [{
78 return((uint64_t)N->getValue()==0x0000FFFF0000FFFFLL);
79}]>;
80def isMIX4Lable: PatLeaf<(i64 imm), [{
81 return((uint64_t)N->getValue()==0xFFFFFFFF00000000LL);
82}]>;
83def isMIX4Rable: PatLeaf<(i64 imm), [{
84 return((uint64_t)N->getValue()==0x00000000FFFFFFFFLL);
85}]>;
86
Duraid Madinac252f332005-10-29 04:13:40 +000087def isSHLADDimm: PatLeaf<(i64 imm), [{
88 // isSHLADDimm predicate - True if the immediate is exactly 1, 2, 3 or 4
89 // - 0 is *not* okay.
90 // Used to create shladd instructions appropriately
91 int64_t v = (int64_t)N->getValue();
92 return (v >= 1 && v <= 4);
93}]>;
94
Duraid Madinaf221c262005-10-28 17:46:35 +000095def immSExt14 : PatLeaf<(i64 imm), [{
96 // immSExt14 predicate - True if the immediate fits in a 14-bit sign extended
97 // field. Used by instructions like 'adds'.
98 int64_t v = (int64_t)N->getValue();
99 return (v <= 8191 && v >= -8192);
100}]>;
101
102def imm64 : PatLeaf<(i64 imm), [{
103 // imm64 predicate - True if the immediate fits in a 64-bit
104 // field - i.e., true. used to keep movl happy
105 return true;
106}]>;
107
Duraid Madinaa284b662005-11-01 01:29:55 +0000108def ADD : AForm_DAG<0x03, 0x0b, (ops GR:$dst, GR:$src1, GR:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000109 "add $dst = $src1, $src2",
Duraid Madinaa284b662005-11-01 01:29:55 +0000110 [(set GR:$dst, (add GR:$src1, GR:$src2))]>;
111
112def ADD1 : AForm_DAG<0x03, 0x0b, (ops GR:$dst, GR:$src1, GR:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000113 "add $dst = $src1, $src2, 1",
Duraid Madinaa284b662005-11-01 01:29:55 +0000114 [(set GR:$dst, (add (add GR:$src1, GR:$src2), 1))]>;
115
116def ADDS : AForm_DAG<0x03, 0x0b, (ops GR:$dst, GR:$src1, s14imm:$imm),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000117 "adds $dst = $imm, $src1",
Duraid Madinaa284b662005-11-01 01:29:55 +0000118 [(set GR:$dst, (add GR:$src1, immSExt14:$imm))]>;
119
120def MOVL : AForm_DAG<0x03, 0x0b, (ops GR:$dst, s64imm:$imm),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000121 "movl $dst = $imm",
Duraid Madinaa284b662005-11-01 01:29:55 +0000122 [(set GR:$dst, imm64:$imm)]>;
123
124def ADDL_GA : AForm_DAG<0x03, 0x0b, (ops GR:$dst, GR:$src1, globaladdress:$imm),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000125 "addl $dst = $imm, $src1",
Duraid Madinaa284b662005-11-01 01:29:55 +0000126 []>;
Duraid Madinaa743e002005-12-22 03:56:03 +0000127
128// hmm
129def ADDL_EA : AForm_DAG<0x03, 0x0b, (ops GR:$dst, GR:$src1, calltarget:$imm),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000130 "addl $dst = $imm, $src1",
Duraid Madinaa743e002005-12-22 03:56:03 +0000131 []>;
132
Duraid Madinaa284b662005-11-01 01:29:55 +0000133def SUB : AForm_DAG<0x03, 0x0b, (ops GR:$dst, GR:$src1, GR:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000134 "sub $dst = $src1, $src2",
Duraid Madinaa284b662005-11-01 01:29:55 +0000135 [(set GR:$dst, (sub GR:$src1, GR:$src2))]>;
136
137def SUB1 : AForm_DAG<0x03, 0x0b, (ops GR:$dst, GR:$src1, GR:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000138 "sub $dst = $src1, $src2, 1",
Duraid Madinaa284b662005-11-01 01:29:55 +0000139 [(set GR:$dst, (add (sub GR: $src1, GR:$src2), -1))]>;
140
141let isTwoAddress = 1 in {
142def TPCADDIMM22 : AForm<0x03, 0x0b,
143 (ops GR:$dst, GR:$src1, s22imm:$imm, PR:$qp),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000144 "($qp) add $dst = $imm, $dst">;
Duraid Madina9a8fb202006-01-20 03:40:25 +0000145def TPCADDS : AForm_DAG<0x03, 0x0b,
Duraid Madina550d8ec2006-01-19 15:18:56 +0000146 (ops GR:$dst, GR:$src1, s14imm:$imm, PR:$qp),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000147 "($qp) adds $dst = $imm, $dst",
Duraid Madina9a8fb202006-01-20 03:40:25 +0000148 []>;
Duraid Madinaa284b662005-11-01 01:29:55 +0000149def TPCMPIMM8NE : AForm<0x03, 0x0b,
150 (ops PR:$dst, PR:$src1, s22imm:$imm, GR:$src2, PR:$qp),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000151 "($qp) cmp.ne $dst , p0 = $imm, $src2">;
Duraid Madinaa284b662005-11-01 01:29:55 +0000152}
153
154// zero extend a bool (predicate reg) into an integer reg
155def ZXTb : Pat<(zext PR:$src),
156 (TPCADDIMM22 (ADDS r0, 0), 1, PR:$src)>;
157
158// normal sign/zero-extends
Duraid Madina5ea06a92006-01-25 02:23:38 +0000159def SXT1 : AForm_DAG<0x03, 0x0b, (ops GR:$dst, GR:$src), "sxt1 $dst = $src",
Duraid Madinac252f332005-10-29 04:13:40 +0000160 [(set GR:$dst, (sext_inreg GR:$src, i8))]>;
Duraid Madina5ea06a92006-01-25 02:23:38 +0000161def ZXT1 : AForm_DAG<0x03, 0x0b, (ops GR:$dst, GR:$src), "zxt1 $dst = $src",
Duraid Madinac252f332005-10-29 04:13:40 +0000162 [(set GR:$dst, (and GR:$src, 255))]>;
Duraid Madina5ea06a92006-01-25 02:23:38 +0000163def SXT2 : AForm_DAG<0x03, 0x0b, (ops GR:$dst, GR:$src), "sxt2 $dst = $src",
Duraid Madinac252f332005-10-29 04:13:40 +0000164 [(set GR:$dst, (sext_inreg GR:$src, i16))]>;
Duraid Madina5ea06a92006-01-25 02:23:38 +0000165def ZXT2 : AForm_DAG<0x03, 0x0b, (ops GR:$dst, GR:$src), "zxt2 $dst = $src",
Duraid Madinac252f332005-10-29 04:13:40 +0000166 [(set GR:$dst, (and GR:$src, 65535))]>;
Duraid Madina5ea06a92006-01-25 02:23:38 +0000167def SXT4 : AForm_DAG<0x03, 0x0b, (ops GR:$dst, GR:$src), "sxt4 $dst = $src",
Duraid Madinac252f332005-10-29 04:13:40 +0000168 [(set GR:$dst, (sext_inreg GR:$src, i32))]>;
Duraid Madina5ea06a92006-01-25 02:23:38 +0000169def ZXT4 : AForm_DAG<0x03, 0x0b, (ops GR:$dst, GR:$src), "zxt4 $dst = $src",
Duraid Madinac252f332005-10-29 04:13:40 +0000170 [(set GR:$dst, (and GR:$src, is32ones))]>;
171
Duraid Madina7abaf902005-10-29 16:08:30 +0000172// fixme: shrs vs shru?
173def MIX1L : AForm_DAG<0x03, 0x0b, (ops GR:$dst, GR:$src1, GR:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000174 "mix1.l $dst = $src1, $src2",
Duraid Madina7abaf902005-10-29 16:08:30 +0000175 [(set GR:$dst, (or (and GR:$src1, isMIX1Lable),
Chris Lattnerc54cddd2005-12-05 02:34:29 +0000176 (and (srl GR:$src2, (i64 8)), isMIX1Lable)))]>;
Duraid Madina7abaf902005-10-29 16:08:30 +0000177
178def MIX2L : AForm_DAG<0x03, 0x0b, (ops GR:$dst, GR:$src1, GR:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000179 "mix2.l $dst = $src1, $src2",
Duraid Madina7abaf902005-10-29 16:08:30 +0000180 [(set GR:$dst, (or (and GR:$src1, isMIX2Lable),
Chris Lattnerc54cddd2005-12-05 02:34:29 +0000181 (and (srl GR:$src2, (i64 16)), isMIX2Lable)))]>;
Duraid Madina7abaf902005-10-29 16:08:30 +0000182
183def MIX4L : AForm_DAG<0x03, 0x0b, (ops GR:$dst, GR:$src1, GR:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000184 "mix4.l $dst = $src1, $src2",
Duraid Madina7abaf902005-10-29 16:08:30 +0000185 [(set GR:$dst, (or (and GR:$src1, isMIX4Lable),
Chris Lattnerc54cddd2005-12-05 02:34:29 +0000186 (and (srl GR:$src2, (i64 32)), isMIX4Lable)))]>;
Duraid Madina7abaf902005-10-29 16:08:30 +0000187
188def MIX1R : AForm_DAG<0x03, 0x0b, (ops GR:$dst, GR:$src1, GR:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000189 "mix1.r $dst = $src1, $src2",
Chris Lattnerc54cddd2005-12-05 02:34:29 +0000190 [(set GR:$dst, (or (and (shl GR:$src1, (i64 8)), isMIX1Rable),
Duraid Madina7abaf902005-10-29 16:08:30 +0000191 (and GR:$src2, isMIX1Rable)))]>;
192
193def MIX2R : AForm_DAG<0x03, 0x0b, (ops GR:$dst, GR:$src1, GR:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000194 "mix2.r $dst = $src1, $src2",
Chris Lattnerc54cddd2005-12-05 02:34:29 +0000195 [(set GR:$dst, (or (and (shl GR:$src1, (i64 16)), isMIX2Rable),
Duraid Madina7abaf902005-10-29 16:08:30 +0000196 (and GR:$src2, isMIX2Rable)))]>;
197
198def MIX4R : AForm_DAG<0x03, 0x0b, (ops GR:$dst, GR:$src1, GR:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000199 "mix4.r $dst = $src1, $src2",
Chris Lattnerc54cddd2005-12-05 02:34:29 +0000200 [(set GR:$dst, (or (and (shl GR:$src1, (i64 32)), isMIX4Rable),
Duraid Madina7abaf902005-10-29 16:08:30 +0000201 (and GR:$src2, isMIX4Rable)))]>;
202
Duraid Madinaf221c262005-10-28 17:46:35 +0000203def GETFSIGD : AForm_DAG<0x03, 0x0b, (ops GR:$dst, FP:$src),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000204 "getf.sig $dst = $src",
Duraid Madinaf221c262005-10-28 17:46:35 +0000205 []>;
206
207def SETFSIGD : AForm_DAG<0x03, 0x0b, (ops FP:$dst, GR:$src),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000208 "setf.sig $dst = $src",
Duraid Madinaf221c262005-10-28 17:46:35 +0000209 []>;
210
211def XMALD : AForm_DAG<0x03, 0x0b, (ops FP:$dst, FP:$src1, FP:$src2, FP:$src3),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000212 "xma.l $dst = $src1, $src2, $src3",
Duraid Madinaf221c262005-10-28 17:46:35 +0000213 []>;
Duraid Madina7abaf902005-10-29 16:08:30 +0000214def XMAHD : AForm_DAG<0x03, 0x0b, (ops FP:$dst, FP:$src1, FP:$src2, FP:$src3),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000215 "xma.h $dst = $src1, $src2, $src3",
Duraid Madina7abaf902005-10-29 16:08:30 +0000216 []>;
217def XMAHUD : AForm_DAG<0x03, 0x0b, (ops FP:$dst, FP:$src1, FP:$src2, FP:$src3),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000218 "xma.hu $dst = $src1, $src2, $src3",
Duraid Madina7abaf902005-10-29 16:08:30 +0000219 []>;
Duraid Madinaf221c262005-10-28 17:46:35 +0000220
221// pseudocode for integer multiplication
222def : Pat<(mul GR:$src1, GR:$src2),
223 (GETFSIGD (XMALD (SETFSIGD GR:$src1), (SETFSIGD GR:$src2), F0))>;
Duraid Madina7abaf902005-10-29 16:08:30 +0000224def : Pat<(mulhs GR:$src1, GR:$src2),
225 (GETFSIGD (XMAHD (SETFSIGD GR:$src1), (SETFSIGD GR:$src2), F0))>;
226def : Pat<(mulhu GR:$src1, GR:$src2),
227 (GETFSIGD (XMAHUD (SETFSIGD GR:$src1), (SETFSIGD GR:$src2), F0))>;
Duraid Madinaf221c262005-10-28 17:46:35 +0000228
229// TODO: addp4 (addp4 dst = src, r0 is a 32-bit add)
230// has imm form, too
231
232// def ADDS : AForm<0x03, 0x0b, (ops GR:$dst, GR:$src1, s14imm:$imm),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000233// "adds $dst = $imm, $src1">;
Duraid Madinaf221c262005-10-28 17:46:35 +0000234
Duraid Madinaf221c262005-10-28 17:46:35 +0000235def AND : AForm_DAG<0x03, 0x0b, (ops GR:$dst, GR:$src1, GR:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000236 "and $dst = $src1, $src2",
Duraid Madinaf221c262005-10-28 17:46:35 +0000237 [(set GR:$dst, (and GR:$src1, GR:$src2))]>;
238def ANDCM : AForm_DAG<0x03, 0x0b, (ops GR:$dst, GR:$src1, GR:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000239 "andcm $dst = $src1, $src2",
Duraid Madinaf221c262005-10-28 17:46:35 +0000240 [(set GR:$dst, (and GR:$src1, (not GR:$src2)))]>;
241// TODO: and/andcm/or/xor/add/sub/shift immediate forms
242def OR : AForm_DAG<0x03, 0x0b, (ops GR:$dst, GR:$src1, GR:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000243 "or $dst = $src1, $src2",
Duraid Madinaf221c262005-10-28 17:46:35 +0000244 [(set GR:$dst, (or GR:$src1, GR:$src2))]>;
245
246def pOR : AForm<0x03, 0x0b, (ops GR:$dst, GR:$src1, GR:$src2, PR:$qp),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000247 "($qp) or $dst = $src1, $src2">;
Duraid Madinaf221c262005-10-28 17:46:35 +0000248
Duraid Madinaf221c262005-10-28 17:46:35 +0000249// the following are all a bit unfortunate: we throw away the complement
250// of the compare!
251def CMPEQ : AForm_DAG<0x03, 0x0b, (ops PR:$dst, GR:$src1, GR:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000252 "cmp.eq $dst, p0 = $src1, $src2",
Duraid Madinaf221c262005-10-28 17:46:35 +0000253 [(set PR:$dst, (seteq GR:$src1, GR:$src2))]>;
254def CMPGT : AForm_DAG<0x03, 0x0b, (ops PR:$dst, GR:$src1, GR:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000255 "cmp.gt $dst, p0 = $src1, $src2",
Duraid Madinaf221c262005-10-28 17:46:35 +0000256 [(set PR:$dst, (setgt GR:$src1, GR:$src2))]>;
257def CMPGE : AForm_DAG<0x03, 0x0b, (ops PR:$dst, GR:$src1, GR:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000258 "cmp.ge $dst, p0 = $src1, $src2",
Duraid Madinaf221c262005-10-28 17:46:35 +0000259 [(set PR:$dst, (setge GR:$src1, GR:$src2))]>;
260def CMPLT : AForm_DAG<0x03, 0x0b, (ops PR:$dst, GR:$src1, GR:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000261 "cmp.lt $dst, p0 = $src1, $src2",
Duraid Madinaf221c262005-10-28 17:46:35 +0000262 [(set PR:$dst, (setlt GR:$src1, GR:$src2))]>;
263def CMPLE : AForm_DAG<0x03, 0x0b, (ops PR:$dst, GR:$src1, GR:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000264 "cmp.le $dst, p0 = $src1, $src2",
Duraid Madinaf221c262005-10-28 17:46:35 +0000265 [(set PR:$dst, (setle GR:$src1, GR:$src2))]>;
266def CMPNE : AForm_DAG<0x03, 0x0b, (ops PR:$dst, GR:$src1, GR:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000267 "cmp.ne $dst, p0 = $src1, $src2",
Duraid Madinaf221c262005-10-28 17:46:35 +0000268 [(set PR:$dst, (setne GR:$src1, GR:$src2))]>;
269def CMPLTU: AForm_DAG<0x03, 0x0b, (ops PR:$dst, GR:$src1, GR:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000270 "cmp.ltu $dst, p0 = $src1, $src2",
Duraid Madinaf221c262005-10-28 17:46:35 +0000271 [(set PR:$dst, (setult GR:$src1, GR:$src2))]>;
272def CMPGTU: AForm_DAG<0x03, 0x0b, (ops PR:$dst, GR:$src1, GR:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000273 "cmp.gtu $dst, p0 = $src1, $src2",
Duraid Madinaf221c262005-10-28 17:46:35 +0000274 [(set PR:$dst, (setugt GR:$src1, GR:$src2))]>;
275def CMPLEU: AForm_DAG<0x03, 0x0b, (ops PR:$dst, GR:$src1, GR:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000276 "cmp.leu $dst, p0 = $src1, $src2",
Duraid Madinaf221c262005-10-28 17:46:35 +0000277 [(set PR:$dst, (setule GR:$src1, GR:$src2))]>;
278def CMPGEU: AForm_DAG<0x03, 0x0b, (ops PR:$dst, GR:$src1, GR:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000279 "cmp.geu $dst, p0 = $src1, $src2",
Duraid Madinaf221c262005-10-28 17:46:35 +0000280 [(set PR:$dst, (setuge GR:$src1, GR:$src2))]>;
281
Duraid Madina88fc69f2005-10-31 01:42:11 +0000282// and we do the whole thing again for FP compares!
283def FCMPEQ : AForm_DAG<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000284 "fcmp.eq $dst, p0 = $src1, $src2",
Duraid Madina88fc69f2005-10-31 01:42:11 +0000285 [(set PR:$dst, (seteq FP:$src1, FP:$src2))]>;
286def FCMPGT : AForm_DAG<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000287 "fcmp.gt $dst, p0 = $src1, $src2",
Duraid Madina88fc69f2005-10-31 01:42:11 +0000288 [(set PR:$dst, (setgt FP:$src1, FP:$src2))]>;
289def FCMPGE : AForm_DAG<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000290 "fcmp.ge $dst, p0 = $src1, $src2",
Duraid Madina88fc69f2005-10-31 01:42:11 +0000291 [(set PR:$dst, (setge FP:$src1, FP:$src2))]>;
292def FCMPLT : AForm_DAG<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000293 "fcmp.lt $dst, p0 = $src1, $src2",
Duraid Madina88fc69f2005-10-31 01:42:11 +0000294 [(set PR:$dst, (setlt FP:$src1, FP:$src2))]>;
295def FCMPLE : AForm_DAG<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000296 "fcmp.le $dst, p0 = $src1, $src2",
Duraid Madina88fc69f2005-10-31 01:42:11 +0000297 [(set PR:$dst, (setle FP:$src1, FP:$src2))]>;
298def FCMPNE : AForm_DAG<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000299 "fcmp.neq $dst, p0 = $src1, $src2",
Duraid Madina88fc69f2005-10-31 01:42:11 +0000300 [(set PR:$dst, (setne FP:$src1, FP:$src2))]>;
301def FCMPLTU: AForm_DAG<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000302 "fcmp.ltu $dst, p0 = $src1, $src2",
Duraid Madina88fc69f2005-10-31 01:42:11 +0000303 [(set PR:$dst, (setult FP:$src1, FP:$src2))]>;
304def FCMPGTU: AForm_DAG<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000305 "fcmp.gtu $dst, p0 = $src1, $src2",
Duraid Madina88fc69f2005-10-31 01:42:11 +0000306 [(set PR:$dst, (setugt FP:$src1, FP:$src2))]>;
307def FCMPLEU: AForm_DAG<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000308 "fcmp.leu $dst, p0 = $src1, $src2",
Duraid Madina88fc69f2005-10-31 01:42:11 +0000309 [(set PR:$dst, (setule FP:$src1, FP:$src2))]>;
310def FCMPGEU: AForm_DAG<0x03, 0x0b, (ops PR:$dst, FP:$src1, FP:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000311 "fcmp.geu $dst, p0 = $src1, $src2",
Duraid Madina88fc69f2005-10-31 01:42:11 +0000312 [(set PR:$dst, (setuge FP:$src1, FP:$src2))]>;
313
Duraid Madina7ac646e2005-11-04 00:57:56 +0000314def PCMPEQUNCR0R0 : AForm<0x03, 0x0b, (ops PR:$dst, PR:$qp),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000315 "($qp) cmp.eq.unc $dst, p0 = r0, r0">;
Duraid Madina7ac646e2005-11-04 00:57:56 +0000316
317def : Pat<(trunc GR:$src), // truncate i64 to i1
318 (CMPNE GR:$src, r0)>; // $src!=0? If so, PR:$dst=true
319
320let isTwoAddress=1 in {
321 def TPCMPEQR0R0 : AForm<0x03, 0x0b, (ops PR:$dst, PR:$bogus, PR:$qp),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000322 "($qp) cmp.eq $dst, p0 = r0, r0">;
Duraid Madina7ac646e2005-11-04 00:57:56 +0000323 def TPCMPNER0R0 : AForm<0x03, 0x0b, (ops PR:$dst, PR:$bogus, PR:$qp),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000324 "($qp) cmp.ne $dst, p0 = r0, r0">;
Duraid Madina7ac646e2005-11-04 00:57:56 +0000325}
326
327/* our pseudocode for OR on predicates is:
328pC = pA OR pB
329-------------
330(pA) cmp.eq.unc pC,p0 = r0,r0 // pC = pA
331 ;;
332(pB) cmp.eq pC,p0 = r0,r0 // if (pB) pC = 1 */
333
334def bOR : Pat<(or PR:$src1, PR:$src2),
335 (TPCMPEQR0R0 (PCMPEQUNCR0R0 PR:$src1), PR:$src2)>;
336
337/* our pseudocode for AND on predicates is:
338 *
339(pA) cmp.eq.unc pC,p0 = r0,r0 // pC = pA
340 cmp.eq pTemp,p0 = r0,r0 // pTemp = NOT pB
341 ;;
342(pB) cmp.ne pTemp,p0 = r0,r0
343 ;;
344(pTemp)cmp.ne pC,p0 = r0,r0 // if (NOT pB) pC = 0 */
345
346def bAND : Pat<(and PR:$src1, PR:$src2),
347 ( TPCMPNER0R0 (PCMPEQUNCR0R0 PR:$src1),
348 (TPCMPNER0R0 (CMPEQ r0, r0), PR:$src2) )>;
349
350/* one possible routine for XOR on predicates is:
351
352 // Compute px = py ^ pz
353 // using sum of products: px = (py & !pz) | (pz & !py)
354 // Uses 5 instructions in 3 cycles.
355 // cycle 1
356(pz) cmp.eq.unc px = r0, r0 // px = pz
357(py) cmp.eq.unc pt = r0, r0 // pt = py
358 ;;
359 // cycle 2
360(pt) cmp.ne.and px = r0, r0 // px = px & !pt (px = pz & !pt)
361(pz) cmp.ne.and pt = r0, r0 // pt = pt & !pz
362 ;;
363 } { .mmi
364 // cycle 3
365(pt) cmp.eq.or px = r0, r0 // px = px | pt
366
367*** Another, which we use here, requires one scratch GR. it is:
368
369 mov rt = 0 // initialize rt off critical path
370 ;;
371
372 // cycle 1
373(pz) cmp.eq.unc px = r0, r0 // px = pz
374(pz) mov rt = 1 // rt = pz
375 ;;
376 // cycle 2
377(py) cmp.ne px = 1, rt // if (py) px = !pz
378
379.. these routines kindly provided by Jim Hull
380*/
381
382def bXOR : Pat<(xor PR:$src1, PR:$src2),
383 (TPCMPIMM8NE (PCMPEQUNCR0R0 PR:$src2), 1,
Duraid Madina550d8ec2006-01-19 15:18:56 +0000384 (TPCADDS (ADDS r0, 0), 1, PR:$src2),
Duraid Madina7ac646e2005-11-04 00:57:56 +0000385 PR:$src1)>;
386
387def XOR : AForm_DAG<0x03, 0x0b, (ops GR:$dst, GR:$src1, GR:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000388 "xor $dst = $src1, $src2",
Duraid Madina7ac646e2005-11-04 00:57:56 +0000389 [(set GR:$dst, (xor GR:$src1, GR:$src2))]>;
390
391def SHLADD: AForm_DAG<0x03, 0x0b, (ops GR:$dst,GR:$src1,s64imm:$imm,GR:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000392 "shladd $dst = $src1, $imm, $src2",
Duraid Madina7ac646e2005-11-04 00:57:56 +0000393 [(set GR:$dst, (add GR:$src2, (shl GR:$src1, isSHLADDimm:$imm)))]>;
394
395def SHL : AForm_DAG<0x03, 0x0b, (ops GR:$dst, GR:$src1, GR:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000396 "shl $dst = $src1, $src2",
Duraid Madina7ac646e2005-11-04 00:57:56 +0000397 [(set GR:$dst, (shl GR:$src1, GR:$src2))]>;
398
399def SHRU : AForm_DAG<0x03, 0x0b, (ops GR:$dst, GR:$src1, GR:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000400 "shr.u $dst = $src1, $src2",
Duraid Madina7ac646e2005-11-04 00:57:56 +0000401 [(set GR:$dst, (srl GR:$src1, GR:$src2))]>;
402
403def SHRS : AForm_DAG<0x03, 0x0b, (ops GR:$dst, GR:$src1, GR:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000404 "shr $dst = $src1, $src2",
Duraid Madina7ac646e2005-11-04 00:57:56 +0000405 [(set GR:$dst, (sra GR:$src1, GR:$src2))]>;
406
Duraid Madina5ea06a92006-01-25 02:23:38 +0000407def MOV : AForm<0x03, 0x0b, (ops GR:$dst, GR:$src), "mov $dst = $src">;
Duraid Madina76034f92005-11-14 01:17:30 +0000408def FMOV : AForm<0x03, 0x0b, (ops FP:$dst, FP:$src),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000409 "mov $dst = $src">; // XXX: there _is_ no fmov
Duraid Madina17decbb2005-11-02 02:37:18 +0000410def PMOV : AForm<0x03, 0x0b, (ops GR:$dst, GR:$src, PR:$qp),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000411 "($qp) mov $dst = $src">;
Duraid Madina17decbb2005-11-02 02:37:18 +0000412
413def SPILL_ALL_PREDICATES_TO_GR : AForm<0x03, 0x0b, (ops GR:$dst),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000414 "mov $dst = pr">;
Duraid Madina17decbb2005-11-02 02:37:18 +0000415def FILL_ALL_PREDICATES_FROM_GR : AForm<0x03, 0x0b, (ops GR:$src),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000416 "mov pr = $src">;
Duraid Madina17decbb2005-11-02 02:37:18 +0000417
418let isTwoAddress = 1 in {
419 def CMOV : AForm<0x03, 0x0b, (ops GR:$dst, GR:$src2, GR:$src, PR:$qp),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000420 "($qp) mov $dst = $src">;
Duraid Madina17decbb2005-11-02 02:37:18 +0000421}
422
423def PFMOV : AForm<0x03, 0x0b, (ops FP:$dst, FP:$src, PR:$qp),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000424 "($qp) mov $dst = $src">;
Duraid Madina17decbb2005-11-02 02:37:18 +0000425
426let isTwoAddress = 1 in {
427 def CFMOV : AForm<0x03, 0x0b, (ops FP:$dst, FP:$src2, FP:$src, PR:$qp),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000428 "($qp) mov $dst = $src">;
Duraid Madina17decbb2005-11-02 02:37:18 +0000429}
430
Duraid Madina17decbb2005-11-02 02:37:18 +0000431def SELECTINT : Pat<(select PR:$which, GR:$src1, GR:$src2),
432 (CMOV (MOV GR:$src2), GR:$src1, PR:$which)>; // note order!
Duraid Madina76034f92005-11-14 01:17:30 +0000433def SELECTFP : Pat<(select PR:$which, FP:$src1, FP:$src2),
434 (CFMOV (FMOV FP:$src2), FP:$src1, PR:$which)>; // note order!
Duraid Madina0d5d08b2006-01-11 01:21:12 +0000435// TODO: can do this faster, w/o using any integer regs (see pattern isel)
Duraid Madinac712fd62006-01-11 01:38:07 +0000436def SELECTBOOL : Pat<(select PR:$which, PR:$src1, PR:$src2), // note order!
437 (CMPNE (CMOV
438 (MOV (TPCADDIMM22 (ADDS r0, 0), 1, PR:$src2)),
439 (TPCADDIMM22 (ADDS r0, 0), 1, PR:$src1), PR:$which), r0)>;
Duraid Madina17decbb2005-11-02 02:37:18 +0000440
441// load constants of various sizes // FIXME: prettyprint -ve constants
442def : Pat<(i64 immSExt14:$imm), (ADDS r0, immSExt14:$imm)>;
443def : Pat<(i64 imm64:$imm), (MOVL imm64:$imm)>;
Chris Lattner674660f2005-11-03 05:45:34 +0000444def : Pat<(i1 -1), (CMPEQ r0, r0)>; // TODO: this should just be a ref to p0
Duraid Madinaf0f22a52005-11-03 10:09:32 +0000445def : Pat<(i1 0), (CMPNE r0, r0)>; // TODO: any instruction actually *using*
446 // this predicate should be killed!
Duraid Madina17decbb2005-11-02 02:37:18 +0000447
Duraid Madinaf221c262005-10-28 17:46:35 +0000448// TODO: support postincrement (reg, imm9) loads+stores - this needs more
449// tablegen support
450
Chris Lattner3e0335c2005-08-19 00:47:42 +0000451def PHI : PseudoInstIA64<(ops variable_ops), "PHI">;
452def IDEF : PseudoInstIA64<(ops variable_ops), "// IDEF">;
Duraid Madina88fc69f2005-10-31 01:42:11 +0000453
454def IDEF_GR_D : PseudoInstIA64_DAG<(ops GR:$reg), "// $reg = IDEF",
455 [(set GR:$reg, (undef))]>;
456def IDEF_FP_D : PseudoInstIA64_DAG<(ops FP:$reg), "// $reg = IDEF",
457 [(set FP:$reg, (undef))]>;
458def IDEF_PR_D : PseudoInstIA64_DAG<(ops PR:$reg), "// $reg = IDEF",
459 [(set PR:$reg, (undef))]>;
460
Chris Lattner3e0335c2005-08-19 00:47:42 +0000461def IUSE : PseudoInstIA64<(ops variable_ops), "// IUSE">;
462def ADJUSTCALLSTACKUP : PseudoInstIA64<(ops variable_ops),
463 "// ADJUSTCALLSTACKUP">;
464def ADJUSTCALLSTACKDOWN : PseudoInstIA64<(ops variable_ops),
465 "// ADJUSTCALLSTACKDOWN">;
Chris Lattner9e4a4ee2005-09-14 21:11:13 +0000466def PSEUDO_ALLOC : PseudoInstIA64<(ops GR:$foo), "// PSEUDO_ALLOC">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000467
468def ALLOC : AForm<0x03, 0x0b,
469 (ops GR:$dst, i8imm:$inputs, i8imm:$locals, i8imm:$outputs, i8imm:$rotating),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000470 "alloc $dst = ar.pfs,$inputs,$locals,$outputs,$rotating">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000471
Duraid Madina91ed0a12005-03-17 18:17:03 +0000472let isTwoAddress = 1 in {
473 def TCMPNE : AForm<0x03, 0x0b,
474 (ops PR:$dst, PR:$src2, GR:$src3, GR:$src4),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000475 "cmp.ne $dst, p0 = $src3, $src4">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000476
477 def TPCMPEQOR : AForm<0x03, 0x0b,
478 (ops PR:$dst, PR:$src2, GR:$src3, GR:$src4, PR:$qp),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000479 "($qp) cmp.eq.or $dst, p0 = $src3, $src4">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000480
481 def TPCMPNE : AForm<0x03, 0x0b,
482 (ops PR:$dst, PR:$src2, GR:$src3, GR:$src4, PR:$qp),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000483 "($qp) cmp.ne $dst, p0 = $src3, $src4">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000484
485 def TPCMPEQ : AForm<0x03, 0x0b,
486 (ops PR:$dst, PR:$src2, GR:$src3, GR:$src4, PR:$qp),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000487 "($qp) cmp.eq $dst, p0 = $src3, $src4">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000488}
489
Duraid Madinafb43ef72005-04-11 05:55:56 +0000490def MOVSIMM14 : AForm<0x03, 0x0b, (ops GR:$dst, s14imm:$imm),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000491 "mov $dst = $imm">;
Duraid Madinafb43ef72005-04-11 05:55:56 +0000492def MOVSIMM22 : AForm<0x03, 0x0b, (ops GR:$dst, s22imm:$imm),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000493 "mov $dst = $imm">;
Duraid Madina0a7c2b92005-04-14 10:08:01 +0000494def MOVLIMM64 : AForm<0x03, 0x0b, (ops GR:$dst, s64imm:$imm),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000495 "movl $dst = $imm">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000496
Duraid Madinafb43ef72005-04-11 05:55:56 +0000497def SHLI : AForm<0x03, 0x0b, (ops GR:$dst, GR:$src1, u6imm:$imm),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000498 "shl $dst = $src1, $imm">;
Duraid Madinafb43ef72005-04-11 05:55:56 +0000499def SHRUI : AForm<0x03, 0x0b, (ops GR:$dst, GR:$src1, u6imm:$imm),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000500 "shr.u $dst = $src1, $imm">;
Duraid Madinafb43ef72005-04-11 05:55:56 +0000501def SHRSI : AForm<0x03, 0x0b, (ops GR:$dst, GR:$src1, u6imm:$imm),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000502 "shr $dst = $src1, $imm">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000503
Duraid Madinac090ac12006-01-26 09:08:31 +0000504def EXTRU : AForm<0x03, 0x0b,
505 (ops GR:$dst, GR:$src1, u6imm:$imm1, u6imm:$imm2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000506 "extr.u $dst = $src1, $imm1, $imm2">;
Duraid Madina41ff5022005-04-08 10:01:48 +0000507
Duraid Madinac090ac12006-01-26 09:08:31 +0000508def DEPZ : AForm<0x03, 0x0b,
509 (ops GR:$dst, GR:$src1, u6imm:$imm1, u6imm:$imm2),
510 "dep.z $dst = $src1, $imm1, $imm2">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000511
Duraid Madina91ed0a12005-03-17 18:17:03 +0000512def PCMPEQOR : AForm<0x03, 0x0b, (ops PR:$dst, GR:$src1, GR:$src2, PR:$qp),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000513 "($qp) cmp.eq.or $dst, p0 = $src1, $src2">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000514def PCMPEQUNC : AForm<0x03, 0x0b, (ops PR:$dst, GR:$src1, GR:$src2, PR:$qp),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000515 "($qp) cmp.eq.unc $dst, p0 = $src1, $src2">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000516def PCMPNE : AForm<0x03, 0x0b, (ops PR:$dst, GR:$src1, GR:$src2, PR:$qp),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000517 "($qp) cmp.ne $dst, p0 = $src1, $src2">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000518
519// two destinations!
520def BCMPEQ : AForm<0x03, 0x0b, (ops PR:$dst1, PR:$dst2, GR:$src1, GR:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000521 "cmp.eq $dst1, dst2 = $src1, $src2">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000522
Duraid Madinab484f7c2005-04-07 12:32:24 +0000523def ADDIMM14 : AForm<0x03, 0x0b, (ops GR:$dst, GR:$src1, s14imm:$imm),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000524 "adds $dst = $imm, $src1">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000525
Duraid Madinafb43ef72005-04-11 05:55:56 +0000526def ADDIMM22 : AForm<0x03, 0x0b, (ops GR:$dst, GR:$src1, s22imm:$imm),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000527 "add $dst = $imm, $src1">;
Duraid Madinafb43ef72005-04-11 05:55:56 +0000528def CADDIMM22 : AForm<0x03, 0x0b, (ops GR:$dst, GR:$src1, s22imm:$imm, PR:$qp),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000529 "($qp) add $dst = $imm, $src1">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000530
Duraid Madinab484f7c2005-04-07 12:32:24 +0000531def SUBIMM8 : AForm<0x03, 0x0b, (ops GR:$dst, s8imm:$imm, GR:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000532 "sub $dst = $imm, $src2">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000533
Evan Cheng14c53b42005-12-26 09:11:45 +0000534let isStore = 1, noResults = 1 in {
Duraid Madina7abaf902005-10-29 16:08:30 +0000535 def ST1 : AForm<0x03, 0x0b, (ops GR:$dstPtr, GR:$value),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000536 "st1 [$dstPtr] = $value">;
Duraid Madina7abaf902005-10-29 16:08:30 +0000537 def ST2 : AForm<0x03, 0x0b, (ops GR:$dstPtr, GR:$value),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000538 "st2 [$dstPtr] = $value">;
Duraid Madina7abaf902005-10-29 16:08:30 +0000539 def ST4 : AForm<0x03, 0x0b, (ops GR:$dstPtr, GR:$value),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000540 "st4 [$dstPtr] = $value">;
Duraid Madina7abaf902005-10-29 16:08:30 +0000541 def ST8 : AForm<0x03, 0x0b, (ops GR:$dstPtr, GR:$value),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000542 "st8 [$dstPtr] = $value">;
Duraid Madina7abaf902005-10-29 16:08:30 +0000543 def STF4 : AForm<0x03, 0x0b, (ops GR:$dstPtr, FP:$value),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000544 "stfs [$dstPtr] = $value">;
Duraid Madina7abaf902005-10-29 16:08:30 +0000545 def STF8 : AForm<0x03, 0x0b, (ops GR:$dstPtr, FP:$value),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000546 "stfd [$dstPtr] = $value">;
Duraid Madina266ff602006-01-17 02:04:52 +0000547 def STF_SPILL : AForm<0x03, 0x0b, (ops GR:$dstPtr, FP:$value),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000548 "stf.spill [$dstPtr] = $value">;
Duraid Madina7abaf902005-10-29 16:08:30 +0000549}
Duraid Madina91ed0a12005-03-17 18:17:03 +0000550
Duraid Madina7abaf902005-10-29 16:08:30 +0000551let isLoad = 1 in {
552 def LD1 : AForm<0x03, 0x0b, (ops GR:$dst, GR:$srcPtr),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000553 "ld1 $dst = [$srcPtr]">;
Duraid Madina7abaf902005-10-29 16:08:30 +0000554 def LD2 : AForm<0x03, 0x0b, (ops GR:$dst, GR:$srcPtr),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000555 "ld2 $dst = [$srcPtr]">;
Duraid Madina7abaf902005-10-29 16:08:30 +0000556 def LD4 : AForm<0x03, 0x0b, (ops GR:$dst, GR:$srcPtr),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000557 "ld4 $dst = [$srcPtr]">;
Duraid Madina7abaf902005-10-29 16:08:30 +0000558 def LD8 : AForm<0x03, 0x0b, (ops GR:$dst, GR:$srcPtr),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000559 "ld8 $dst = [$srcPtr]">;
Duraid Madina7abaf902005-10-29 16:08:30 +0000560 def LDF4 : AForm<0x03, 0x0b, (ops FP:$dst, GR:$srcPtr),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000561 "ldfs $dst = [$srcPtr]">;
Duraid Madina7abaf902005-10-29 16:08:30 +0000562 def LDF8 : AForm<0x03, 0x0b, (ops FP:$dst, GR:$srcPtr),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000563 "ldfd $dst = [$srcPtr]">;
Duraid Madina266ff602006-01-17 02:04:52 +0000564 def LDF_FILL : AForm<0x03, 0x0b, (ops FP:$dst, GR:$srcPtr),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000565 "ldf.fill $dst = [$srcPtr]">;
Duraid Madina7abaf902005-10-29 16:08:30 +0000566}
Duraid Madina91ed0a12005-03-17 18:17:03 +0000567
Duraid Madina7abaf902005-10-29 16:08:30 +0000568def POPCNT : AForm_DAG<0x03, 0x0b, (ops GR:$dst, GR:$src),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000569 "popcnt $dst = $src",
Duraid Madina7abaf902005-10-29 16:08:30 +0000570 [(set GR:$dst, (ctpop GR:$src))]>;
Duraid Madina25163d82005-05-11 05:16:09 +0000571
Duraid Madina7abaf902005-10-29 16:08:30 +0000572// some FP stuff: // TODO: single-precision stuff?
573def FADD : AForm_DAG<0x03, 0x0b, (ops FP:$dst, FP:$src1, FP:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000574 "fadd $dst = $src1, $src2",
Duraid Madina7abaf902005-10-29 16:08:30 +0000575 [(set FP:$dst, (fadd FP:$src1, FP:$src2))]>;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000576def FADDS: AForm<0x03, 0x0b, (ops FP:$dst, FP:$src1, FP:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000577 "fadd.s $dst = $src1, $src2">;
Duraid Madina7abaf902005-10-29 16:08:30 +0000578def FSUB : AForm_DAG<0x03, 0x0b, (ops FP:$dst, FP:$src1, FP:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000579 "fsub $dst = $src1, $src2",
Duraid Madina7abaf902005-10-29 16:08:30 +0000580 [(set FP:$dst, (fsub FP:$src1, FP:$src2))]>;
581def FMPY : AForm_DAG<0x03, 0x0b, (ops FP:$dst, FP:$src1, FP:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000582 "fmpy $dst = $src1, $src2",
Duraid Madina7abaf902005-10-29 16:08:30 +0000583 [(set FP:$dst, (fmul FP:$src1, FP:$src2))]>;
Duraid Madina7abaf902005-10-29 16:08:30 +0000584def FMA : AForm_DAG<0x03, 0x0b, (ops FP:$dst, FP:$src1, FP:$src2, FP:$src3),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000585 "fma $dst = $src1, $src2, $src3",
Duraid Madina7abaf902005-10-29 16:08:30 +0000586 [(set FP:$dst, (fadd (fmul FP:$src1, FP:$src2), FP:$src3))]>;
587def FMS : AForm_DAG<0x03, 0x0b, (ops FP:$dst, FP:$src1, FP:$src2, FP:$src3),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000588 "fms $dst = $src1, $src2, $src3",
Duraid Madina7abaf902005-10-29 16:08:30 +0000589 [(set FP:$dst, (fsub (fmul FP:$src1, FP:$src2), FP:$src3))]>;
590def FNMA : AForm_DAG<0x03, 0x0b, (ops FP:$dst, FP:$src1, FP:$src2, FP:$src3),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000591 "fnma $dst = $src1, $src2, $src3",
Duraid Madina7abaf902005-10-29 16:08:30 +0000592 [(set FP:$dst, (fneg (fadd (fmul FP:$src1, FP:$src2), FP:$src3)))]>;
Duraid Madina17decbb2005-11-02 02:37:18 +0000593def FABS : AForm_DAG<0x03, 0x0b, (ops FP:$dst, FP:$src),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000594 "fabs $dst = $src",
Duraid Madina17decbb2005-11-02 02:37:18 +0000595 [(set FP:$dst, (fabs FP:$src))]>;
Duraid Madina7abaf902005-10-29 16:08:30 +0000596def FNEG : AForm_DAG<0x03, 0x0b, (ops FP:$dst, FP:$src),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000597 "fneg $dst = $src",
Duraid Madina7abaf902005-10-29 16:08:30 +0000598 [(set FP:$dst, (fneg FP:$src))]>;
Duraid Madina17decbb2005-11-02 02:37:18 +0000599def FNEGABS : AForm_DAG<0x03, 0x0b, (ops FP:$dst, FP:$src),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000600 "fnegabs $dst = $src",
Duraid Madina17decbb2005-11-02 02:37:18 +0000601 [(set FP:$dst, (fneg (fabs FP:$src)))]>;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000602
Duraid Madinaba187772006-01-16 06:33:38 +0000603let isTwoAddress=1 in {
604def TCFMAS1 : AForm<0x03, 0x0b,
605 (ops FP:$dst, FP:$bogussrc, FP:$src1, FP:$src2, FP:$src3, PR:$qp),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000606 "($qp) fma.s1 $dst = $src1, $src2, $src3">;
Duraid Madinaba187772006-01-16 06:33:38 +0000607def TCFMADS0 : AForm<0x03, 0x0b,
608 (ops FP:$dst, FP:$bogussrc, FP:$src1, FP:$src2, FP:$src3, PR:$qp),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000609 "($qp) fma.d.s0 $dst = $src1, $src2, $src3">;
Duraid Madinaba187772006-01-16 06:33:38 +0000610}
611
Duraid Madina91ed0a12005-03-17 18:17:03 +0000612def CFMAS1 : AForm<0x03, 0x0b,
613 (ops FP:$dst, FP:$src1, FP:$src2, FP:$src3, PR:$qp),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000614 "($qp) fma.s1 $dst = $src1, $src2, $src3">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000615def CFNMAS1 : AForm<0x03, 0x0b,
616 (ops FP:$dst, FP:$src1, FP:$src2, FP:$src3, PR:$qp),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000617 "($qp) fnma.s1 $dst = $src1, $src2, $src3">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000618
Duraid Madinaba187772006-01-16 06:33:38 +0000619def CFMADS1 : AForm<0x03, 0x0b,
620 (ops FP:$dst, FP:$src1, FP:$src2, FP:$src3, PR:$qp),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000621 "($qp) fma.d.s1 $dst = $src1, $src2, $src3">;
Duraid Madinaba187772006-01-16 06:33:38 +0000622def CFMADS0 : AForm<0x03, 0x0b,
623 (ops FP:$dst, FP:$src1, FP:$src2, FP:$src3, PR:$qp),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000624 "($qp) fma.d.s0 $dst = $src1, $src2, $src3">;
Duraid Madinaba187772006-01-16 06:33:38 +0000625def CFNMADS1 : AForm<0x03, 0x0b,
626 (ops FP:$dst, FP:$src1, FP:$src2, FP:$src3, PR:$qp),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000627 "($qp) fnma.d.s1 $dst = $src1, $src2, $src3">;
Duraid Madinaba187772006-01-16 06:33:38 +0000628
629def FRCPAS0 : AForm<0x03, 0x0b, (ops FP:$dstFR, PR:$dstPR, FP:$src1, FP:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000630 "frcpa.s0 $dstFR, $dstPR = $src1, $src2">;
Duraid Madina41ff5022005-04-08 10:01:48 +0000631def FRCPAS1 : AForm<0x03, 0x0b, (ops FP:$dstFR, PR:$dstPR, FP:$src1, FP:$src2),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000632 "frcpa.s1 $dstFR, $dstPR = $src1, $src2">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000633
634def XMAL : AForm<0x03, 0x0b, (ops FP:$dst, FP:$src1, FP:$src2, FP:$src3),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000635 "xma.l $dst = $src1, $src2, $src3">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000636
637def FCVTXF : AForm<0x03, 0x0b, (ops FP:$dst, FP:$src),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000638 "fcvt.xf $dst = $src">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000639def FCVTXUF : AForm<0x03, 0x0b, (ops FP:$dst, FP:$src),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000640 "fcvt.xuf $dst = $src">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000641def FCVTXUFS1 : AForm<0x03, 0x0b, (ops FP:$dst, FP:$src),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000642 "fcvt.xuf.s1 $dst = $src">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000643def FCVTFX : AForm<0x03, 0x0b, (ops FP:$dst, FP:$src),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000644 "fcvt.fx $dst = $src">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000645def FCVTFXU : AForm<0x03, 0x0b, (ops FP:$dst, FP:$src),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000646 "fcvt.fxu $dst = $src">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000647
648def FCVTFXTRUNC : AForm<0x03, 0x0b, (ops FP:$dst, FP:$src),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000649 "fcvt.fx.trunc $dst = $src">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000650def FCVTFXUTRUNC : AForm<0x03, 0x0b, (ops FP:$dst, FP:$src),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000651 "fcvt.fxu.trunc $dst = $src">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000652
653def FCVTFXTRUNCS1 : AForm<0x03, 0x0b, (ops FP:$dst, FP:$src),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000654 "fcvt.fx.trunc.s1 $dst = $src">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000655def FCVTFXUTRUNCS1 : AForm<0x03, 0x0b, (ops FP:$dst, FP:$src),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000656 "fcvt.fxu.trunc.s1 $dst = $src">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000657
658def FNORMD : AForm<0x03, 0x0b, (ops FP:$dst, FP:$src),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000659 "fnorm.d $dst = $src">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000660
Duraid Madina3608ab82005-12-22 07:13:51 +0000661def GETFD : AForm<0x03, 0x0b, (ops GR:$dst, FP:$src),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000662 "getf.d $dst = $src">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000663def SETFD : AForm<0x03, 0x0b, (ops FP:$dst, GR:$src),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000664 "setf.d $dst = $src">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000665
666def GETFSIG : AForm<0x03, 0x0b, (ops GR:$dst, FP:$src),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000667 "getf.sig $dst = $src">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000668def SETFSIG : AForm<0x03, 0x0b, (ops FP:$dst, GR:$src),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000669 "setf.sig $dst = $src">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000670
Duraid Madina6c912bf2005-11-01 03:07:25 +0000671// these four FP<->int conversion patterns need checking/cleaning
672def SINT_TO_FP : Pat<(sint_to_fp GR:$src),
673 (FNORMD (FCVTXF (SETFSIG GR:$src)))>;
674def UINT_TO_FP : Pat<(uint_to_fp GR:$src),
675 (FNORMD (FCVTXUF (SETFSIG GR:$src)))>;
Duraid Madinab81b6132005-11-01 03:32:15 +0000676def FP_TO_SINT : Pat<(i64 (fp_to_sint FP:$src)),
Duraid Madina6c912bf2005-11-01 03:07:25 +0000677 (GETFSIG (FCVTFXTRUNC FP:$src))>;
Duraid Madinab81b6132005-11-01 03:32:15 +0000678def FP_TO_UINT : Pat<(i64 (fp_to_uint FP:$src)),
Duraid Madina6c912bf2005-11-01 03:07:25 +0000679 (GETFSIG (FCVTFXUTRUNC FP:$src))>;
Duraid Madinab81b6132005-11-01 03:32:15 +0000680
Duraid Madina6c912bf2005-11-01 03:07:25 +0000681
Evan Cheng14c53b42005-12-26 09:11:45 +0000682let isTerminator = 1, isBranch = 1, noResults = 1 in {
Duraid Madinaf221c262005-10-28 17:46:35 +0000683 def BRL_NOTCALL : RawForm<0x03, 0xb0, (ops i64imm:$dst),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000684 "(p0) brl.cond.sptk $dst">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000685 def BRLCOND_NOTCALL : RawForm<0x03, 0xb0, (ops PR:$qp, i64imm:$dst),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000686 "($qp) brl.cond.sptk $dst">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000687 def BRCOND_NOTCALL : RawForm<0x03, 0xb0, (ops PR:$qp, GR:$dst),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000688 "($qp) br.cond.sptk $dst">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000689}
690
Evan Cheng14c53b42005-12-26 09:11:45 +0000691let isCall = 1, noResults = 1, /* isTerminator = 1, isBranch = 1, */
Chris Lattner6b917672005-04-12 15:12:19 +0000692 Uses = [out0,out1,out2,out3,out4,out5,out6,out7],
Duraid Madina91ed0a12005-03-17 18:17:03 +0000693// all calls clobber non-callee-saved registers, and for now, they are these:
694 Defs = [r2,r3,r8,r9,r10,r11,r14,r15,r16,r17,r18,r19,r20,r21,r22,r23,r24,
695 r25,r26,r27,r28,r29,r30,r31,
696 p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,
697 F6,F7,F8,F9,F10,F11,F12,F13,F14,F15,
698 F32,F33,F34,F35,F36,F37,F38,F39,F40,F41,F42,F43,F44,F45,F46,F47,F48,F49,
699 F50,F51,F52,F53,F54,F55,F56,
700 F57,F58,F59,F60,F61,F62,F63,F64,F65,F66,F67,F68,F69,F70,F71,F72,F73,F74,
701 F75,F76,F77,F78,F79,F80,F81,
702 F82,F83,F84,F85,F86,F87,F88,F89,F90,F91,F92,F93,F94,F95,F96,F97,F98,F99,
703 F100,F101,F102,F103,F104,F105,
704 F106,F107,F108,F109,F110,F111,F112,F113,F114,F115,F116,F117,F118,F119,
705 F120,F121,F122,F123,F124,F125,F126,F127,
706 out0,out1,out2,out3,out4,out5,out6,out7] in {
Duraid Madinaf221c262005-10-28 17:46:35 +0000707// old pattern call
708 def BRCALL: RawForm<0x03, 0xb0, (ops calltarget:$dst),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000709 "br.call.sptk rp = $dst">; // FIXME: teach llvm about branch regs?
Duraid Madinaf221c262005-10-28 17:46:35 +0000710// new daggy stuff!
Duraid Madinaa743e002005-12-22 03:56:03 +0000711
712// calls a globaladdress
Duraid Madina06dcc192005-12-25 14:07:01 +0000713 def BRCALL_IPREL_GA : RawForm<0x03, 0xb0, (ops calltarget:$dst),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000714 "br.call.sptk rp = $dst">; // FIXME: teach llvm about branch regs?
Duraid Madinaa743e002005-12-22 03:56:03 +0000715// calls an externalsymbol
Duraid Madina06dcc192005-12-25 14:07:01 +0000716 def BRCALL_IPREL_ES : RawForm<0x03, 0xb0, (ops calltarget:$dst),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000717 "br.call.sptk rp = $dst">; // FIXME: teach llvm about branch regs?
Duraid Madinaa743e002005-12-22 03:56:03 +0000718// calls through a function descriptor
Duraid Madina06dcc192005-12-25 14:07:01 +0000719 def BRCALL_INDIRECT : RawForm<0x03, 0xb0, (ops GR:$branchreg),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000720 "br.call.sptk rp = $branchreg">; // FIXME: teach llvm about branch regs?
Duraid Madina91ed0a12005-03-17 18:17:03 +0000721 def BRLCOND_CALL : RawForm<0x03, 0xb0, (ops PR:$qp, i64imm:$dst),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000722 "($qp) brl.cond.call.sptk $dst">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000723 def BRCOND_CALL : RawForm<0x03, 0xb0, (ops PR:$qp, GR:$dst),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000724 "($qp) br.cond.call.sptk $dst">;
Duraid Madina91ed0a12005-03-17 18:17:03 +0000725}
726
Duraid Madinaf54c9392006-01-20 20:24:31 +0000727// Return branch:
Evan Cheng14c53b42005-12-26 09:11:45 +0000728let isTerminator = 1, isReturn = 1, noResults = 1 in
Duraid Madinaf54c9392006-01-20 20:24:31 +0000729 def RET : AForm_DAG<0x03, 0x0b, (ops),
Duraid Madina5ea06a92006-01-25 02:23:38 +0000730 "br.ret.sptk.many rp",
Duraid Madinaf54c9392006-01-20 20:24:31 +0000731 [(retflag)]>; // return
732def : Pat<(ret), (RET)>;
Duraid Madina5ea06a92006-01-25 02:23:38 +0000733
734// the evil stop bit of despair
735def STOP : PseudoInstIA64<(ops variable_ops), ";;">;
736