1//===-- RISCVInstrInfoXVentana.td --------------------------*- tablegen -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8// 9// This file describes the vendor extensions defined by Ventana Micro Systems. 10// 11//===----------------------------------------------------------------------===// 12 13//===----------------------------------------------------------------------===// 14// XVentanaCondOps 15//===----------------------------------------------------------------------===// 16 17let Predicates = [IsRV64, HasVendorXVentanaCondOps], hasSideEffects = 0, 18 mayLoad = 0, mayStore = 0, isCodeGenOnly = 0, DecoderNamespace = "Ventana" in 19class VTMaskedMove<bits<3> funct3, string opcodestr> 20 : RVInstR<0b0000000, funct3, OPC_CUSTOM_3, (outs GPR:$rd), 21 (ins GPR:$rs1, GPR:$rs2), opcodestr, 22 "$rd, $rs1, $rs2"> { 23} 24 25def VT_MASKC : VTMaskedMove<0b110, "vt.maskc">, 26 Sched<[WriteIALU, ReadIALU, ReadIALU]>; 27 28def VT_MASKCN : VTMaskedMove<0b111, "vt.maskcn">, 29 Sched<[WriteIALU, ReadIALU, ReadIALU]>; 30 31let Predicates = [IsRV64, HasVendorXVentanaCondOps] in { 32// Directly use MASKC/MASKCN in case of any of the operands being 0. 33def : Pat<(select GPR:$rc, GPR:$rs1, (i64 0)), 34 (VT_MASKC $rs1, $rc)>; 35def : Pat<(select GPR:$rc, (i64 0), GPR:$rs1), 36 (VT_MASKCN $rs1, $rc)>; 37 38def : Pat<(select (i64 (setne GPR:$rc, (i64 0))), GPR:$rs1, (i64 0)), 39 (VT_MASKC GPR:$rs1, GPR:$rc)>; 40def : Pat<(select (i64 (seteq GPR:$rc, (i64 0))), GPR:$rs1, (i64 0)), 41 (VT_MASKCN GPR:$rs1, GPR:$rc)>; 42def : Pat<(select (i64 (setne GPR:$rc, (i64 0))), (i64 0), GPR:$rs1), 43 (VT_MASKCN GPR:$rs1, GPR:$rc)>; 44def : Pat<(select (i64 (seteq GPR:$rc, (i64 0))), (i64 0), GPR:$rs1), 45 (VT_MASKC GPR:$rs1, GPR:$rc)>; 46 47def : Pat<(select (i64 (setne GPR:$x, simm12_plus1:$y)), GPR:$rs1, (i64 0)), 48 (VT_MASKC GPR:$rs1, (ADDI GPR:$x, (NegImm simm12_plus1:$y)))>; 49def : Pat<(select (i64 (seteq GPR:$x, simm12_plus1:$y)), GPR:$rs1, (i64 0)), 50 (VT_MASKCN GPR:$rs1, (ADDI GPR:$x, (NegImm simm12_plus1:$y)))>; 51def : Pat<(select (i64 (setne GPR:$x, simm12_plus1:$y)), (i64 0), GPR:$rs1), 52 (VT_MASKCN GPR:$rs1, (ADDI GPR:$x, (NegImm simm12_plus1:$y)))>; 53def : Pat<(select (i64 (seteq GPR:$x, simm12_plus1:$y)), (i64 0), GPR:$rs1), 54 (VT_MASKC GPR:$rs1, (ADDI GPR:$x, (NegImm simm12_plus1:$y)))>; 55 56def : Pat<(select (i64 (setne GPR:$x, (i64 -2048))), GPR:$rs1, (i64 0)), 57 (VT_MASKC GPR:$rs1, (XORI GPR:$x, -2048))>; 58def : Pat<(select (i64 (seteq GPR:$x, (i64 -2048))), GPR:$rs1, (i64 0)), 59 (VT_MASKCN GPR:$rs1, (XORI GPR:$x, -2048))>; 60def : Pat<(select (i64 (setne GPR:$x, (i64 -2048))), (i64 0), GPR:$rs1), 61 (VT_MASKCN GPR:$rs1, (XORI GPR:$x, -2048))>; 62def : Pat<(select (i64 (seteq GPR:$x, (i64 -2048))), (i64 0), GPR:$rs1), 63 (VT_MASKC GPR:$rs1, (XORI GPR:$x, -2048))>; 64 65def : Pat<(select (i64 (setne GPR:$x, GPR:$y)), GPR:$rs1, (i64 0)), 66 (VT_MASKC GPR:$rs1, (XOR GPR:$x, GPR:$y))>; 67def : Pat<(select (i64 (seteq GPR:$x, GPR:$y)), GPR:$rs1, (i64 0)), 68 (VT_MASKCN GPR:$rs1, (XOR GPR:$x, GPR:$y))>; 69def : Pat<(select (i64 (setne GPR:$x, GPR:$y)), (i64 0), GPR:$rs1), 70 (VT_MASKCN GPR:$rs1, (XOR GPR:$x, GPR:$y))>; 71def : Pat<(select (i64 (seteq GPR:$x, GPR:$y)), (i64 0), GPR:$rs1), 72 (VT_MASKC GPR:$rs1, (XOR GPR:$x, GPR:$y))>; 73 74// Conditional AND operation patterns. 75def : Pat<(i64 (select GPR:$rc, (and GPR:$rs1, GPR:$rs2), GPR:$rs1)), 76 (OR (AND $rs1, $rs2), (VT_MASKCN $rs1, $rc))>; 77def : Pat<(i64 (select GPR:$rc, GPR:$rs1, (and GPR:$rs1, GPR:$rs2))), 78 (OR (AND $rs1, $rs2), (VT_MASKC $rs1, $rc))>; 79 80// Basic select pattern that selects between 2 registers. 81def : Pat<(i64 (select GPR:$rc, GPR:$rs1, GPR:$rs2)), 82 (OR (VT_MASKC $rs1, $rc), (VT_MASKCN $rs2, $rc))>; 83 84def : Pat<(i64 (select (i64 (setne GPR:$rc, (i64 0))), GPR:$rs1, GPR:$rs2)), 85 (OR (VT_MASKC GPR:$rs1, GPR:$rc), (VT_MASKCN GPR:$rs2, GPR:$rc))>; 86def : Pat<(i64 (select (i64 (seteq GPR:$rc, (i64 0))), GPR:$rs2, GPR:$rs1)), 87 (OR (VT_MASKC GPR:$rs1, GPR:$rc), (VT_MASKCN GPR:$rs2, GPR:$rc))>; 88 89def : Pat<(i64 (select (i64 (setne GPR:$x, simm12_plus1:$y)), GPR:$rs1, GPR:$rs2)), 90 (OR (VT_MASKC GPR:$rs1, (ADDI GPR:$x, (NegImm simm12_plus1:$y))), 91 (VT_MASKCN GPR:$rs2, (ADDI GPR:$x, (NegImm simm12_plus1:$y))))>; 92def : Pat<(i64 (select (i64 (seteq GPR:$x, simm12_plus1:$y)), GPR:$rs2, GPR:$rs1)), 93 (OR (VT_MASKC GPR:$rs1, (ADDI GPR:$x, (NegImm simm12_plus1:$y))), 94 (VT_MASKCN GPR:$rs2, (ADDI GPR:$x, (NegImm simm12_plus1:$y))))>; 95 96def : Pat<(i64 (select (i64 (setne GPR:$x, (i64 -2048))), GPR:$rs1, GPR:$rs2)), 97 (OR (VT_MASKC GPR:$rs1, (XORI GPR:$x, -2048)), 98 (VT_MASKCN GPR:$rs2, (XORI GPR:$x, -2048)))>; 99def : Pat<(i64 (select (i64 (seteq GPR:$x, (i64 -2048))), GPR:$rs2, GPR:$rs1)), 100 (OR (VT_MASKC GPR:$rs1, (XORI GPR:$x, -2048)), 101 (VT_MASKCN GPR:$rs2, (XORI GPR:$x, -2048)))>; 102 103def : Pat<(i64 (select (i64 (setne GPR:$x, GPR:$y)), GPR:$rs1, GPR:$rs2)), 104 (OR (VT_MASKC GPR:$rs1, (XOR GPR:$x, GPR:$y)), 105 (VT_MASKCN GPR:$rs2, (XOR GPR:$x, GPR:$y)))>; 106def : Pat<(i64 (select (i64 (seteq GPR:$x, GPR:$y)), GPR:$rs2, GPR:$rs1)), 107 (OR (VT_MASKC GPR:$rs1, (XOR GPR:$x, GPR:$y)), 108 (VT_MASKCN GPR:$rs2, (XOR GPR:$x, GPR:$y)))>; 109 110} // Predicates = [IsRV64, HasVendorXVentanaCondOps] 111