xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/RISCV/RISCVInstrGISel.td (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
15f757f3fSDimitry Andric//===-- RISCVInstrGISel.td - RISC-V GISel target pseudos ----*- tablegen -*-===//
25f757f3fSDimitry Andric//
35f757f3fSDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45f757f3fSDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
55f757f3fSDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65f757f3fSDimitry Andric//
75f757f3fSDimitry Andric//===----------------------------------------------------------------------===//
85f757f3fSDimitry Andric//
95f757f3fSDimitry Andric/// \file
105f757f3fSDimitry Andric// RISC-V GlobalISel target pseudo instruction definitions. This is kept
115f757f3fSDimitry Andric// separately from the other tablegen files for organizational purposes, but
125f757f3fSDimitry Andric// share the same infrastructure.
135f757f3fSDimitry Andric//
145f757f3fSDimitry Andric//===----------------------------------------------------------------------===//
155f757f3fSDimitry Andric
165f757f3fSDimitry Andricclass RISCVGenericInstruction : GenericInstruction {
175f757f3fSDimitry Andric  let Namespace = "RISCV";
185f757f3fSDimitry Andric}
195f757f3fSDimitry Andric
205f757f3fSDimitry Andric// Pseudo equivalent to a RISCVISD::FCLASS.
215f757f3fSDimitry Andricdef G_FCLASS : RISCVGenericInstruction {
225f757f3fSDimitry Andric  let OutOperandList = (outs type0:$dst);
235f757f3fSDimitry Andric  let InOperandList = (ins type1:$src);
245f757f3fSDimitry Andric  let hasSideEffects = false;
255f757f3fSDimitry Andric}
265f757f3fSDimitry Andricdef : GINodeEquiv<G_FCLASS, riscv_fclass>;
27*0fca6ea1SDimitry Andric
28*0fca6ea1SDimitry Andric// Pseudo equivalent to a RISCVISD::READ_VLENB.
29*0fca6ea1SDimitry Andricdef G_READ_VLENB : RISCVGenericInstruction {
30*0fca6ea1SDimitry Andric  let OutOperandList = (outs type0:$dst);
31*0fca6ea1SDimitry Andric  let InOperandList = (ins);
32*0fca6ea1SDimitry Andric  let hasSideEffects = false;
33*0fca6ea1SDimitry Andric}
34*0fca6ea1SDimitry Andricdef : GINodeEquiv<G_READ_VLENB, riscv_read_vlenb>;
35*0fca6ea1SDimitry Andric
36*0fca6ea1SDimitry Andric// Pseudo equivalent to a RISCVISD::VMCLR_VL
37*0fca6ea1SDimitry Andricdef G_VMCLR_VL : RISCVGenericInstruction {
38*0fca6ea1SDimitry Andric  let OutOperandList = (outs type0:$dst);
39*0fca6ea1SDimitry Andric  let InOperandList = (ins type1:$vl);
40*0fca6ea1SDimitry Andric  let hasSideEffects = false;
41*0fca6ea1SDimitry Andric}
42*0fca6ea1SDimitry Andricdef : GINodeEquiv<G_VMCLR_VL, riscv_vmclr_vl>;
43*0fca6ea1SDimitry Andric
44*0fca6ea1SDimitry Andric// Pseudo equivalent to a RISCVISD::VMSET_VL
45*0fca6ea1SDimitry Andricdef G_VMSET_VL : RISCVGenericInstruction {
46*0fca6ea1SDimitry Andric  let OutOperandList = (outs type0:$dst);
47*0fca6ea1SDimitry Andric  let InOperandList = (ins type1:$vl);
48*0fca6ea1SDimitry Andric  let hasSideEffects = false;
49*0fca6ea1SDimitry Andric}
50*0fca6ea1SDimitry Andricdef : GINodeEquiv<G_VMSET_VL, riscv_vmset_vl>;
51*0fca6ea1SDimitry Andric
52*0fca6ea1SDimitry Andric// Pseudo equivalent to a RISCVISD::SPLAT_VECTOR_SPLIT_I64_VL. There is no
53*0fca6ea1SDimitry Andric// record to mark as equivalent to using GINodeEquiv because it gets lowered
54*0fca6ea1SDimitry Andric// before instruction selection.
55*0fca6ea1SDimitry Andricdef G_SPLAT_VECTOR_SPLIT_I64_VL : RISCVGenericInstruction {
56*0fca6ea1SDimitry Andric  let OutOperandList = (outs type0:$dst);
57*0fca6ea1SDimitry Andric  let InOperandList = (ins type0:$passthru, type1:$hi, type1:$lo, type2:$vl);
58*0fca6ea1SDimitry Andric  let hasSideEffects = false;
59*0fca6ea1SDimitry Andric}
60