SystemZInstrFP.td revision 1d0ec0b4fc948f437b3ffbbf4b7c47ca5cd971fd
1//===- 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
60let isTwoAddress = 1 in {
61
62let isCommutable = 1 in { // X = ADD Y, Z  == X = ADD Z, Y
63def FADD32rr : Pseudo<(outs FP32:$dst), (ins FP32:$src1, FP32:$src2),
64                       "aebr\t{$dst, $src2}",
65                       [(set FP32:$dst, (fadd FP32:$src1, FP32:$src2))]>;
66def FADD64rr : Pseudo<(outs FP64:$dst), (ins FP64:$src1, FP64:$src2),
67                       "adbr\t{$dst, $src2}",
68                       [(set FP64:$dst, (fadd FP64:$src1, FP64:$src2))]>;
69}
70
71def FADD32rm : Pseudo<(outs FP32:$dst), (ins FP32:$src1, rriaddr:$src2),
72                       "aeb\t{$dst, $src2}",
73                       [(set FP32:$dst, (fadd FP32:$src1, (load rriaddr:$src2)))]>;
74def FADD64rm : Pseudo<(outs FP64:$dst), (ins FP64:$src1, rriaddr:$src2),
75                       "adb\t{$dst, $src2}",
76                       [(set FP64:$dst, (fadd FP64:$src1, (load rriaddr:$src2)))]>;
77
78def FSUB32rr : Pseudo<(outs FP32:$dst), (ins FP32:$src1, FP32:$src2),
79                       "sebr\t{$dst, $src2}",
80                       [(set FP32:$dst, (fsub FP32:$src1, FP32:$src2))]>;
81def FSUB64rr : Pseudo<(outs FP64:$dst), (ins FP64:$src1, FP64:$src2),
82                       "sdbr\t{$dst, $src2}",
83                       [(set FP64:$dst, (fsub FP64:$src1, FP64:$src2))]>;
84
85def FSUB32rm : Pseudo<(outs FP32:$dst), (ins FP32:$src1, rriaddr:$src2),
86                       "seb\t{$dst, $src2}",
87                       [(set FP32:$dst, (fsub FP32:$src1, (load rriaddr:$src2)))]>;
88def FSUB64rm : Pseudo<(outs FP64:$dst), (ins FP64:$src1, rriaddr:$src2),
89                       "sdb\t{$dst, $src2}",
90                       [(set FP64:$dst, (fsub FP64:$src1, (load rriaddr:$src2)))]>;
91
92let isCommutable = 1 in { // X = MUL Y, Z  == X = MUL Z, Y
93def FMUL32rr : Pseudo<(outs FP32:$dst), (ins FP32:$src1, FP32:$src2),
94                       "meebr\t{$dst, $src2}",
95                       [(set FP32:$dst, (fmul FP32:$src1, FP32:$src2))]>;
96def FMUL64rr : Pseudo<(outs FP64:$dst), (ins FP64:$src1, FP64:$src2),
97                       "mdbr\t{$dst, $src2}",
98                       [(set FP64:$dst, (fmul FP64:$src1, FP64:$src2))]>;
99}
100
101def FMUL32rm : Pseudo<(outs FP32:$dst), (ins FP32:$src1, rriaddr:$src2),
102                       "meeb\t{$dst, $src2}",
103                       [(set FP32:$dst, (fmul FP32:$src1, (load rriaddr:$src2)))]>;
104def FMUL64rm : Pseudo<(outs FP64:$dst), (ins FP64:$src1, rriaddr:$src2),
105                       "mdb\t{$dst, $src2}",
106                       [(set FP64:$dst, (fmul FP64:$src1, (load rriaddr:$src2)))]>;
107
108def FDIV32rr : Pseudo<(outs FP32:$dst), (ins FP32:$src1, FP32:$src2),
109                       "debr\t{$dst, $src2}",
110                       [(set FP32:$dst, (fdiv FP32:$src1, FP32:$src2))]>;
111def FDIV64rr : Pseudo<(outs FP64:$dst), (ins FP64:$src1, FP64:$src2),
112                       "ddbr\t{$dst, $src2}",
113                       [(set FP64:$dst, (fdiv FP64:$src1, FP64:$src2))]>;
114
115def FDIV32rm : Pseudo<(outs FP32:$dst), (ins FP32:$src1, rriaddr:$src2),
116                       "deb\t{$dst, $src2}",
117                       [(set FP32:$dst, (fdiv FP32:$src1, (load rriaddr:$src2)))]>;
118def FDIV64rm : Pseudo<(outs FP64:$dst), (ins FP64:$src1, rriaddr:$src2),
119                       "ddb\t{$dst, $src2}",
120                       [(set FP64:$dst, (fdiv FP64:$src1, (load rriaddr:$src2)))]>;
121
122} // isTwoAddress = 1
123
124def FROUND64r32 : Pseudo<(outs FP32:$dst), (ins FP64:$src),
125                         "ledbr\t{$dst, $src}",
126                         [(set FP32:$dst, (fround FP64:$src))]>;
127
128def FCONVFP32   : Pseudo<(outs FP32:$dst), (ins GR32:$src),
129                         "cefbr\t{$dst, $src}",
130                         [(set FP32:$dst, (sint_to_fp GR32:$src))]>;
131def FCONVFP32r64: Pseudo<(outs FP32:$dst), (ins GR64:$src),
132                         "cegbr\t{$dst, $src}",
133                         [(set FP32:$dst, (sint_to_fp GR64:$src))]>;
134
135def FCONVFP64r32: Pseudo<(outs FP64:$dst), (ins GR32:$src),
136                         "cdfbr\t{$dst, $src}",
137                         [(set FP64:$dst, (sint_to_fp GR32:$src))]>;
138
139def FCONVFP64   : Pseudo<(outs FP64:$dst), (ins GR64:$src),
140                         "cdgbr\t{$dst, $src}",
141                         [(set FP64:$dst, (sint_to_fp GR64:$src))]>;
142
143//===----------------------------------------------------------------------===//
144// Test instructions (like AND but do not produce any result)
145
146// Integer comparisons
147let Defs = [PSW] in {
148def FCMP32rr : Pseudo<(outs), (ins FP32:$src1, FP32:$src2),
149                      "cebr\t$src1, $src2",
150                      [(SystemZcmp FP32:$src1, FP32:$src2), (implicit PSW)]>;
151def FCMP64rr : Pseudo<(outs), (ins FP64:$src1, FP64:$src2),
152                      "cdbr\t$src1, $src2",
153                      [(SystemZcmp FP64:$src1, FP64:$src2), (implicit PSW)]>;
154
155def FCMP32rm : Pseudo<(outs), (ins FP32:$src1, rriaddr:$src2),
156                      "ceb\t$src1, $src2",
157                      [(SystemZcmp FP32:$src1, (load rriaddr:$src2)),
158                       (implicit PSW)]>;
159def FCMP64rm : Pseudo<(outs), (ins FP64:$src1, rriaddr:$src2),
160                      "cdb\t$src1, $src2",
161                      [(SystemZcmp FP64:$src1, (load rriaddr:$src2)),
162                       (implicit PSW)]>;
163} // Defs = [PSW]
164