Path: blob/21.2-virgl/src/gallium/drivers/nouveau/codegen/nv50_ir_target_gv100.cpp
4574 views
/*1* Copyright 2020 Red Hat Inc.2*3* Permission is hereby granted, free of charge, to any person obtaining a4* copy of this software and associated documentation files (the "Software"),5* to deal in the Software without restriction, including without limitation6* the rights to use, copy, modify, merge, publish, distribute, sublicense,7* and/or sell copies of the Software, and to permit persons to whom the8* Software is furnished to do so, subject to the following conditions:9*10* The above copyright notice and this permission notice shall be included in11* all copies or substantial portions of the Software.12*13* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR14* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,15* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL16* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR17* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,18* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR19* OTHER DEALINGS IN THE SOFTWARE.20*/21#include "codegen/nv50_ir_target_gv100.h"22#include "codegen/nv50_ir_lowering_gv100.h"23#include "codegen/nv50_ir_emit_gv100.h"2425namespace nv50_ir {2627void28TargetGV100::initOpInfo()29{30unsigned int i, j;3132static const operation commutative[] =33{34OP_ADD, OP_MUL, OP_MAD, OP_FMA, OP_MAX, OP_MIN,35OP_SET_AND, OP_SET_OR, OP_SET_XOR, OP_SET, OP_SELP, OP_SLCT36};3738static const operation noDest[] =39{40OP_EXIT41};4243static const operation noPred[] =44{45};4647for (i = 0; i < DATA_FILE_COUNT; ++i)48nativeFileMap[i] = (DataFile)i;49nativeFileMap[FILE_ADDRESS] = FILE_GPR;50nativeFileMap[FILE_FLAGS] = FILE_PREDICATE;5152for (i = 0; i < OP_LAST; ++i) {53opInfo[i].variants = NULL;54opInfo[i].op = (operation)i;55opInfo[i].srcTypes = 1 << (int)TYPE_F32;56opInfo[i].dstTypes = 1 << (int)TYPE_F32;57opInfo[i].immdBits = 0;58opInfo[i].srcNr = operationSrcNr[i];5960for (j = 0; j < opInfo[i].srcNr; ++j) {61opInfo[i].srcMods[j] = 0;62opInfo[i].srcFiles[j] = 1 << (int)FILE_GPR;63}64opInfo[i].dstMods = 0;65opInfo[i].dstFiles = 1 << (int)FILE_GPR;6667opInfo[i].hasDest = 1;68opInfo[i].vector = (i >= OP_TEX && i <= OP_TEXCSAA);69opInfo[i].commutative = false; /* set below */70opInfo[i].pseudo = (i < OP_MOV);71opInfo[i].predicate = !opInfo[i].pseudo;72opInfo[i].flow = (i >= OP_BRA && i <= OP_JOIN);73opInfo[i].minEncSize = 16;74}75for (i = 0; i < ARRAY_SIZE(commutative); ++i)76opInfo[commutative[i]].commutative = true;77for (i = 0; i < ARRAY_SIZE(noDest); ++i)78opInfo[noDest[i]].hasDest = 0;79for (i = 0; i < ARRAY_SIZE(noPred); ++i)80opInfo[noPred[i]].predicate = 0;81}8283struct opInfo {84struct {85uint8_t files;86uint8_t mods;87} src[3];88};8990#define SRC_NONE 091#define SRC_R (1 << FILE_GPR)92#define SRC_I (1 << FILE_MEMORY_CONST)93#define SRC_C (1 << FILE_IMMEDIATE)94#define SRC_RC (SRC_R | SRC_C)95#define SRC_RI (SRC_R | SRC_I )96#define SRC_RIC (SRC_R | SRC_I | SRC_C)9798#define MOD_NONE 099#define MOD_NEG NV50_IR_MOD_NEG100#define MOD_ABS NV50_IR_MOD_ABS101#define MOD_NOT NV50_IR_MOD_NOT102#define MOD_NA (MOD_NEG | MOD_ABS)103104#define OPINFO(O,SA,MA,SB,MB,SC,MC) \105static struct opInfo \106opInfo_##O = { \107.src = { { SRC_##SA, MOD_##MA }, \108{ SRC_##SB, MOD_##MB }, \109{ SRC_##SC, MOD_##MC }}, \110};111112113/* Handled by GV100LegalizeSSA. */114OPINFO(FABS , RIC , NA , NONE, NONE, NONE, NONE);115OPINFO(FCMP , R , NONE, RIC , NONE, RIC , NONE); //XXX: use FSEL for mods116OPINFO(FNEG , RIC , NA , NONE, NONE, NONE, NONE);117OPINFO(FSET , R , NA , RIC , NA , NONE, NONE);118OPINFO(ICMP , R , NONE, RIC , NONE, RIC , NONE);119OPINFO(IMUL , R , NONE, RIC , NONE, NONE, NONE);120OPINFO(INEG , RIC , NEG , NONE, NONE, NONE, NONE);121OPINFO(ISET , R , NONE, RIC , NONE, NONE, NONE);122OPINFO(LOP2 , R , NOT , RIC , NOT , NONE, NONE);123OPINFO(NOT , RIC , NONE, NONE, NONE, NONE, NONE);124OPINFO(SAT , RIC , NA , NONE, NONE, NONE, NONE);125OPINFO(SHL , RIC , NONE, RIC , NONE, NONE, NONE);126OPINFO(SHR , RIC , NONE, RIC , NONE, NONE, NONE);127OPINFO(SUB , R , NONE, RIC , NEG , NONE, NONE);128OPINFO(IMNMX , R , NONE, RIC , NONE, NONE, NONE);129130/* Handled by CodeEmitterGV100. */131OPINFO(AL2P , NONE, NONE, NONE, NONE, NONE, NONE);132OPINFO(ALD , NONE, NONE, NONE, NONE, NONE, NONE);133OPINFO(AST , NONE, NONE, NONE, NONE, NONE, NONE);134OPINFO(ATOM , NONE, NONE, NONE, NONE, NONE, NONE);135OPINFO(ATOMS , NONE, NONE, NONE, NONE, NONE, NONE);136OPINFO(BAR , NONE, NONE, NONE, NONE, NONE, NONE);137OPINFO(BRA , NONE, NONE, NONE, NONE, NONE, NONE);138OPINFO(BMSK , R , NONE, RIC , NONE, NONE, NONE);139OPINFO(BREV , RIC , NONE, NONE, NONE, NONE, NONE);140OPINFO(CCTL , NONE, NONE, NONE, NONE, NONE, NONE);141//OPINFO(CS2R , NONE, NONE, NONE, NONE, NONE, NONE);142OPINFO(DADD , R , NA , RIC , NA , NONE, NONE);143OPINFO(DFMA , R , NA , RIC , NA , RIC , NA );144OPINFO(DMUL , R , NA , RIC , NA , NONE, NONE);145OPINFO(DSETP , R , NA , RIC , NA , NONE, NONE);146OPINFO(EXIT , NONE, NONE, NONE, NONE, NONE, NONE);147OPINFO(F2F , RIC , NA , NONE, NONE, NONE, NONE);148OPINFO(F2I , RIC , NA , NONE, NONE, NONE, NONE);149OPINFO(FADD , R , NA , RIC , NA , NONE, NONE);150OPINFO(FFMA , R , NA , RIC , NA , RIC , NA );151OPINFO(FLO , RIC , NOT , NONE, NONE, NONE, NONE);152OPINFO(FMNMX , R , NA , RIC , NA , NONE, NONE);153OPINFO(FMUL , R , NA , RIC , NA , NONE, NONE);154OPINFO(FRND , RIC , NA , NONE, NONE, NONE, NONE);155OPINFO(FSET_BF , R , NA , RIC , NA , NONE, NONE);156OPINFO(FSETP , R , NA , RIC , NA , NONE, NONE);157OPINFO(FSWZADD , R , NONE, R , NONE, NONE, NONE);158OPINFO(I2F , RIC , NONE, NONE, NONE, NONE, NONE);159OPINFO(IABS , RIC , NONE, NONE, NONE, NONE, NONE);160OPINFO(IADD3 , R , NEG , RIC , NEG , R , NEG );161OPINFO(IMAD , R , NONE, RIC , NONE, RIC , NEG );162OPINFO(IMAD_WIDE, R , NONE, RIC , NONE, RC , NEG );163OPINFO(IPA , NONE, NONE, NONE, NONE, NONE, NONE);164OPINFO(ISBERD , NONE, NONE, NONE, NONE, NONE, NONE);165OPINFO(ISETP , R , NONE, RIC , NONE, NONE, NONE);166OPINFO(KILL , NONE, NONE, NONE, NONE, NONE, NONE);167OPINFO(LD , NONE, NONE, NONE, NONE, NONE, NONE);168OPINFO(LDC , NONE, NONE, NONE, NONE, NONE, NONE);169OPINFO(LDL , NONE, NONE, NONE, NONE, NONE, NONE);170OPINFO(LDS , NONE, NONE, NONE, NONE, NONE, NONE);171OPINFO(LEA , R , NEG , I , NONE, RIC , NEG );172OPINFO(LOP3_LUT , R , NONE, RIC , NONE, R , NONE);173OPINFO(MEMBAR , NONE, NONE, NONE, NONE, NONE, NONE);174OPINFO(MOV , RIC , NONE, NONE, NONE, NONE, NONE);175OPINFO(MUFU , RIC , NA , NONE, NONE, NONE, NONE);176OPINFO(NOP , NONE, NONE, NONE, NONE, NONE, NONE);177OPINFO(OUT , R , NONE, RI , NONE, NONE, NONE);178OPINFO(PIXLD , NONE, NONE, NONE, NONE, NONE, NONE);179OPINFO(PLOP3_LUT, NONE, NONE, NONE, NONE, NONE, NONE);180OPINFO(POPC , RIC , NOT , NONE, NONE, NONE, NONE);181OPINFO(PRMT , R , NONE, RIC , NONE, RIC , NONE);182OPINFO(RED , NONE, NONE, NONE, NONE, NONE, NONE);183OPINFO(SGXT , R , NONE, RIC , NONE, NONE, NONE);184OPINFO(S2R , NONE, NONE, NONE, NONE, NONE, NONE);185OPINFO(SEL , R , NONE, RIC , NONE, NONE, NONE);186OPINFO(SHF , R , NONE, RIC , NONE, RIC , NONE);187OPINFO(SHFL , R , NONE, R , NONE, R , NONE);188OPINFO(ST , NONE, NONE, NONE, NONE, NONE, NONE);189OPINFO(STL , NONE, NONE, NONE, NONE, NONE, NONE);190OPINFO(STS , NONE, NONE, NONE, NONE, NONE, NONE);191OPINFO(SUATOM , NONE, NONE, NONE, NONE, NONE, NONE);192OPINFO(SULD , NONE, NONE, NONE, NONE, NONE, NONE);193OPINFO(SUST , NONE, NONE, NONE, NONE, NONE, NONE);194OPINFO(TEX , NONE, NONE, NONE, NONE, NONE, NONE);195OPINFO(TLD , NONE, NONE, NONE, NONE, NONE, NONE);196OPINFO(TLD4 , NONE, NONE, NONE, NONE, NONE, NONE);197OPINFO(TMML , NONE, NONE, NONE, NONE, NONE, NONE);198OPINFO(TXD , NONE, NONE, NONE, NONE, NONE, NONE);199OPINFO(TXQ , NONE, NONE, NONE, NONE, NONE, NONE);200OPINFO(VOTE , NONE, NONE, NONE, NONE, NONE, NONE);201OPINFO(WARPSYNC , R , NONE, NONE, NONE, NONE, NONE);202203static const struct opInfo *204getOpInfo(const Instruction *i)205{206switch (i->op) {207case OP_ABS:208if (isFloatType(i->dType))209return &opInfo_FABS;210return &opInfo_IABS;211case OP_ADD:212if (isFloatType(i->dType)) {213if (i->dType == TYPE_F32)214return &opInfo_FADD;215else216return &opInfo_DADD;217} else {218return &opInfo_IADD3;219}220break;221case OP_AFETCH: return &opInfo_AL2P;222case OP_AND:223case OP_OR:224case OP_XOR:225if (i->def(0).getFile() == FILE_PREDICATE)226return &opInfo_PLOP3_LUT;227return &opInfo_LOP2;228case OP_ATOM:229if (i->src(0).getFile() == FILE_MEMORY_SHARED)230return &opInfo_ATOMS;231else232if (!i->defExists(0) && i->subOp < NV50_IR_SUBOP_ATOM_CAS)233return &opInfo_RED;234else235return &opInfo_ATOM;236break;237case OP_BAR: return &opInfo_BAR;238case OP_BFIND: return &opInfo_FLO;239case OP_BMSK: return &opInfo_BMSK;240case OP_BREV: return &opInfo_BREV;241case OP_BRA:242case OP_JOIN: return &opInfo_BRA; //XXX243case OP_CCTL: return &opInfo_CCTL;244case OP_CEIL:245case OP_CVT:246case OP_FLOOR:247case OP_TRUNC:248if (i->op == OP_CVT && (i->def(0).getFile() == FILE_PREDICATE ||249i->src(0).getFile() == FILE_PREDICATE)) {250return &opInfo_MOV;251} else if (isFloatType(i->dType)) {252if (isFloatType(i->sType)) {253if (i->sType == i->dType)254return &opInfo_FRND;255else256return &opInfo_F2F;257} else {258return &opInfo_I2F;259}260} else {261if (isFloatType(i->sType))262return &opInfo_F2I;263}264break;265case OP_COS:266case OP_EX2:267case OP_LG2:268case OP_RCP:269case OP_RSQ:270case OP_SIN:271case OP_SQRT: return &opInfo_MUFU;272case OP_DISCARD: return &opInfo_KILL;273case OP_EMIT:274case OP_FINAL:275case OP_RESTART: return &opInfo_OUT;276case OP_EXIT: return &opInfo_EXIT;277case OP_EXPORT: return &opInfo_AST;278case OP_FMA:279case OP_MAD:280if (isFloatType(i->dType)) {281if (i->dType == TYPE_F32)282return &opInfo_FFMA;283else284return &opInfo_DFMA;285} else {286if (typeSizeof(i->dType) != 8)287return &opInfo_IMAD;288else289return &opInfo_IMAD_WIDE;290}291break;292case OP_JOINAT: return &opInfo_NOP; //XXX293case OP_LINTERP: return &opInfo_IPA;294case OP_LOAD:295switch (i->src(0).getFile()) {296case FILE_MEMORY_CONST : return &opInfo_LDC;297case FILE_MEMORY_LOCAL : return &opInfo_LDL;298case FILE_MEMORY_SHARED: return &opInfo_LDS;299case FILE_MEMORY_GLOBAL: return &opInfo_LD;300default:301break;302}303break;304case OP_LOP3_LUT: return &opInfo_LOP3_LUT;305case OP_MAX:306case OP_MIN:307if (isFloatType(i->dType)) {308if (i->dType == TYPE_F32)309return &opInfo_FMNMX;310} else {311return &opInfo_IMNMX;312}313break;314case OP_MEMBAR: return &opInfo_MEMBAR;315case OP_MOV: return &opInfo_MOV;316case OP_MUL:317if (isFloatType(i->dType)) {318if (i->dType == TYPE_F32)319return &opInfo_FMUL;320else321return &opInfo_DMUL;322}323return &opInfo_IMUL;324case OP_NEG:325if (isFloatType(i->dType))326return &opInfo_FNEG;327return &opInfo_INEG;328case OP_NOT: return &opInfo_NOT;329case OP_PERMT: return &opInfo_PRMT;330case OP_PFETCH: return &opInfo_ISBERD;331case OP_PIXLD: return &opInfo_PIXLD;332case OP_POPCNT: return &opInfo_POPC;333case OP_QUADOP: return &opInfo_FSWZADD;334case OP_RDSV:335#if 0336if (targ->isCS2RSV(i->getSrc(0)->reg.data.sv.sv))337return &opInfo_CS2R;338#endif339return &opInfo_S2R;340case OP_SAT: return &opInfo_SAT;341case OP_SELP: return &opInfo_SEL;342case OP_SET:343case OP_SET_AND:344case OP_SET_OR:345case OP_SET_XOR:346if (i->def(0).getFile() != FILE_PREDICATE) {347if (isFloatType(i->dType)) {348if (i->dType == TYPE_F32)349return &opInfo_FSET_BF;350} else {351if (isFloatType(i->sType))352return &opInfo_FSET;353return &opInfo_ISET;354}355} else {356if (isFloatType(i->sType))357if (i->sType == TYPE_F64)358return &opInfo_DSETP;359else360return &opInfo_FSETP;361else362return &opInfo_ISETP;363}364break;365case OP_SGXT: return &opInfo_SGXT;366case OP_SHF: return &opInfo_SHF;367case OP_SHFL: return &opInfo_SHFL;368case OP_SHL: return &opInfo_SHL;369case OP_SHLADD: return &opInfo_LEA;370case OP_SHR: return &opInfo_SHR;371case OP_SLCT:372if (isFloatType(i->sType))373return &opInfo_FCMP;374return &opInfo_ICMP;375case OP_STORE:376switch (i->src(0).getFile()) {377case FILE_MEMORY_LOCAL : return &opInfo_STL;378case FILE_MEMORY_SHARED: return &opInfo_STS;379case FILE_MEMORY_GLOBAL: return &opInfo_ST;380default:381break;382}383break;384case OP_SUB: return &opInfo_SUB;385case OP_SULDB:386case OP_SULDP: return &opInfo_SULD;387case OP_SUREDB:388case OP_SUREDP: return &opInfo_SUATOM;389case OP_SUSTB:390case OP_SUSTP: return &opInfo_SUST;391case OP_TEX:392case OP_TXB:393case OP_TXL: return &opInfo_TEX;394case OP_TXD: return &opInfo_TXD;395case OP_TXF: return &opInfo_TLD;396case OP_TXG: return &opInfo_TLD4;397case OP_TXLQ: return &opInfo_TMML;398case OP_TXQ: return &opInfo_TXQ;399case OP_VFETCH: return &opInfo_ALD;400case OP_VOTE: return &opInfo_VOTE;401case OP_WARPSYNC: return &opInfo_WARPSYNC;402default:403break;404}405return NULL;406}407408bool409TargetGV100::isSatSupported(const Instruction *i) const410{411switch (i->dType) {412case TYPE_F32:413switch (i->op) {414case OP_ADD:415case OP_FMA:416case OP_MAD:417case OP_MUL: return true;418default:419break;420}421break;422default:423break;424}425return false;426}427428bool429TargetGV100::isModSupported(const Instruction *i, int s, Modifier mod) const430{431const struct opInfo *info = nv50_ir::getOpInfo(i);432uint8_t mods = 0;433if (info && s < (int)ARRAY_SIZE(info->src))434mods = info->src[s].mods;435return (mod & Modifier(mods)) == mod;436}437438bool439TargetGV100::isOpSupported(operation op, DataType ty) const440{441if (op == OP_MAD || op == OP_FMA)442return true;443if (ty == TYPE_F32) {444if (op == OP_MAX)445return true;446}447if (op == OP_RSQ)448return true;449if (op == OP_SET ||450op == OP_SET_AND ||451op == OP_SET_OR ||452op == OP_SET_XOR)453return true;454if (op == OP_SHLADD)455return true;456return false;457}458459bool460TargetGV100::isBarrierRequired(const Instruction *i) const461{462switch (i->op) {463case OP_BREV:464return true;465default:466break;467}468469return TargetGM107::isBarrierRequired(i);470}471472bool473TargetGV100::insnCanLoad(const Instruction *i, int s,474const Instruction *ld) const475{476const struct opInfo *info = nv50_ir::getOpInfo(i);477uint16_t files = 0;478479if (ld->src(0).getFile() == FILE_IMMEDIATE && ld->getSrc(0)->reg.data.u64 == 0)480return (!i->isPseudo() &&481!i->asTex() &&482i->op != OP_EXPORT && i->op != OP_STORE);483484if (ld->src(0).isIndirect(0))485return false;486487if (info && s < (int)ARRAY_SIZE(info->src)) {488files = info->src[s].files;489if ((s == 1 && i->srcExists(2) && i->src(2).getFile() != FILE_GPR) ||490(s == 2 && i->srcExists(1) && i->src(1).getFile() != FILE_GPR)) {491files &= ~(1 << FILE_MEMORY_CONST);492files &= ~(1 << FILE_IMMEDIATE);493} else494if ((i->op == OP_SHL || i->op == OP_SHR) &&495((s == 0 && i->srcExists(1) && i->src(1).getFile() != FILE_GPR) ||496(s == 1 && i->srcExists(0) && i->src(0).getFile() != FILE_GPR))) {497files &= ~(1 << FILE_MEMORY_CONST);498files &= ~(1 << FILE_IMMEDIATE);499}500}501502if (ld->src(0).getFile() == FILE_IMMEDIATE) {503if (i->sType == TYPE_F64) {504if (ld->getSrc(0)->asImm()->reg.data.u64 & 0x00000000ffffffff)505return false;506}507}508509return (files & (1 << ld->src(0).getFile()));510}511512void513TargetGV100::getBuiltinCode(const uint32_t **code, uint32_t *size) const514{515//XXX: find out why gv100 (tu1xx is fine) hangs without this516static uint32_t builtin[] = {5170x0000794d, 0x00000000, 0x03800000, 0x03ffde00,5180x0000794d, 0x00000000, 0x03800000, 0x03ffde00,5190x0000794d, 0x00000000, 0x03800000, 0x03ffde00,5200x0000794d, 0x00000000, 0x03800000, 0x03ffde00,5210x0000794d, 0x00000000, 0x03800000, 0x03ffde00,5220x0000794d, 0x00000000, 0x03800000, 0x03ffde00,5230x0000794d, 0x00000000, 0x03800000, 0x03ffde00,5240x0000794d, 0x00000000, 0x03800000, 0x03ffde00,5250x0000794d, 0x00000000, 0x03800000, 0x03ffde00,5260x0000794d, 0x00000000, 0x03800000, 0x03ffde00,5270x0000794d, 0x00000000, 0x03800000, 0x03ffde00,5280x0000794d, 0x00000000, 0x03800000, 0x03ffde00,5290x0000794d, 0x00000000, 0x03800000, 0x03ffde00,5300x0000794d, 0x00000000, 0x03800000, 0x03ffde00,5310x0000794d, 0x00000000, 0x03800000, 0x03ffde00,5320x0000794d, 0x00000000, 0x03800000, 0x03ffde00,5330x0000794d, 0x00000000, 0x03800000, 0x03ffde00,5340x0000794d, 0x00000000, 0x03800000, 0x03ffde00,5350x0000794d, 0x00000000, 0x03800000, 0x03ffde00,5360x0000794d, 0x00000000, 0x03800000, 0x03ffde00,5370x0000794d, 0x00000000, 0x03800000, 0x03ffde00,5380x0000794d, 0x00000000, 0x03800000, 0x03ffde00,5390x0000794d, 0x00000000, 0x03800000, 0x03ffde00,5400x0000794d, 0x00000000, 0x03800000, 0x03ffde00,5410x0000794d, 0x00000000, 0x03800000, 0x03ffde00,5420x0000794d, 0x00000000, 0x03800000, 0x03ffde00,5430x0000794d, 0x00000000, 0x03800000, 0x03ffde00,544};545*code = builtin;546*size = sizeof(builtin);547}548549uint32_t550TargetGV100::getBuiltinOffset(int builtin) const551{552return 0;553}554555bool556TargetGV100::runLegalizePass(Program *prog, CGStage stage) const557{558if (stage == CG_STAGE_PRE_SSA) {559GM107LoweringPass pass1(prog);560GV100LoweringPass pass2(prog);561pass1.run(prog, false, true);562pass2.run(prog, false, true);563return true;564} else565if (stage == CG_STAGE_SSA) {566GV100LegalizeSSA pass(prog);567return pass.run(prog, false, true);568} else569if (stage == CG_STAGE_POST_RA) {570NVC0LegalizePostRA pass(prog);571return pass.run(prog, false, true);572}573return false;574}575576CodeEmitter *577TargetGV100::getCodeEmitter(Program::Type type)578{579return new CodeEmitterGV100(this);580}581582TargetGV100::TargetGV100(unsigned int chipset)583: TargetGM107(chipset)584{585initOpInfo();586};587588Target *getTargetGV100(unsigned int chipset)589{590return new TargetGV100(chipset);591}592593};594595596