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