1fa63f976522bd4faf19249e8c9ac4d3edda498d9Tom Stellard//===-- AMDGPUInstructions.td - Common instruction defs ---*- tablegen -*-===// 2a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// 3a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// The LLVM Compiler Infrastructure 4a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// 5a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// This file is distributed under the University of Illinois Open Source 6a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// License. See LICENSE.TXT for details. 7a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// 8a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard//===----------------------------------------------------------------------===// 9a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// 10fa63f976522bd4faf19249e8c9ac4d3edda498d9Tom Stellard// This file contains instruction defs that are common to all hw codegen 11fa63f976522bd4faf19249e8c9ac4d3edda498d9Tom Stellard// targets. 12a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard// 13a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard//===----------------------------------------------------------------------===// 14a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 15a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardclass AMDGPUInst <dag outs, dag ins, string asm, list<dag> pattern> : Instruction { 16a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard field bits<16> AMDILOp = 0; 17a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard field bits<3> Gen = 0; 18a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 1976b44034b9b234d3db4012342f0fae677d4f10f6Tom Stellard let Namespace = "AMDGPU"; 20a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard let OutOperandList = outs; 21a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard let InOperandList = ins; 22a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard let AsmString = asm; 23a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard let Pattern = pattern; 24cd287301ec598d2811f3f85c03d23bae01be2359Tom Stellard let Itinerary = NullALU; 25a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard let TSFlags{42-40} = Gen; 26a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard let TSFlags{63-48} = AMDILOp; 27a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} 28a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 29a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardclass AMDGPUShaderInst <dag outs, dag ins, string asm, list<dag> pattern> 30a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard : AMDGPUInst<outs, ins, asm, pattern> { 31a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 32a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard field bits<32> Inst = 0xffffffff; 33a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 34a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard} 35a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 36ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellarddef COND_EQ : PatLeaf < 37ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard (cond), 38ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard [{switch(N->get()){{default: return false; 39ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard case ISD::SETOEQ: case ISD::SETUEQ: 40ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard case ISD::SETEQ: return true;}}}] 41ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard>; 42ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard 43ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellarddef COND_NE : PatLeaf < 44ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard (cond), 45ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard [{switch(N->get()){{default: return false; 46ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard case ISD::SETONE: case ISD::SETUNE: 47ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard case ISD::SETNE: return true;}}}] 48ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard>; 49ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellarddef COND_GT : PatLeaf < 50ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard (cond), 51ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard [{switch(N->get()){{default: return false; 52ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard case ISD::SETOGT: case ISD::SETUGT: 53ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard case ISD::SETGT: return true;}}}] 54ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard>; 55ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard 56ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellarddef COND_GE : PatLeaf < 57ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard (cond), 58ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard [{switch(N->get()){{default: return false; 59ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard case ISD::SETOGE: case ISD::SETUGE: 60ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard case ISD::SETGE: return true;}}}] 61ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard>; 62ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard 63ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellarddef COND_LT : PatLeaf < 64ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard (cond), 65ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard [{switch(N->get()){{default: return false; 66ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard case ISD::SETOLT: case ISD::SETULT: 67ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard case ISD::SETLT: return true;}}}] 68ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard>; 69ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard 70ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellarddef COND_LE : PatLeaf < 71ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard (cond), 72ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard [{switch(N->get()){{default: return false; 73ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard case ISD::SETOLE: case ISD::SETULE: 74ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard case ISD::SETLE: return true;}}}] 75ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard>; 76ba76684292e568c164cb7cbe7537181af4b452b8Tom Stellard 77d088da917bb3495491b9a5da5ca1716ddd91ddd5Tom Stellardclass Constants { 78d088da917bb3495491b9a5da5ca1716ddd91ddd5Tom Stellardint TWO_PI = 0x40c90fdb; 79d088da917bb3495491b9a5da5ca1716ddd91ddd5Tom Stellardint PI = 0x40490fdb; 80d088da917bb3495491b9a5da5ca1716ddd91ddd5Tom Stellardint TWO_PI_INV = 0x3e22f983; 81d088da917bb3495491b9a5da5ca1716ddd91ddd5Tom Stellard} 82d088da917bb3495491b9a5da5ca1716ddd91ddd5Tom Stellarddef CONST : Constants; 83d088da917bb3495491b9a5da5ca1716ddd91ddd5Tom Stellard 84d784bc77405012b442ae9d68f200e9d115030b3cTom Stellarddef FP_ZERO : PatLeaf < 85d784bc77405012b442ae9d68f200e9d115030b3cTom Stellard (fpimm), 86d784bc77405012b442ae9d68f200e9d115030b3cTom Stellard [{return N->getValueAPF().isZero();}] 87d784bc77405012b442ae9d68f200e9d115030b3cTom Stellard>; 88d784bc77405012b442ae9d68f200e9d115030b3cTom Stellard 89d784bc77405012b442ae9d68f200e9d115030b3cTom Stellarddef FP_ONE : PatLeaf < 90d784bc77405012b442ae9d68f200e9d115030b3cTom Stellard (fpimm), 91d784bc77405012b442ae9d68f200e9d115030b3cTom Stellard [{return N->isExactlyValue(1.0);}] 92d784bc77405012b442ae9d68f200e9d115030b3cTom Stellard>; 93d784bc77405012b442ae9d68f200e9d115030b3cTom Stellard 94704eac09166aa6dc4c1aa82f8d0938c4060e51f4Tom Stellardlet isCodeGenOnly = 1, isPseudo = 1, usesCustomInserter = 1 in { 9517f852892346fdf3b1e9eec56b7a55c470279bc8Tom Stellard 96d784bc77405012b442ae9d68f200e9d115030b3cTom Stellardclass CLAMP <RegisterClass rc> : AMDGPUShaderInst < 97d784bc77405012b442ae9d68f200e9d115030b3cTom Stellard (outs rc:$dst), 98d784bc77405012b442ae9d68f200e9d115030b3cTom Stellard (ins rc:$src0), 99d784bc77405012b442ae9d68f200e9d115030b3cTom Stellard "CLAMP $dst, $src0", 100d784bc77405012b442ae9d68f200e9d115030b3cTom Stellard [(set rc:$dst, (int_AMDIL_clamp rc:$src0, (f32 FP_ZERO), (f32 FP_ONE)))] 101d784bc77405012b442ae9d68f200e9d115030b3cTom Stellard>; 102d784bc77405012b442ae9d68f200e9d115030b3cTom Stellard 10317f852892346fdf3b1e9eec56b7a55c470279bc8Tom Stellardclass FABS <RegisterClass rc> : AMDGPUShaderInst < 10417f852892346fdf3b1e9eec56b7a55c470279bc8Tom Stellard (outs rc:$dst), 10517f852892346fdf3b1e9eec56b7a55c470279bc8Tom Stellard (ins rc:$src0), 10617f852892346fdf3b1e9eec56b7a55c470279bc8Tom Stellard "FABS $dst, $src0", 10717f852892346fdf3b1e9eec56b7a55c470279bc8Tom Stellard [(set rc:$dst, (fabs rc:$src0))] 10817f852892346fdf3b1e9eec56b7a55c470279bc8Tom Stellard>; 10917f852892346fdf3b1e9eec56b7a55c470279bc8Tom Stellard 110667cdba2118cf82e0027bf44314c9d1334d00840Tom Stellardclass FNEG <RegisterClass rc> : AMDGPUShaderInst < 111667cdba2118cf82e0027bf44314c9d1334d00840Tom Stellard (outs rc:$dst), 112667cdba2118cf82e0027bf44314c9d1334d00840Tom Stellard (ins rc:$src0), 113667cdba2118cf82e0027bf44314c9d1334d00840Tom Stellard "FNEG $dst, $src0", 114667cdba2118cf82e0027bf44314c9d1334d00840Tom Stellard [(set rc:$dst, (fneg rc:$src0))] 115667cdba2118cf82e0027bf44314c9d1334d00840Tom Stellard>; 116667cdba2118cf82e0027bf44314c9d1334d00840Tom Stellard 117704eac09166aa6dc4c1aa82f8d0938c4060e51f4Tom Stellard} // End isCodeGenOnly = 1, isPseudo = 1, hasCustomInserter = 1 118a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 119a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard/* Generic helper patterns for intrinsics */ 120a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard/* -------------------------------------- */ 121a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 122a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardclass POW_Common <AMDGPUInst log_ieee, AMDGPUInst exp_ieee, AMDGPUInst mul, 123a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard RegisterClass rc> : Pat < 124a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard (int_AMDGPU_pow rc:$src0, rc:$src1), 125a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard (exp_ieee (mul rc:$src1, (log_ieee rc:$src0))) 126a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard>; 127a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 128519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard/* Other helper patterns */ 129519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard/* --------------------- */ 130519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard 131519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard/* Extract element pattern */ 132519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellardclass Extract_Element <ValueType sub_type, ValueType vec_type, 133519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard RegisterClass vec_class, int sub_idx, 134519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard SubRegIndex sub_reg>: Pat< 135519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard (sub_type (vector_extract (vec_type vec_class:$src), sub_idx)), 136519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard (EXTRACT_SUBREG vec_class:$src, sub_reg) 137519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard>; 138519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard 139519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard/* Insert element pattern */ 140519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellardclass Insert_Element <ValueType elem_type, ValueType vec_type, 141519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard RegisterClass elem_class, RegisterClass vec_class, 142519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard int sub_idx, SubRegIndex sub_reg> : Pat < 143519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard 144519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard (vec_type (vector_insert (vec_type vec_class:$vec), 145519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard (elem_type elem_class:$elem), sub_idx)), 146519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard (INSERT_SUBREG vec_class:$vec, elem_class:$elem, sub_reg) 147519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard>; 148519789d7e6f32efa0e01a9fbc7374bc494d76769Tom Stellard 149de7366701d21842787d65320c12e6b4ecaea3807Tom Stellard// Vector Build pattern 150de7366701d21842787d65320c12e6b4ecaea3807Tom Stellardclass Vector_Build <ValueType vecType, RegisterClass elemClass> : Pat < 151de7366701d21842787d65320c12e6b4ecaea3807Tom Stellard (IL_vbuild elemClass:$src), 152de7366701d21842787d65320c12e6b4ecaea3807Tom Stellard (INSERT_SUBREG (vecType (IMPLICIT_DEF)), elemClass:$src, sel_x) 153de7366701d21842787d65320c12e6b4ecaea3807Tom Stellard>; 154de7366701d21842787d65320c12e6b4ecaea3807Tom Stellard 1554863477e22e02af046915ca2a33dbecfd0ed34b4Tom Stellard// bitconvert pattern 1564863477e22e02af046915ca2a33dbecfd0ed34b4Tom Stellardclass BitConvert <ValueType dt, ValueType st, RegisterClass rc> : Pat < 1574863477e22e02af046915ca2a33dbecfd0ed34b4Tom Stellard (dt (bitconvert (st rc:$src0))), 1584863477e22e02af046915ca2a33dbecfd0ed34b4Tom Stellard (dt rc:$src0) 1594863477e22e02af046915ca2a33dbecfd0ed34b4Tom Stellard>; 1604863477e22e02af046915ca2a33dbecfd0ed34b4Tom Stellard 161a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardinclude "R600Instructions.td" 162a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 163a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellardinclude "SIInstrInfo.td" 164a75c6163e605f35b14f26930dd9227e4f337ec9eTom Stellard 165