• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1{
2  "License": [
3    "Copyright (C) 2023 The Android Open Source Project",
4    "",
5    "Licensed under the Apache License, Version 2.0 (the “License”);",
6    "you may not use this file except in compliance with the License.",
7    "You may obtain a copy of the License at",
8    "",
9    "     http://www.apache.org/licenses/LICENSE-2.0",
10    "",
11    "Unless required by applicable law or agreed to in writing, software",
12    "distributed under the License is distributed on an “AS IS” BASIS,",
13    "WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.",
14    "See the License for the specific language governing permissions and",
15    "limitations under the License."
16  ],
17  "Aadd": {
18    "comment": "Averaging add (scalar).",
19    "class": "template",
20    "variants": [
21      "int8_t",
22      "uint8_t",
23      "int16_t",
24      "uint16_t",
25      "int32_t",
26      "uint32_t",
27      "int64_t",
28      "uint64_t"
29    ],
30    "in": [ "int8_t", "Type0", "Type0" ],
31    "out": [ "Type0" ]
32  },
33  "Adduw": {
34    "comment": "Add unsigned word",
35    "class": "scalar",
36    "in": [ "uint32_t", "uint64_t" ],
37    "out": [ "uint64_t" ]
38  },
39  "AmoAdd": {
40    "comment": "Atomic add, like __atomic_fetch_add. Three template arguments: type, aq, rl.",
41    "class": "template",
42    "variants": [
43      "int32_t, false, false",
44      "int32_t, false, true",
45      "int32_t, true, false",
46      "int32_t, true, true",
47      "int64_t, false, false",
48      "int64_t, false, true",
49      "int64_t, true, false",
50      "int64_t, true, true"
51    ],
52    "in": [ "int64_t", "Type0" ],
53    "out": [ "Type0" ],
54    "side_effects_comment": "Atomic instruction. Should be volatile.",
55    "has_side_effects": true
56  },
57  "AmoAnd": {
58    "comment": "Atomic and, like __atomic_fetch_and. Three template arguments: type, aq, rl.",
59    "class": "template",
60    "variants": [
61      "int32_t, false, false",
62      "int32_t, false, true",
63      "int32_t, true, false",
64      "int32_t, true, true",
65      "int64_t, false, false",
66      "int64_t, false, true",
67      "int64_t, true, false",
68      "int64_t, true, true"
69    ],
70    "in": [ "int64_t", "Type0" ],
71    "out": [ "Type0" ],
72    "side_effects_comment": "Atomic instruction. Should be volatile.",
73    "has_side_effects": true
74  },
75  "AmoMax": {
76    "comment": "Atomic maximum, like __atomic_fetch_max. Three template arguments: type, aq, rl.",
77    "class": "template",
78    "variants": [
79      "int32_t, false, false",
80      "int32_t, false, true",
81      "int32_t, true, false",
82      "int32_t, true, true",
83      "int64_t, false, false",
84      "int64_t, false, true",
85      "int64_t, true, false",
86      "int64_t, true, true",
87      "uint32_t, false, false",
88      "uint32_t, false, true",
89      "uint32_t, true, false",
90      "uint32_t, true, true",
91      "uint64_t, false, false",
92      "uint64_t, false, true",
93      "uint64_t, true, false",
94      "uint64_t, true, true"
95    ],
96    "in": [ "int64_t", "Type0" ],
97    "out": [ "Type0" ],
98    "side_effects_comment": "Atomic instruction. Should be volatile.",
99    "has_side_effects": true
100  },
101  "AmoMin": {
102    "comment": "Atomic minimum, like __atomic_fetch_min. Three template arguments: type, aq, rl.",
103    "class": "template",
104    "variants": [
105      "int32_t, false, false",
106      "int32_t, false, true",
107      "int32_t, true, false",
108      "int32_t, true, true",
109      "int64_t, false, false",
110      "int64_t, false, true",
111      "int64_t, true, false",
112      "int64_t, true, true",
113      "uint32_t, false, false",
114      "uint32_t, false, true",
115      "uint32_t, true, false",
116      "uint32_t, true, true",
117      "uint64_t, false, false",
118      "uint64_t, false, true",
119      "uint64_t, true, false",
120      "uint64_t, true, true"
121    ],
122    "in": [ "int64_t", "Type0" ],
123    "out": [ "Type0" ],
124    "side_effects_comment": "Atomic instruction. Should be volatile.",
125    "has_side_effects": true
126  },
127  "AmoOr": {
128    "comment": "Atomic or, like __atomic_fetch_or. Three template arguments: type, aq, rl.",
129    "class": "template",
130    "variants": [
131      "int32_t, false, false",
132      "int32_t, false, true",
133      "int32_t, true, false",
134      "int32_t, true, true",
135      "int64_t, false, false",
136      "int64_t, false, true",
137      "int64_t, true, false",
138      "int64_t, true, true"
139    ],
140    "in": [ "int64_t", "Type0" ],
141    "out": [ "Type0" ],
142    "side_effects_comment": "Atomic instruction. Should be volatile.",
143    "has_side_effects": true
144  },
145  "AmoSwap": {
146    "comment": "Atomic exchange, like __atomic_exchange_n. Three template arguments: type, aq, rl.",
147    "class": "template",
148    "variants": [
149      "int32_t, false, false",
150      "int32_t, false, true",
151      "int32_t, true, false",
152      "int32_t, true, true",
153      "int64_t, false, false",
154      "int64_t, false, true",
155      "int64_t, true, false",
156      "int64_t, true, true"
157    ],
158    "in": [ "int64_t", "Type0" ],
159    "out": [ "Type0" ],
160    "side_effects_comment": "Atomic instruction. Should be volatile.",
161    "has_side_effects": true
162  },
163  "AmoXor": {
164    "comment": "Atomic exclusive or, like __atomic_fetch_xor. Three template arguments: type, aq, rl.",
165    "class": "template",
166    "variants": [
167      "int32_t, false, false",
168      "int32_t, false, true",
169      "int32_t, true, false",
170      "int32_t, true, true",
171      "int64_t, false, false",
172      "int64_t, false, true",
173      "int64_t, true, false",
174      "int64_t, true, true"
175    ],
176    "in": [ "int64_t", "Type0" ],
177    "out": [ "Type0" ],
178    "side_effects_comment": "Atomic instruction. Should be volatile.",
179    "has_side_effects": true
180  },
181  "Asub": {
182    "comment": "Averaging subtract (scalar).",
183    "class": "template",
184    "variants": [
185      "int8_t",
186      "uint8_t",
187      "int16_t",
188      "uint16_t",
189      "int32_t",
190      "uint32_t",
191      "int64_t",
192      "uint64_t"
193    ],
194    "in": [ "int8_t", "Type0", "Type0" ],
195    "out": [ "Type0" ]
196  },
197  "Bclr": {
198    "comment": "Single bit clear register",
199    "class": "scalar",
200    "in": [ "uint64_t", "uint64_t" ],
201    "out": [ "uint64_t" ]
202  },
203  "Bclri": {
204    "comment": "Single bit clear immediate",
205    "class": "scalar",
206    "in": [ "uint64_t", "uimm8" ],
207    "out": [ "uint64_t" ]
208  },
209  "Bext": {
210    "comment": "Single bit extract register",
211    "class": "scalar",
212    "in": [ "uint64_t", "uint64_t" ],
213    "out": [ "uint64_t" ]
214  },
215  "Bexti": {
216    "comment": "Single bit extract immediate",
217    "class": "scalar",
218    "in": [ "uint64_t", "uimm8" ],
219    "out": [ "uint64_t" ]
220  },
221  "Binv": {
222    "comment": "Single bit invert register",
223    "class": "scalar",
224    "in": [ "uint64_t", "uint64_t" ],
225    "out": [ "uint64_t" ]
226  },
227  "Binvi": {
228    "comment": "Single bit invert immediate",
229    "class": "scalar",
230    "in": [ "uint64_t", "uimm8" ],
231    "out": [ "uint64_t" ]
232  },
233  "Bset": {
234    "comment": "Single bit set register",
235    "class": "scalar",
236    "in": [ "uint64_t", "uint64_t" ],
237    "out": [ "uint64_t" ]
238  },
239  "Bseti": {
240    "comment": "Single bit set immediate",
241    "class": "scalar",
242    "in": [ "uint64_t", "uimm8" ],
243    "out": [ "uint64_t" ]
244  },
245  "CPUClockCount": {
246    "comment": "Get current CPU clock count",
247    "class": "scalar",
248    "in": [],
249    "out": [ "uint64_t" ]
250  },
251  "CanonicalizeNan": {
252    "comment": "Unbox small floating-point value from NaN",
253    "class": "template",
254    "variants": [ "Float32", "Float64" ],
255    "in": [ "Type0" ],
256    "out": [ "Type0" ]
257  },
258  "Clz": {
259    "comment": "Count leading zeros. Note: works like lzcnt, supports zero input!",
260    "class": "template",
261    "variants": [ "int32_t", "int64_t" ],
262    "in": [ "Type0" ],
263    "out": [ "int64_t" ]
264  },
265  "Cpop": {
266    "comment": "Count set bits",
267    "class": "template",
268    "variants": [ "int32_t", "int64_t" ],
269    "in": [ "Type0" ],
270    "out": [ "int64_t" ]
271  },
272  "Ctz": {
273    "comment": "Count trailing zeros. Note: works like tzcnt, supports zero input!",
274    "class": "template",
275    "variants": [ "int32_t", "int64_t" ],
276    "in": [ "Type0" ],
277    "out": [ "int64_t" ]
278  },
279  "Div": {
280    "comment": "Integer division",
281    "class": "template",
282    "variants": [
283      "int8_t",
284      "uint8_t",
285      "int16_t",
286      "uint16_t",
287      "int32_t",
288      "uint32_t",
289      "int64_t",
290      "uint64_t"
291    ],
292    "in": [ "Type0", "Type0" ],
293    "out": [ "Type0" ]
294  },
295  "Rem": {
296    "comment": "Integer remainder",
297    "class": "template",
298    "variants": [
299      "int8_t",
300      "uint8_t",
301      "int16_t",
302      "uint16_t",
303      "int32_t",
304      "uint32_t",
305      "int64_t",
306      "uint64_t"
307    ],
308    "in": [ "Type0", "Type0" ],
309    "out": [ "Type0" ]
310  },
311  "FAdd": {
312    "comment": "Floating point addition",
313    "class": "template",
314    "variants": [ "Float32", "Float64" ],
315    "in": [ "imm8", "int8_t", "Type0", "Type0" ],
316    "out": [ "Type0" ]
317  },
318  "FAddHostRounding": {
319    "comment": "Fused multiply-addition (uses host dynamic rounding)",
320    "class": "template",
321    "variants": [ "Float32", "Float64" ],
322    "in": [ "Type0", "Type0" ],
323    "out": [ "Type0" ]
324  },
325  "FClass": {
326    "comment": "Classify float number in 10 classes as defined by RISC-V",
327    "class": "template",
328    "variants": [ "Float32", "Float64" ],
329    "in": [ "Type0" ],
330    "out": [ "uint64_t" ],
331    "side_effects_comment": "Classification of value, doesn't set exceptions bits.",
332    "has_side_effects": false
333  },
334  "FCvtFloatToFloat": {
335    "comment": "Convert float to float",
336    "class": "template",
337    "variants": [ "Float32, Float64", "Float64, Float32" ],
338    "in": [ "imm8", "int8_t", "Type1" ],
339    "out": [ "Type0" ],
340    "side_effects_comment": "Conversion of value, doesn't set exceptions bits.",
341    "has_side_effects": false
342  },
343  "FCvtFloatToInteger": {
344    "comment": "Convert float to integer",
345    "class": "template",
346    "variants": [
347      "int32_t, Float32",
348      "int32_t, Float64",
349      "int64_t, Float32",
350      "int64_t, Float64",
351      "uint32_t, Float32",
352      "uint32_t, Float64",
353      "uint64_t, Float32",
354      "uint64_t, Float64"
355    ],
356    "in": [ "imm8", "int8_t", "Type1" ],
357    "out": [ "Type0" ],
358    "side_effects_comment": "Conversion of value, doesn't set exceptions bits.",
359    "has_side_effects": false
360  },
361  "FCvtFloatToIntegerHostRounding": {
362    "comment": "Convert float to integer",
363    "class": "template",
364    "variants": [ "int32_t, Float32", "int32_t, Float64", "int64_t, Float32", "int64_t, Float64" ],
365    "in": [ "Type1" ],
366    "out": [ "Type0" ],
367    "side_effects_comment": "Conversion of value, doesn't set exceptions bits.",
368    "has_side_effects": false
369  },
370  "FCvtIntegerToFloat": {
371    "comment": "Convert integer to float",
372    "class": "template",
373    "variants": [
374      "Float32, int32_t",
375      "Float32, int64_t",
376      "Float32, uint32_t",
377      "Float32, uint64_t",
378      "Float64, int32_t",
379      "Float64, int64_t",
380      "Float64, uint32_t",
381      "Float64, uint64_t"
382    ],
383    "in": [ "imm8", "int8_t", "Type1" ],
384    "out": [ "Type0" ],
385    "side_effects_comment": "Conversion of value, doesn't set exceptions bits.",
386    "has_side_effects": false
387  },
388  "FDiv": {
389    "comment": "Floating point division",
390    "class": "template",
391    "variants": [ "Float32", "Float64" ],
392    "in": [ "imm8", "int8_t", "Type0", "Type0" ],
393    "out": [ "Type0" ]
394  },
395  "FDivHostRounding": {
396    "comment": "Floating point division (uses host dynamic rounding)",
397    "class": "template",
398    "variants": [ "Float32", "Float64" ],
399    "in": [ "Type0", "Type0" ],
400    "out": [ "Type0" ]
401  },
402  "FeGetExceptions": {
403    "comment": "Read exceptions state from x87 status word and MXCSR.",
404    "class": "scalar",
405    "in": [],
406    "out": [ "uint64_t" ],
407    "side_effects_comment": "Reads state from host CPU. State may be affected to floating point instructions.",
408    "has_side_effects": true
409  },
410  "FeSetExceptions": {
411    "comment": "Store exceptions state into x87 status word and MXCSR. Only low five bits are set on input!",
412    "class": "scalar",
413    "in": [ "uint64_t" ],
414    "out": [],
415    "side_effects_comment": "Stores state to host CPU. State may be affected to floating point instructions.",
416    "has_side_effects": true
417  },
418  "FeSetExceptionsAndRound": {
419    "comment": "Store exceptions state into x87 status word and MXCSR. Only low five bits are set on input!",
420    "class": "scalar",
421    "in": [ "uint64_t", "uint8_t" ],
422    "out": [],
423    "side_effects_comment": "Stores state to host CPU. State may be affected to floating point instructions.",
424    "has_side_effects": true
425  },
426  "FeSetExceptionsImm": {
427    "comment": "Store exceptions state into x87 status word and MXCSR. Only low five bits are set on input!",
428    "class": "scalar",
429    "in": [ "uimm8" ],
430    "out": [],
431    "side_effects_comment": "Stores state to host CPU. State may be affected to floating point instructions.",
432    "has_side_effects": true
433  },
434  "FeSetExceptionsAndRoundImm": {
435    "comment": "Store exceptions state into x87 status word and MXCSR. Only low five bits are set on input!",
436    "class": "scalar",
437    "in": [ "uimm8" ],
438    "out": [],
439    "side_effects_comment": "Stores state to host CPU. State may be affected to floating point instructions.",
440    "has_side_effects": true
441  },
442  "FeSetRound": {
443    "comment": "Store guest rounding mode in the host FPU state. Only low three bits are set on input!",
444    "class": "scalar",
445    "in": [ "uint64_t" ],
446    "out": [],
447    "has_side_effects": true
448  },
449  "FeSetRoundImm": {
450    "comment": "Store guest rounding mode in the host FPU state. Only low three bits are set on input!",
451    "class": "scalar",
452    "in": [ "uimm8" ],
453    "out": [],
454    "has_side_effects": true
455  },
456  "FMAdd": {
457    "comment": "Fused multiply-addition",
458    "class": "template",
459    "variants": [ "Float32", "Float64" ],
460    "in": [ "imm8", "int8_t", "Type0", "Type0", "Type0" ],
461    "out": [ "Type0" ]
462  },
463  "FMAddHostRounding": {
464    "comment": "Fused multiply-addition (uses host dynamic rounding)",
465    "class": "template",
466    "variants": [ "Float32", "Float64" ],
467    "in": [ "Type0", "Type0", "Type0" ],
468    "out": [ "Type0" ]
469  },
470  "FMSub": {
471    "comment": "Fused multiply-subtraction",
472    "class": "template",
473    "variants": [ "Float32", "Float64" ],
474    "in": [ "imm8", "int8_t", "Type0", "Type0", "Type0" ],
475    "out": [ "Type0" ]
476  },
477  "FMSubHostRounding": {
478    "comment": "Fused multiply-subtraction (uses host dynamic rounding)",
479    "class": "template",
480    "variants": [ "Float32", "Float64" ],
481    "in": [ "Type0", "Type0", "Type0" ],
482    "out": [ "Type0" ]
483  },
484  "FMax": {
485    "comment": "Maximum from two floats",
486    "class": "template",
487    "variants": [ "Float32", "Float64" ],
488    "in": [ "Type0", "Type0" ],
489    "out": [ "Type0" ]
490  },
491  "FMin": {
492    "comment": "Minimum from two floats",
493    "class": "template",
494    "variants": [ "Float32", "Float64" ],
495    "in": [ "Type0", "Type0" ],
496    "out": [ "Type0" ]
497  },
498  "FMul": {
499    "comment": "Floating point multiplication",
500    "class": "template",
501    "variants": [ "Float32", "Float64" ],
502    "in": [ "imm8", "int8_t", "Type0", "Type0" ],
503    "out": [ "Type0" ]
504  },
505  "FMulHostRounding": {
506    "comment": "Floating point multiplication (uses host dynamic rounding)",
507    "class": "template",
508    "variants": [ "Float32", "Float64" ],
509    "in": [ "Type0", "Type0" ],
510    "out": [ "Type0" ]
511  },
512  "FNMAdd": {
513    "comment": "Fused negated multiply-addition",
514    "class": "template",
515    "variants": [ "Float32", "Float64" ],
516    "in": [ "imm8", "int8_t", "Type0", "Type0", "Type0" ],
517    "out": [ "Type0" ]
518  },
519  "FNMAddHostRounding": {
520    "comment": "Fused negated multiply-addition (uses host dynamic rounding)",
521    "class": "template",
522    "variants": [ "Float32", "Float64" ],
523    "in": [ "Type0", "Type0", "Type0" ],
524    "out": [ "Type0" ]
525  },
526  "FNMSub": {
527    "comment": "Fused negated multiply-subtraction",
528    "class": "template",
529    "variants": [ "Float32", "Float64" ],
530    "in": [ "imm8", "int8_t", "Type0", "Type0", "Type0" ],
531    "out": [ "Type0" ]
532  },
533  "FNMSubHostRounding": {
534    "comment": "Fused negated multiply-subtraction (uses host dynamic rounding)",
535    "class": "template",
536    "variants": [ "Float32", "Float64" ],
537    "in": [ "Type0", "Type0", "Type0" ],
538    "out": [ "Type0" ]
539  },
540  "FSgnj": {
541    "comment": "Copy sign of one float to another",
542    "class": "template",
543    "variants": [ "Float32", "Float64" ],
544    "in": [ "Type0", "Type0" ],
545    "out": [ "Type0" ],
546    "side_effects_comment": "Special conversion. Doesn't set exceptions bits.",
547    "has_side_effects": false
548  },
549  "FSgnjn": {
550    "comment": "Copy negated sign of one float to another",
551    "class": "template",
552    "variants": [ "Float32", "Float64" ],
553    "in": [ "Type0", "Type0" ],
554    "out": [ "Type0" ],
555    "side_effects_comment": "Special conversion. Doesn't set exceptions bits.",
556    "has_side_effects": false
557  },
558  "FSgnjx": {
559    "comment": "Xor two sign bits of two floats and return",
560    "class": "template",
561    "variants": [ "Float32", "Float64" ],
562    "in": [ "Type0", "Type0" ],
563    "out": [ "Type0" ],
564    "side_effects_comment": "Special conversion. Doesn't set exceptions bits.",
565    "has_side_effects": false
566  },
567  "FSqrt": {
568    "comment": "Square root",
569    "class": "template",
570    "variants": [ "Float32", "Float64" ],
571    "in": [ "imm8", "int8_t", "Type0" ],
572    "out": [ "Type0" ]
573  },
574  "FSqrtHostRounding": {
575    "comment": "Square root (uses host dynamic rounding)",
576    "class": "template",
577    "variants": [ "Float32" ],
578    "in": [ "Type0" ],
579    "out": [ "Type0" ]
580  },
581  "FSub": {
582    "comment": "Floating point subtraction",
583    "class": "template",
584    "variants": [ "Float32", "Float64" ],
585    "in": [ "imm8", "int8_t", "Type0", "Type0" ],
586    "out": [ "Type0" ]
587  },
588  "FSubHostRounding": {
589    "comment": "Floating point subtraction (uses host dynamic rounding)",
590    "class": "template",
591    "variants": [ "Float32", "Float64" ],
592    "in": [ "Type0", "Type0" ],
593    "out": [ "Type0" ]
594  },
595  "Feq": {
596    "comment": "Floating point comparison for \u201cequal\u201d (quiet comparison)",
597    "class": "template",
598    "variants": [ "Float32", "Float64" ],
599    "in": [ "Type0", "Type0" ],
600    "out": [ "int64_t" ]
601  },
602  "Fle": {
603    "comment": "Floating point comparison for \u201cless of equal\u201d (signaling comparison)",
604    "class": "template",
605    "variants": [ "Float32", "Float64" ],
606    "in": [ "Type0", "Type0" ],
607    "out": [ "int64_t" ]
608  },
609  "Flt": {
610    "comment": "Floating point comparison for \u201cless\u201d (quiet comparison)",
611    "class": "template",
612    "variants": [ "Float32", "Float64" ],
613    "in": [ "Type0", "Type0" ],
614    "out": [ "int64_t" ]
615  },
616  "FmvFloatToInteger": {
617    "comment": "Move floating point register to integer register",
618    "class": "template",
619    "variants": [ "int32_t, Float32", "int64_t, Float64" ],
620    "in": [ "Type1" ],
621    "out": [ "Type0" ],
622    "side_effects_comment": "Conversion of value, doesn't set exceptions bits.",
623    "has_side_effects": false
624  },
625  "FmvIntegerToFloat": {
626    "comment": "Move floating point register to integer register",
627    "class": "template",
628    "variants": [ "Float32, int32_t", "Float64, int64_t" ],
629    "in": [ "Type1" ],
630    "out": [ "Type0" ],
631    "side_effects_comment": "Conversion of value, doesn't set exceptions bits.",
632    "has_side_effects": false
633  },
634  "Max": {
635    "comment": "Returns the larger of two integers.",
636    "class": "template",
637    "variants": [ "int64_t", "uint64_t" ],
638    "in": [ "Type0", "Type0" ],
639    "out": [ "Type0" ]
640  },
641  "Min": {
642    "comment": "Returns the smaller of two integers.",
643    "class": "template",
644    "variants": [ "int64_t", "uint64_t" ],
645    "in": [ "Type0", "Type0" ],
646    "out": [ "Type0" ]
647  },
648  "NanBox": {
649    "comment": [
650      "NaN-box small floating-point value into NaN.",
651      "Note: we pass input value as Float64 but top half may contain garbage.",
652      "This is needed because otherwise FPRegToFloat would be used to check it."
653    ],
654    "class": "template",
655    "variants": [ "Float32" ],
656    "in": [ "Float64" ],
657    "out": [ "Float64" ]
658  },
659  "Orcb": {
660    "comment": "OR-Combine, byte granule.",
661    "class": "scalar",
662    "in": [ "uint64_t" ],
663    "out": [ "uint64_t" ]
664  },
665  "Rev8": {
666    "comment": "Byte reverse.",
667    "class": "scalar",
668    "in": [ "uint64_t" ],
669    "out": [ "uint64_t" ]
670  },
671  "Rol": {
672    "comment": "Rotate left.",
673    "class": "template",
674    "variants": [ "int64_t", "int32_t" ],
675    "in": [ "Type0", "int8_t" ],
676    "out": [ "Type0" ]
677  },
678  "Ror": {
679    "comment": "Rotate right.",
680    "class": "template",
681    "variants": [ "int64_t", "int32_t" ],
682    "in": [ "Type0", "int8_t" ],
683    "out": [ "Type0" ]
684  },
685  "Roundoff": {
686    "comment": "Fixed point conversion with rounding (but without narrowing).",
687    "class": "template",
688    "variants": [
689      "int8_t",
690      "uint8_t",
691      "int16_t",
692      "uint16_t",
693      "int32_t",
694      "uint32_t",
695      "int64_t",
696      "uint64_t"
697    ],
698    "in": [ "int8_t", "Type0", "Type0" ],
699    "out": [ "Type0" ]
700  },
701  "Sext": {
702    "comment": "Sign-extends to 64bit",
703    "class": "template",
704    "variants": [ "int8_t", "int16_t" ],
705    "in": [ "Type0" ],
706    "out": [ "int64_t" ]
707  },
708  "Sh1add": {
709    "comment": "Shift left and add",
710    "class": "scalar",
711    "in": [ "uint64_t", "uint64_t" ],
712    "out": [ "uint64_t" ]
713  },
714  "Sh1adduw": {
715    "comment": "Shift unsigned word left and add",
716    "class": "scalar",
717    "in": [ "uint32_t", "uint64_t" ],
718    "out": [ "uint64_t" ]
719  },
720  "Sh2add": {
721    "comment": "Shift left by 2 and add",
722    "class": "scalar",
723    "in": [ "uint64_t", "uint64_t" ],
724    "out": [ "uint64_t" ]
725  },
726  "Sh2adduw": {
727    "comment": "Shift unsigned word left by 2 and add",
728    "class": "scalar",
729    "in": [ "uint32_t", "uint64_t" ],
730    "out": [ "uint64_t" ]
731  },
732  "Sh3add": {
733    "comment": "Shift left by 3 and add",
734    "class": "scalar",
735    "in": [ "uint64_t", "uint64_t" ],
736    "out": [ "uint64_t" ]
737  },
738  "Sh3adduw": {
739    "comment": "Shift unsigned word left by 3 and add",
740    "class": "scalar",
741    "in": [ "uint32_t", "uint64_t" ],
742    "out": [ "uint64_t" ]
743  },
744  "Slliuw": {
745    "comment": "Shift left unsigned word immediate",
746    "class": "scalar",
747    "in": [ "uint32_t", "uimm8" ],
748    "out": [ "uint64_t" ]
749  },
750  "UnboxNan": {
751    "comment": "Unbox small floating-point value from NaN",
752    "class": "template",
753    "variants": [ "Float32" ],
754    "in": [ "Float64" ],
755    "out": [ "Type0" ]
756  },
757  "Vsetivli": {
758    "comment": "Test vtype and set vl accordingly.",
759    "class": "scalar",
760    "in": [ "uimm8", "uimm16" ],
761    "out": [ "uint64_t", "uint64_t" ]
762  },
763  "Vsetvl": {
764    "comment": "Test vtype and set vl accordingly.",
765    "class": "scalar",
766    "in": [ "uint64_t", "uint64_t" ],
767    "out": [ "uint64_t", "uint64_t" ]
768  },
769  "Vsetvli": {
770    "comment": "Test vtype and set vl accordingly.",
771    "class": "scalar",
772    "in": [ "uint64_t", "uimm16" ],
773    "out": [ "uint64_t", "uint64_t" ]
774  },
775  "Vsetvlmax": {
776    "comment": "Test vtype and set vl accordingly.",
777    "class": "scalar",
778    "in": [ "uint64_t" ],
779    "out": [ "uint64_t", "uint64_t" ]
780  },
781  "Vsetvlimax": {
782    "comment": "Test vtype and set vl accordingly.",
783    "class": "scalar",
784    "in": [ "uimm16" ],
785    "out": [ "uint64_t", "uint64_t" ]
786  },
787  "Vtestvl": {
788    "comment": "Test vl and keep it or reset it and vtype.",
789    "class": "scalar",
790    "in": [ "uint8_t", "uint64_t", "uint64_t" ],
791    "out": [ "uint64_t", "uint64_t" ]
792  },
793  "Vtestvli": {
794    "comment": "Test vl and keep it or reset it and vtype.",
795    "class": "scalar",
796    "in": [ "uint8_t", "uint64_t", "uimm16" ],
797    "out": [ "uint64_t", "uint64_t" ]
798  },
799  "Zexth": {
800    "comment": "Zero-extend half word",
801    "class": "scalar",
802    "in": [ "int16_t" ],
803    "out": [ "int64_t" ]
804  }
805}
806