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