1//==- HexagonSystemInst.td - System Instructions for Hexagon -*- tablegen -*-==// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file describes the Hexagon instructions in TableGen format. 11// 12//===----------------------------------------------------------------------===// 13 14//===----------------------------------------------------------------------===// 15// Cache manipulation instructions. 16//===----------------------------------------------------------------------===// 17let mayStore = 1 in 18class ST_MISC_CACHEOP<dag outs, dag ins, 19 string asmstr, list<dag> pattern = [], 20 bits<3> amode, bits<3> type, bits<1> un> 21 : ST0Inst<outs, ins, asmstr, pattern, "", ST_tc_ld_SLOT0> { 22 23 bits<5> Rs; 24 bits<5> Rt; 25 bits<5> Rd; 26 let Inst{31-28} = 0b1010; 27 let Inst{27-25} = amode; 28 let Inst{24-22} = type; 29 let Inst{21} = un; 30 let Inst{20-16} = Rs; 31 let Inst{12-8} = Rt; 32 let Inst{4-0} = Rd; 33} 34 35let mayStore = 1 in 36class ST_MISC_CACHEOP_SYS<dag outs, dag ins, 37 string asmstr, list<dag> pattern = [], 38 bits<3> amode, bits<3> type, bits<1> un> 39 : SYSInst<outs, ins, asmstr, pattern, ""> { 40 41 bits<5> Rs; 42 bits<5> Rt; 43 bits<5> Rd; 44 let Inst{31-28} = 0b1010; 45 let Inst{27-25} = amode; 46 let Inst{24-22} = type; 47 let Inst{21} = un; 48 let Inst{20-16} = Rs; 49 let Inst{12-8} = Rt; 50 let Inst{4-0} = Rd; 51} 52 53 54let isSolo = 1, Rs = 0, Rt = 0, Rd = 0 in { 55def Y2_syncht: ST_MISC_CACHEOP <(outs), (ins), 56 "syncht" , [], 0b100, 0b001, 0b0>; 57} 58 59let Rt = 0, Rd = 0 in { 60let isSoloAin1 = 1 in { 61 def Y2_dccleana: ST_MISC_CACHEOP <(outs), (ins IntRegs:$Rs), 62 "dccleana($Rs)", [], 0b000, 0b000, 0b0>; 63 def Y2_dcinva: ST_MISC_CACHEOP <(outs), (ins IntRegs:$Rs), 64 "dcinva($Rs)", [], 0b000, 0b000, 0b1>; 65 def Y2_dccleaninva: ST_MISC_CACHEOP <(outs), (ins IntRegs:$Rs), 66 "dccleaninva($Rs)", [], 0b000, 0b001, 0b0>; 67 } 68} 69 70let isSoloAX = 1, hasSideEffects = 1, Rd = 0 in { 71 def Y4_l2fetch: ST_MISC_CACHEOP_SYS<(outs), (ins IntRegs:$Rs, IntRegs:$Rt), 72 "l2fetch($Rs, $Rt)", [], 0b011, 0b000, 0b0>; 73 def Y5_l2fetch: ST_MISC_CACHEOP_SYS<(outs), (ins IntRegs:$Rs, DoubleRegs:$Rt), 74 "l2fetch($Rs, $Rt)", [], 0b011, 0b010, 0b0>; 75} 76 77let hasSideEffects = 0, isSolo = 1 in 78class Y2_INVALIDATE_CACHE<string mnemonic, bit MajOp> 79 : JRInst < 80 (outs), (ins IntRegs:$Rs), 81 #mnemonic#"($Rs)" > { 82 bits<5> Rs; 83 84 let IClass = 0b0101; 85 let Inst{27-21} = 0b0110110; 86 let Inst{20-16} = Rs; 87 let Inst{13-12} = 0b00; 88 let Inst{11} = MajOp; 89 } 90// Instruction cache invalidate 91def Y2_icinva : Y2_INVALIDATE_CACHE<"icinva", 0b0>; 92 93// Zero an aligned 32-byte cacheline. 94let isSoloAin1 = 1 in 95def Y2_dczeroa: ST0Inst <(outs), (ins IntRegs:$Rs), 96 "dczeroa($Rs)"> { 97 bits<5> Rs; 98 let IClass = 0b1010; 99 let Inst{27-21} = 0b0000110; 100 let Inst{13} = 0b0; 101 let Inst{20-16} = Rs; 102 } 103 104// Memory synchronization. 105let hasSideEffects = 0, isSolo = 1 in 106def Y2_isync: JRInst <(outs), (ins), 107 "isync"> { 108 let IClass = 0b0101; 109 let Inst{27-16} = 0b011111000000; 110 let Inst{13} = 0b0; 111 let Inst{9-0} = 0b0000000010; 112 } 113 114//===----------------------------------------------------------------------===// 115// System/User instructions. 116//===----------------------------------------------------------------------===// 117// traps and pause 118let hasSideEffects = 0, isSolo = 1 in 119class J2_MISC_TRAP_PAUSE<string mnemonic, bits<2> MajOp> 120 : JRInst 121 <(outs), (ins u8Imm:$u8), 122 #mnemonic#"(#$u8)"> { 123 bits<8> u8; 124 125 let IClass = 0b0101; 126 let Inst{27-24} = 0b0100; 127 let Inst{23-22} = MajOp; 128 let Inst{12-8} = u8{7-3}; 129 let Inst{4-2} = u8{2-0}; 130 } 131def J2_trap0 : J2_MISC_TRAP_PAUSE<"trap0", 0b00>; 132def J2_trap1 : J2_MISC_TRAP_PAUSE<"trap1", 0b10>; 133def J2_pause : J2_MISC_TRAP_PAUSE<"pause", 0b01>; 134 135