1// Copyright 2015 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_COMPILER_BACKEND_S390_INSTRUCTION_CODES_S390_H_
6#define V8_COMPILER_BACKEND_S390_INSTRUCTION_CODES_S390_H_
7
8namespace v8 {
9namespace internal {
10namespace compiler {
11
12// S390-specific opcodes that specify which assembly sequence to emit.
13// Most opcodes specify a single instruction.
14
15#define TARGET_ARCH_OPCODE_LIST(V)          \
16  V(S390_Peek)                              \
17  V(S390_Abs32)                             \
18  V(S390_Abs64)                             \
19  V(S390_And32)                             \
20  V(S390_And64)                             \
21  V(S390_Or32)                              \
22  V(S390_Or64)                              \
23  V(S390_Xor32)                             \
24  V(S390_Xor64)                             \
25  V(S390_ShiftLeft32)                       \
26  V(S390_ShiftLeft64)                       \
27  V(S390_ShiftRight32)                      \
28  V(S390_ShiftRight64)                      \
29  V(S390_ShiftRightArith32)                 \
30  V(S390_ShiftRightArith64)                 \
31  V(S390_RotRight32)                        \
32  V(S390_RotRight64)                        \
33  V(S390_Not32)                             \
34  V(S390_Not64)                             \
35  V(S390_RotLeftAndClear64)                 \
36  V(S390_RotLeftAndClearLeft64)             \
37  V(S390_RotLeftAndClearRight64)            \
38  V(S390_Lay)                               \
39  V(S390_Add32)                             \
40  V(S390_Add64)                             \
41  V(S390_AddFloat)                          \
42  V(S390_AddDouble)                         \
43  V(S390_Sub32)                             \
44  V(S390_Sub64)                             \
45  V(S390_SubFloat)                          \
46  V(S390_SubDouble)                         \
47  V(S390_Mul32)                             \
48  V(S390_Mul32WithOverflow)                 \
49  V(S390_Mul64)                             \
50  V(S390_MulHigh32)                         \
51  V(S390_MulHighU32)                        \
52  V(S390_MulFloat)                          \
53  V(S390_MulDouble)                         \
54  V(S390_Div32)                             \
55  V(S390_Div64)                             \
56  V(S390_DivU32)                            \
57  V(S390_DivU64)                            \
58  V(S390_DivFloat)                          \
59  V(S390_DivDouble)                         \
60  V(S390_Mod32)                             \
61  V(S390_Mod64)                             \
62  V(S390_ModU32)                            \
63  V(S390_ModU64)                            \
64  V(S390_ModDouble)                         \
65  V(S390_Neg32)                             \
66  V(S390_Neg64)                             \
67  V(S390_NegDouble)                         \
68  V(S390_NegFloat)                          \
69  V(S390_SqrtFloat)                         \
70  V(S390_FloorFloat)                        \
71  V(S390_CeilFloat)                         \
72  V(S390_TruncateFloat)                     \
73  V(S390_FloatNearestInt)                   \
74  V(S390_AbsFloat)                          \
75  V(S390_SqrtDouble)                        \
76  V(S390_FloorDouble)                       \
77  V(S390_CeilDouble)                        \
78  V(S390_TruncateDouble)                    \
79  V(S390_RoundDouble)                       \
80  V(S390_DoubleNearestInt)                  \
81  V(S390_MaxFloat)                          \
82  V(S390_MaxDouble)                         \
83  V(S390_MinFloat)                          \
84  V(S390_MinDouble)                         \
85  V(S390_AbsDouble)                         \
86  V(S390_Cntlz32)                           \
87  V(S390_Cntlz64)                           \
88  V(S390_Popcnt32)                          \
89  V(S390_Popcnt64)                          \
90  V(S390_Cmp32)                             \
91  V(S390_Cmp64)                             \
92  V(S390_CmpFloat)                          \
93  V(S390_CmpDouble)                         \
94  V(S390_Tst32)                             \
95  V(S390_Tst64)                             \
96  V(S390_Push)                              \
97  V(S390_PushFrame)                         \
98  V(S390_StoreToStackSlot)                  \
99  V(S390_SignExtendWord8ToInt32)            \
100  V(S390_SignExtendWord16ToInt32)           \
101  V(S390_SignExtendWord8ToInt64)            \
102  V(S390_SignExtendWord16ToInt64)           \
103  V(S390_SignExtendWord32ToInt64)           \
104  V(S390_Uint32ToUint64)                    \
105  V(S390_Int64ToInt32)                      \
106  V(S390_Int64ToFloat32)                    \
107  V(S390_Int64ToDouble)                     \
108  V(S390_Uint64ToFloat32)                   \
109  V(S390_Uint64ToDouble)                    \
110  V(S390_Int32ToFloat32)                    \
111  V(S390_Int32ToDouble)                     \
112  V(S390_Uint32ToFloat32)                   \
113  V(S390_Uint32ToDouble)                    \
114  V(S390_Float32ToInt64)                    \
115  V(S390_Float32ToUint64)                   \
116  V(S390_Float32ToInt32)                    \
117  V(S390_Float32ToUint32)                   \
118  V(S390_Float32ToDouble)                   \
119  V(S390_Float64SilenceNaN)                 \
120  V(S390_DoubleToInt32)                     \
121  V(S390_DoubleToUint32)                    \
122  V(S390_DoubleToInt64)                     \
123  V(S390_DoubleToUint64)                    \
124  V(S390_DoubleToFloat32)                   \
125  V(S390_DoubleExtractLowWord32)            \
126  V(S390_DoubleExtractHighWord32)           \
127  V(S390_DoubleInsertLowWord32)             \
128  V(S390_DoubleInsertHighWord32)            \
129  V(S390_DoubleConstruct)                   \
130  V(S390_BitcastInt32ToFloat32)             \
131  V(S390_BitcastFloat32ToInt32)             \
132  V(S390_BitcastInt64ToDouble)              \
133  V(S390_BitcastDoubleToInt64)              \
134  V(S390_LoadWordS8)                        \
135  V(S390_LoadWordU8)                        \
136  V(S390_LoadWordS16)                       \
137  V(S390_LoadWordU16)                       \
138  V(S390_LoadWordS32)                       \
139  V(S390_LoadWordU32)                       \
140  V(S390_LoadAndTestWord32)                 \
141  V(S390_LoadAndTestWord64)                 \
142  V(S390_LoadAndTestFloat32)                \
143  V(S390_LoadAndTestFloat64)                \
144  V(S390_LoadReverse16RR)                   \
145  V(S390_LoadReverse32RR)                   \
146  V(S390_LoadReverse64RR)                   \
147  V(S390_LoadReverseSimd128RR)              \
148  V(S390_LoadReverseSimd128)                \
149  V(S390_LoadReverse16)                     \
150  V(S390_LoadReverse32)                     \
151  V(S390_LoadReverse64)                     \
152  V(S390_LoadWord64)                        \
153  V(S390_LoadFloat32)                       \
154  V(S390_LoadDouble)                        \
155  V(S390_StoreWord8)                        \
156  V(S390_StoreWord16)                       \
157  V(S390_StoreWord32)                       \
158  V(S390_StoreWord64)                       \
159  V(S390_StoreReverse16)                    \
160  V(S390_StoreReverse32)                    \
161  V(S390_StoreReverse64)                    \
162  V(S390_StoreReverseSimd128)               \
163  V(S390_StoreFloat32)                      \
164  V(S390_StoreDouble)                       \
165  V(S390_Word64AtomicExchangeUint64)        \
166  V(S390_Word64AtomicCompareExchangeUint64) \
167  V(S390_Word64AtomicAddUint64)             \
168  V(S390_Word64AtomicSubUint64)             \
169  V(S390_Word64AtomicAndUint64)             \
170  V(S390_Word64AtomicOrUint64)              \
171  V(S390_Word64AtomicXorUint64)             \
172  V(S390_F64x2Splat)                        \
173  V(S390_F64x2ReplaceLane)                  \
174  V(S390_F64x2Abs)                          \
175  V(S390_F64x2Neg)                          \
176  V(S390_F64x2Sqrt)                         \
177  V(S390_F64x2Add)                          \
178  V(S390_F64x2Sub)                          \
179  V(S390_F64x2Mul)                          \
180  V(S390_F64x2Div)                          \
181  V(S390_F64x2Eq)                           \
182  V(S390_F64x2Ne)                           \
183  V(S390_F64x2Lt)                           \
184  V(S390_F64x2Le)                           \
185  V(S390_F64x2Min)                          \
186  V(S390_F64x2Max)                          \
187  V(S390_F64x2ExtractLane)                  \
188  V(S390_F64x2Qfma)                         \
189  V(S390_F64x2Qfms)                         \
190  V(S390_F64x2Pmin)                         \
191  V(S390_F64x2Pmax)                         \
192  V(S390_F64x2Ceil)                         \
193  V(S390_F64x2Floor)                        \
194  V(S390_F64x2Trunc)                        \
195  V(S390_F64x2NearestInt)                   \
196  V(S390_F64x2ConvertLowI32x4S)             \
197  V(S390_F64x2ConvertLowI32x4U)             \
198  V(S390_F64x2PromoteLowF32x4)              \
199  V(S390_F32x4Splat)                        \
200  V(S390_F32x4ExtractLane)                  \
201  V(S390_F32x4ReplaceLane)                  \
202  V(S390_F32x4Add)                          \
203  V(S390_F32x4Sub)                          \
204  V(S390_F32x4Mul)                          \
205  V(S390_F32x4Eq)                           \
206  V(S390_F32x4Ne)                           \
207  V(S390_F32x4Lt)                           \
208  V(S390_F32x4Le)                           \
209  V(S390_F32x4Abs)                          \
210  V(S390_F32x4Neg)                          \
211  V(S390_F32x4RecipApprox)                  \
212  V(S390_F32x4RecipSqrtApprox)              \
213  V(S390_F32x4SConvertI32x4)                \
214  V(S390_F32x4UConvertI32x4)                \
215  V(S390_F32x4Sqrt)                         \
216  V(S390_F32x4Div)                          \
217  V(S390_F32x4Min)                          \
218  V(S390_F32x4Max)                          \
219  V(S390_F32x4Qfma)                         \
220  V(S390_F32x4Qfms)                         \
221  V(S390_F32x4Pmin)                         \
222  V(S390_F32x4Pmax)                         \
223  V(S390_F32x4Ceil)                         \
224  V(S390_F32x4Floor)                        \
225  V(S390_F32x4Trunc)                        \
226  V(S390_F32x4NearestInt)                   \
227  V(S390_F32x4DemoteF64x2Zero)              \
228  V(S390_I64x2Neg)                          \
229  V(S390_I64x2Add)                          \
230  V(S390_I64x2Sub)                          \
231  V(S390_I64x2Shl)                          \
232  V(S390_I64x2ShrS)                         \
233  V(S390_I64x2ShrU)                         \
234  V(S390_I64x2Mul)                          \
235  V(S390_I64x2Splat)                        \
236  V(S390_I64x2ReplaceLane)                  \
237  V(S390_I64x2ExtractLane)                  \
238  V(S390_I64x2Eq)                           \
239  V(S390_I64x2BitMask)                      \
240  V(S390_I64x2ExtMulLowI32x4S)              \
241  V(S390_I64x2ExtMulHighI32x4S)             \
242  V(S390_I64x2ExtMulLowI32x4U)              \
243  V(S390_I64x2ExtMulHighI32x4U)             \
244  V(S390_I64x2SConvertI32x4Low)             \
245  V(S390_I64x2SConvertI32x4High)            \
246  V(S390_I64x2UConvertI32x4Low)             \
247  V(S390_I64x2UConvertI32x4High)            \
248  V(S390_I64x2Ne)                           \
249  V(S390_I64x2GtS)                          \
250  V(S390_I64x2GeS)                          \
251  V(S390_I64x2Abs)                          \
252  V(S390_I32x4Splat)                        \
253  V(S390_I32x4ExtractLane)                  \
254  V(S390_I32x4ReplaceLane)                  \
255  V(S390_I32x4Add)                          \
256  V(S390_I32x4Sub)                          \
257  V(S390_I32x4Mul)                          \
258  V(S390_I32x4MinS)                         \
259  V(S390_I32x4MinU)                         \
260  V(S390_I32x4MaxS)                         \
261  V(S390_I32x4MaxU)                         \
262  V(S390_I32x4Eq)                           \
263  V(S390_I32x4Ne)                           \
264  V(S390_I32x4GtS)                          \
265  V(S390_I32x4GeS)                          \
266  V(S390_I32x4GtU)                          \
267  V(S390_I32x4GeU)                          \
268  V(S390_I32x4Neg)                          \
269  V(S390_I32x4Shl)                          \
270  V(S390_I32x4ShrS)                         \
271  V(S390_I32x4ShrU)                         \
272  V(S390_I32x4SConvertF32x4)                \
273  V(S390_I32x4UConvertF32x4)                \
274  V(S390_I32x4SConvertI16x8Low)             \
275  V(S390_I32x4SConvertI16x8High)            \
276  V(S390_I32x4UConvertI16x8Low)             \
277  V(S390_I32x4UConvertI16x8High)            \
278  V(S390_I32x4Abs)                          \
279  V(S390_I32x4BitMask)                      \
280  V(S390_I32x4DotI16x8S)                    \
281  V(S390_I32x4ExtMulLowI16x8S)              \
282  V(S390_I32x4ExtMulHighI16x8S)             \
283  V(S390_I32x4ExtMulLowI16x8U)              \
284  V(S390_I32x4ExtMulHighI16x8U)             \
285  V(S390_I32x4ExtAddPairwiseI16x8S)         \
286  V(S390_I32x4ExtAddPairwiseI16x8U)         \
287  V(S390_I32x4TruncSatF64x2SZero)           \
288  V(S390_I32x4TruncSatF64x2UZero)           \
289  V(S390_I16x8Splat)                        \
290  V(S390_I16x8ExtractLaneU)                 \
291  V(S390_I16x8ExtractLaneS)                 \
292  V(S390_I16x8ReplaceLane)                  \
293  V(S390_I16x8Add)                          \
294  V(S390_I16x8Sub)                          \
295  V(S390_I16x8Mul)                          \
296  V(S390_I16x8MinS)                         \
297  V(S390_I16x8MinU)                         \
298  V(S390_I16x8MaxS)                         \
299  V(S390_I16x8MaxU)                         \
300  V(S390_I16x8Eq)                           \
301  V(S390_I16x8Ne)                           \
302  V(S390_I16x8GtS)                          \
303  V(S390_I16x8GeS)                          \
304  V(S390_I16x8GtU)                          \
305  V(S390_I16x8GeU)                          \
306  V(S390_I16x8Shl)                          \
307  V(S390_I16x8ShrS)                         \
308  V(S390_I16x8ShrU)                         \
309  V(S390_I16x8Neg)                          \
310  V(S390_I16x8SConvertI32x4)                \
311  V(S390_I16x8UConvertI32x4)                \
312  V(S390_I16x8SConvertI8x16Low)             \
313  V(S390_I16x8SConvertI8x16High)            \
314  V(S390_I16x8UConvertI8x16Low)             \
315  V(S390_I16x8UConvertI8x16High)            \
316  V(S390_I16x8AddSatS)                      \
317  V(S390_I16x8SubSatS)                      \
318  V(S390_I16x8AddSatU)                      \
319  V(S390_I16x8SubSatU)                      \
320  V(S390_I16x8RoundingAverageU)             \
321  V(S390_I16x8Abs)                          \
322  V(S390_I16x8BitMask)                      \
323  V(S390_I16x8ExtMulLowI8x16S)              \
324  V(S390_I16x8ExtMulHighI8x16S)             \
325  V(S390_I16x8ExtMulLowI8x16U)              \
326  V(S390_I16x8ExtMulHighI8x16U)             \
327  V(S390_I16x8ExtAddPairwiseI8x16S)         \
328  V(S390_I16x8ExtAddPairwiseI8x16U)         \
329  V(S390_I16x8Q15MulRSatS)                  \
330  V(S390_I8x16Splat)                        \
331  V(S390_I8x16ExtractLaneU)                 \
332  V(S390_I8x16ExtractLaneS)                 \
333  V(S390_I8x16ReplaceLane)                  \
334  V(S390_I8x16Add)                          \
335  V(S390_I8x16Sub)                          \
336  V(S390_I8x16MinS)                         \
337  V(S390_I8x16MinU)                         \
338  V(S390_I8x16MaxS)                         \
339  V(S390_I8x16MaxU)                         \
340  V(S390_I8x16Eq)                           \
341  V(S390_I8x16Ne)                           \
342  V(S390_I8x16GtS)                          \
343  V(S390_I8x16GeS)                          \
344  V(S390_I8x16GtU)                          \
345  V(S390_I8x16GeU)                          \
346  V(S390_I8x16Shl)                          \
347  V(S390_I8x16ShrS)                         \
348  V(S390_I8x16ShrU)                         \
349  V(S390_I8x16Neg)                          \
350  V(S390_I8x16SConvertI16x8)                \
351  V(S390_I8x16UConvertI16x8)                \
352  V(S390_I8x16AddSatS)                      \
353  V(S390_I8x16SubSatS)                      \
354  V(S390_I8x16AddSatU)                      \
355  V(S390_I8x16SubSatU)                      \
356  V(S390_I8x16RoundingAverageU)             \
357  V(S390_I8x16Abs)                          \
358  V(S390_I8x16BitMask)                      \
359  V(S390_I8x16Shuffle)                      \
360  V(S390_I8x16Swizzle)                      \
361  V(S390_I8x16Popcnt)                       \
362  V(S390_I64x2AllTrue)                      \
363  V(S390_I32x4AllTrue)                      \
364  V(S390_I16x8AllTrue)                      \
365  V(S390_I8x16AllTrue)                      \
366  V(S390_V128AnyTrue)                       \
367  V(S390_S128And)                           \
368  V(S390_S128Or)                            \
369  V(S390_S128Xor)                           \
370  V(S390_S128Const)                         \
371  V(S390_S128Zero)                          \
372  V(S390_S128AllOnes)                       \
373  V(S390_S128Not)                           \
374  V(S390_S128Select)                        \
375  V(S390_S128AndNot)                        \
376  V(S390_S128Load8Splat)                    \
377  V(S390_S128Load16Splat)                   \
378  V(S390_S128Load32Splat)                   \
379  V(S390_S128Load64Splat)                   \
380  V(S390_S128Load8x8S)                      \
381  V(S390_S128Load8x8U)                      \
382  V(S390_S128Load16x4S)                     \
383  V(S390_S128Load16x4U)                     \
384  V(S390_S128Load32x2S)                     \
385  V(S390_S128Load32x2U)                     \
386  V(S390_S128Load32Zero)                    \
387  V(S390_S128Load64Zero)                    \
388  V(S390_S128Load8Lane)                     \
389  V(S390_S128Load16Lane)                    \
390  V(S390_S128Load32Lane)                    \
391  V(S390_S128Load64Lane)                    \
392  V(S390_S128Store8Lane)                    \
393  V(S390_S128Store16Lane)                   \
394  V(S390_S128Store32Lane)                   \
395  V(S390_S128Store64Lane)                   \
396  V(S390_StoreSimd128)                      \
397  V(S390_LoadSimd128)                       \
398  V(S390_StoreCompressTagged)               \
399  V(S390_LoadDecompressTaggedSigned)        \
400  V(S390_LoadDecompressTaggedPointer)       \
401  V(S390_LoadDecompressAnyTagged)
402
403// Addressing modes represent the "shape" of inputs to an instruction.
404// Many instructions support multiple addressing modes. Addressing modes
405// are encoded into the InstructionCode of the instruction and tell the
406// code generator after register allocation which assembler method to call.
407//
408// We use the following local notation for addressing modes:
409//
410// R = register
411// O = register or stack slot
412// D = double register
413// I = immediate (handle, external, int32)
414// MRI = [register + immediate]
415// MRR = [register + register]
416#define TARGET_ADDRESSING_MODE_LIST(V) \
417  V(MR)   /* [%r0          ] */        \
418  V(MRI)  /* [%r0       + K] */        \
419  V(MRR)  /* [%r0 + %r1    ] */        \
420  V(MRRI) /* [%r0 + %r1 + K] */
421
422}  // namespace compiler
423}  // namespace internal
424}  // namespace v8
425
426#endif  // V8_COMPILER_BACKEND_S390_INSTRUCTION_CODES_S390_H_
427