blob: ce704cbb0977337eb41ef10d5502065a583f12ea [file] [log] [blame]
Anton Korobeynikov3b6124e2009-07-16 14:20:24 +00001//===- SystemZInstrFP.td - SystemZ FP Instruction defs --------*- tblgen-*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file describes the SystemZ (binary) floating point instructions in
11// TableGen format.
12//
13//===----------------------------------------------------------------------===//
14
15// FIXME: multiclassify!
16
17//===----------------------------------------------------------------------===//
18// Move Instructions
19
20let neverHasSideEffects = 1 in {
21def FMOV32rr : Pseudo<(outs FP32:$dst), (ins FP32:$src),
22 "ler\t{$dst, $src}",
23 []>;
24def FMOV64rr : Pseudo<(outs FP64:$dst), (ins FP64:$src),
25 "ldr\t{$dst, $src}",
26 []>;
27}
28
29let canFoldAsLoad = 1, isReMaterializable = 1, mayHaveSideEffects = 1 in {
30def FMOV32rm : Pseudo<(outs FP32:$dst), (ins rriaddr12:$src),
31 "le\t{$dst, $src}",
32 [(set FP32:$dst, (load rriaddr12:$src))]>;
33def FMOV32rmy : Pseudo<(outs FP32:$dst), (ins rriaddr:$src),
34 "ley\t{$dst, $src}",
35 [(set FP32:$dst, (load rriaddr:$src))]>;
36def FMOV64rm : Pseudo<(outs FP64:$dst), (ins rriaddr12:$src),
37 "ld\t{$dst, $src}",
38 [(set FP64:$dst, (load rriaddr12:$src))]>;
39def FMOV64rmy : Pseudo<(outs FP64:$dst), (ins rriaddr:$src),
40 "ldy\t{$dst, $src}",
41 [(set FP64:$dst, (load rriaddr:$src))]>;
42}
43
44def FMOV32mr : Pseudo<(outs), (ins rriaddr12:$dst, FP32:$src),
45 "ste\t{$src, $dst}",
46 [(store FP32:$src, rriaddr12:$dst)]>;
47def FMOV32mry : Pseudo<(outs), (ins rriaddr:$dst, FP32:$src),
48 "stey\t{$src, $dst}",
49 [(store FP32:$src, rriaddr:$dst)]>;
50def FMOV64mr : Pseudo<(outs), (ins rriaddr12:$dst, FP64:$src),
51 "std\t{$src, $dst}",
52 [(store FP64:$src, rriaddr12:$dst)]>;
53def FMOV64mry : Pseudo<(outs), (ins rriaddr:$dst, FP64:$src),
54 "stdy\t{$src, $dst}",
55 [(store FP64:$src, rriaddr:$dst)]>;
56
57//===----------------------------------------------------------------------===//
58// Arithmetic Instructions
59
Anton Korobeynikov99d25902009-07-16 14:21:12 +000060
61
Anton Korobeynikov3b6124e2009-07-16 14:20:24 +000062let isTwoAddress = 1 in {
Anton Korobeynikov99d25902009-07-16 14:21:12 +000063def FNEG32rr : Pseudo<(outs FP32:$dst), (ins FP32:$src),
64 "lcebr\t{$dst}",
65 [(set FP32:$dst, (fneg FP32:$src))]>;
66def FNEG64rr : Pseudo<(outs FP64:$dst), (ins FP64:$src),
67 "lcdbr\t{$dst}",
68 [(set FP64:$dst, (fneg FP64:$src))]>;
Anton Korobeynikov3b6124e2009-07-16 14:20:24 +000069
Anton Korobeynikov7af65142009-07-16 14:21:27 +000070// FIXME: Add peephole for fneg(fabs) => load negative
71
72def FABS32rr : Pseudo<(outs FP32:$dst), (ins FP32:$src),
73 "lpebr\t{$dst}",
74 [(set FP32:$dst, (fabs FP32:$src))]>;
75def FABS64rr : Pseudo<(outs FP64:$dst), (ins FP64:$src),
76 "lpdbr\t{$dst}",
77 [(set FP64:$dst, (fabs FP64:$src))]>;
78
Anton Korobeynikov3b6124e2009-07-16 14:20:24 +000079let isCommutable = 1 in { // X = ADD Y, Z == X = ADD Z, Y
80def FADD32rr : Pseudo<(outs FP32:$dst), (ins FP32:$src1, FP32:$src2),
81 "aebr\t{$dst, $src2}",
82 [(set FP32:$dst, (fadd FP32:$src1, FP32:$src2))]>;
83def FADD64rr : Pseudo<(outs FP64:$dst), (ins FP64:$src1, FP64:$src2),
84 "adbr\t{$dst, $src2}",
85 [(set FP64:$dst, (fadd FP64:$src1, FP64:$src2))]>;
86}
87
88def FADD32rm : Pseudo<(outs FP32:$dst), (ins FP32:$src1, rriaddr:$src2),
89 "aeb\t{$dst, $src2}",
90 [(set FP32:$dst, (fadd FP32:$src1, (load rriaddr:$src2)))]>;
91def FADD64rm : Pseudo<(outs FP64:$dst), (ins FP64:$src1, rriaddr:$src2),
92 "adb\t{$dst, $src2}",
93 [(set FP64:$dst, (fadd FP64:$src1, (load rriaddr:$src2)))]>;
94
95def FSUB32rr : Pseudo<(outs FP32:$dst), (ins FP32:$src1, FP32:$src2),
96 "sebr\t{$dst, $src2}",
97 [(set FP32:$dst, (fsub FP32:$src1, FP32:$src2))]>;
98def FSUB64rr : Pseudo<(outs FP64:$dst), (ins FP64:$src1, FP64:$src2),
99 "sdbr\t{$dst, $src2}",
100 [(set FP64:$dst, (fsub FP64:$src1, FP64:$src2))]>;
101
102def FSUB32rm : Pseudo<(outs FP32:$dst), (ins FP32:$src1, rriaddr:$src2),
103 "seb\t{$dst, $src2}",
104 [(set FP32:$dst, (fsub FP32:$src1, (load rriaddr:$src2)))]>;
105def FSUB64rm : Pseudo<(outs FP64:$dst), (ins FP64:$src1, rriaddr:$src2),
106 "sdb\t{$dst, $src2}",
107 [(set FP64:$dst, (fsub FP64:$src1, (load rriaddr:$src2)))]>;
108
109let isCommutable = 1 in { // X = MUL Y, Z == X = MUL Z, Y
110def FMUL32rr : Pseudo<(outs FP32:$dst), (ins FP32:$src1, FP32:$src2),
111 "meebr\t{$dst, $src2}",
112 [(set FP32:$dst, (fmul FP32:$src1, FP32:$src2))]>;
113def FMUL64rr : Pseudo<(outs FP64:$dst), (ins FP64:$src1, FP64:$src2),
114 "mdbr\t{$dst, $src2}",
115 [(set FP64:$dst, (fmul FP64:$src1, FP64:$src2))]>;
116}
117
118def FMUL32rm : Pseudo<(outs FP32:$dst), (ins FP32:$src1, rriaddr:$src2),
119 "meeb\t{$dst, $src2}",
120 [(set FP32:$dst, (fmul FP32:$src1, (load rriaddr:$src2)))]>;
121def FMUL64rm : Pseudo<(outs FP64:$dst), (ins FP64:$src1, rriaddr:$src2),
122 "mdb\t{$dst, $src2}",
123 [(set FP64:$dst, (fmul FP64:$src1, (load rriaddr:$src2)))]>;
124
125def FDIV32rr : Pseudo<(outs FP32:$dst), (ins FP32:$src1, FP32:$src2),
126 "debr\t{$dst, $src2}",
127 [(set FP32:$dst, (fdiv FP32:$src1, FP32:$src2))]>;
128def FDIV64rr : Pseudo<(outs FP64:$dst), (ins FP64:$src1, FP64:$src2),
129 "ddbr\t{$dst, $src2}",
130 [(set FP64:$dst, (fdiv FP64:$src1, FP64:$src2))]>;
131
132def FDIV32rm : Pseudo<(outs FP32:$dst), (ins FP32:$src1, rriaddr:$src2),
133 "deb\t{$dst, $src2}",
134 [(set FP32:$dst, (fdiv FP32:$src1, (load rriaddr:$src2)))]>;
135def FDIV64rm : Pseudo<(outs FP64:$dst), (ins FP64:$src1, rriaddr:$src2),
136 "ddb\t{$dst, $src2}",
137 [(set FP64:$dst, (fdiv FP64:$src1, (load rriaddr:$src2)))]>;
138
139} // isTwoAddress = 1
140
141def FROUND64r32 : Pseudo<(outs FP32:$dst), (ins FP64:$src),
142 "ledbr\t{$dst, $src}",
143 [(set FP32:$dst, (fround FP64:$src))]>;
144
145def FCONVFP32 : Pseudo<(outs FP32:$dst), (ins GR32:$src),
146 "cefbr\t{$dst, $src}",
147 [(set FP32:$dst, (sint_to_fp GR32:$src))]>;
Anton Korobeynikov6030b052009-07-16 14:20:39 +0000148def FCONVFP32r64: Pseudo<(outs FP32:$dst), (ins GR64:$src),
149 "cegbr\t{$dst, $src}",
150 [(set FP32:$dst, (sint_to_fp GR64:$src))]>;
151
152def FCONVFP64r32: Pseudo<(outs FP64:$dst), (ins GR32:$src),
153 "cdfbr\t{$dst, $src}",
154 [(set FP64:$dst, (sint_to_fp GR32:$src))]>;
Anton Korobeynikov3b6124e2009-07-16 14:20:24 +0000155def FCONVFP64 : Pseudo<(outs FP64:$dst), (ins GR64:$src),
156 "cdgbr\t{$dst, $src}",
157 [(set FP64:$dst, (sint_to_fp GR64:$src))]>;
158
Anton Korobeynikov01d50272009-07-16 14:21:57 +0000159def FCONVGR32 : Pseudo<(outs GR32:$dst), (ins FP32:$src),
160 "cfebr\t{$dst, $src}",
161 [(set GR32:$dst, (fp_to_sint FP32:$src))]>;
162def FCONVGR32r64: Pseudo<(outs GR32:$dst), (ins FP64:$src),
163 "cgebr\t{$dst, $src}",
164 [(set GR32:$dst, (fp_to_sint FP64:$src))]>;
165
166def FCONVGR64r32: Pseudo<(outs GR64:$dst), (ins FP32:$src),
167 "cfdbr\t{$dst, $src}",
168 [(set GR64:$dst, (fp_to_sint FP32:$src))]>;
169def FCONVGR64 : Pseudo<(outs GR64:$dst), (ins FP64:$src),
170 "cgdbr\t{$dst, $src}",
171 [(set GR64:$dst, (fp_to_sint FP64:$src))]>;
172
Anton Korobeynikov3b6124e2009-07-16 14:20:24 +0000173//===----------------------------------------------------------------------===//
174// Test instructions (like AND but do not produce any result)
175
176// Integer comparisons
177let Defs = [PSW] in {
178def FCMP32rr : Pseudo<(outs), (ins FP32:$src1, FP32:$src2),
179 "cebr\t$src1, $src2",
180 [(SystemZcmp FP32:$src1, FP32:$src2), (implicit PSW)]>;
181def FCMP64rr : Pseudo<(outs), (ins FP64:$src1, FP64:$src2),
182 "cdbr\t$src1, $src2",
183 [(SystemZcmp FP64:$src1, FP64:$src2), (implicit PSW)]>;
184
185def FCMP32rm : Pseudo<(outs), (ins FP32:$src1, rriaddr:$src2),
186 "ceb\t$src1, $src2",
187 [(SystemZcmp FP32:$src1, (load rriaddr:$src2)),
188 (implicit PSW)]>;
189def FCMP64rm : Pseudo<(outs), (ins FP64:$src1, rriaddr:$src2),
190 "cdb\t$src1, $src2",
191 [(SystemZcmp FP64:$src1, (load rriaddr:$src2)),
192 (implicit PSW)]>;
193} // Defs = [PSW]