1*f6aab3d8Srobert //===-- RISCVCInstructions.h ----------------------------------------------===//
2*f6aab3d8Srobert //
3*f6aab3d8Srobert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*f6aab3d8Srobert // See https://llvm.org/LICENSE.txt for license information.
5*f6aab3d8Srobert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*f6aab3d8Srobert //
7*f6aab3d8Srobert //===----------------------------------------------------------------------===//
8*f6aab3d8Srobert
9*f6aab3d8Srobert #ifndef LLDB_SOURCE_PLUGINS_INSTRUCTION_RISCV_RISCVCINSTRUCTION_H
10*f6aab3d8Srobert #define LLDB_SOURCE_PLUGINS_INSTRUCTION_RISCV_RISCVCINSTRUCTION_H
11*f6aab3d8Srobert
12*f6aab3d8Srobert #include <cstdint>
13*f6aab3d8Srobert #include <variant>
14*f6aab3d8Srobert
15*f6aab3d8Srobert #include "Plugins/Process/Utility/lldb-riscv-register-enums.h"
16*f6aab3d8Srobert #include "RISCVInstructions.h"
17*f6aab3d8Srobert
18*f6aab3d8Srobert namespace lldb_private {
19*f6aab3d8Srobert
20*f6aab3d8Srobert /// Unified RISC-V C register encoding.
21*f6aab3d8Srobert struct RxC {
22*f6aab3d8Srobert uint32_t rd;
23*f6aab3d8Srobert bool shift = true;
24*f6aab3d8Srobert operator int() { return rd; }
RdRxC25*f6aab3d8Srobert operator Rd() { return Rd{rd + (shift ? 8 : 0)}; }
RsRxC26*f6aab3d8Srobert operator Rs() { return Rs{rd + (shift ? 8 : 0)}; }
27*f6aab3d8Srobert };
28*f6aab3d8Srobert
29*f6aab3d8Srobert // decode register for RVC
DecodeCR_RD(uint32_t inst)30*f6aab3d8Srobert constexpr RxC DecodeCR_RD(uint32_t inst) { return RxC{DecodeRD(inst), false}; }
DecodeCI_RD(uint32_t inst)31*f6aab3d8Srobert constexpr RxC DecodeCI_RD(uint32_t inst) { return RxC{DecodeRD(inst), false}; }
DecodeCR_RS1(uint32_t inst)32*f6aab3d8Srobert constexpr RxC DecodeCR_RS1(uint32_t inst) { return RxC{DecodeRD(inst), false}; }
DecodeCI_RS1(uint32_t inst)33*f6aab3d8Srobert constexpr RxC DecodeCI_RS1(uint32_t inst) { return RxC{DecodeRD(inst), false}; }
DecodeCR_RS2(uint32_t inst)34*f6aab3d8Srobert constexpr RxC DecodeCR_RS2(uint32_t inst) {
35*f6aab3d8Srobert return RxC{(inst & 0x7C) >> 2, false};
36*f6aab3d8Srobert }
37*f6aab3d8Srobert
DecodeCIW_RD(uint32_t inst)38*f6aab3d8Srobert constexpr RxC DecodeCIW_RD(uint32_t inst) { return RxC{(inst & 0x1C) >> 2}; }
DecodeCL_RD(uint32_t inst)39*f6aab3d8Srobert constexpr RxC DecodeCL_RD(uint32_t inst) { return RxC{DecodeCIW_RD(inst)}; }
DecodeCA_RD(uint32_t inst)40*f6aab3d8Srobert constexpr RxC DecodeCA_RD(uint32_t inst) { return RxC{(inst & 0x380) >> 7}; }
DecodeCB_RD(uint32_t inst)41*f6aab3d8Srobert constexpr RxC DecodeCB_RD(uint32_t inst) { return RxC{DecodeCA_RD(inst)}; }
42*f6aab3d8Srobert
DecodeCL_RS1(uint32_t inst)43*f6aab3d8Srobert constexpr RxC DecodeCL_RS1(uint32_t inst) { return RxC{DecodeCA_RD(inst)}; }
DecodeCS_RS1(uint32_t inst)44*f6aab3d8Srobert constexpr RxC DecodeCS_RS1(uint32_t inst) { return RxC{DecodeCA_RD(inst)}; }
DecodeCA_RS1(uint32_t inst)45*f6aab3d8Srobert constexpr RxC DecodeCA_RS1(uint32_t inst) { return RxC{DecodeCA_RD(inst)}; }
DecodeCB_RS1(uint32_t inst)46*f6aab3d8Srobert constexpr RxC DecodeCB_RS1(uint32_t inst) { return RxC{DecodeCA_RD(inst)}; }
47*f6aab3d8Srobert
DecodeCSS_RS2(uint32_t inst)48*f6aab3d8Srobert constexpr RxC DecodeCSS_RS2(uint32_t inst) { return DecodeCR_RS2(inst); }
DecodeCS_RS2(uint32_t inst)49*f6aab3d8Srobert constexpr RxC DecodeCS_RS2(uint32_t inst) { return RxC{DecodeCIW_RD(inst)}; }
DecodeCA_RS2(uint32_t inst)50*f6aab3d8Srobert constexpr RxC DecodeCA_RS2(uint32_t inst) { return RxC{DecodeCIW_RD(inst)}; }
51*f6aab3d8Srobert
DecodeC_LWSP(uint32_t inst)52*f6aab3d8Srobert RISCVInst DecodeC_LWSP(uint32_t inst) {
53*f6aab3d8Srobert auto rd = DecodeCI_RD(inst);
54*f6aab3d8Srobert uint16_t offset = ((inst << 4) & 0xc0) // offset[7:6]
55*f6aab3d8Srobert | ((inst >> 7) & 0x20) // offset[5]
56*f6aab3d8Srobert | ((inst >> 2) & 0x1c); // offset[4:2]
57*f6aab3d8Srobert if (rd == 0)
58*f6aab3d8Srobert return RESERVED{inst};
59*f6aab3d8Srobert return LW{rd, Rs{gpr_sp_riscv}, uint32_t(offset)};
60*f6aab3d8Srobert }
61*f6aab3d8Srobert
DecodeC_LDSP(uint32_t inst)62*f6aab3d8Srobert RISCVInst DecodeC_LDSP(uint32_t inst) {
63*f6aab3d8Srobert auto rd = DecodeCI_RD(inst);
64*f6aab3d8Srobert uint16_t offset = ((inst << 4) & 0x1c0) // offset[8:6]
65*f6aab3d8Srobert | ((inst >> 7) & 0x20) // offset[5]
66*f6aab3d8Srobert | ((inst >> 2) & 0x18); // offset[4:3]
67*f6aab3d8Srobert if (rd == 0)
68*f6aab3d8Srobert return RESERVED{inst};
69*f6aab3d8Srobert return LD{rd, Rs{gpr_sp_riscv}, uint32_t(offset)};
70*f6aab3d8Srobert }
71*f6aab3d8Srobert
DecodeC_SWSP(uint32_t inst)72*f6aab3d8Srobert RISCVInst DecodeC_SWSP(uint32_t inst) {
73*f6aab3d8Srobert uint16_t offset = ((inst >> 1) & 0xc0) // offset[7:6]
74*f6aab3d8Srobert | ((inst >> 7) & 0x3c); // offset[5:2]
75*f6aab3d8Srobert return SW{Rs{gpr_sp_riscv}, DecodeCSS_RS2(inst), uint32_t(offset)};
76*f6aab3d8Srobert }
77*f6aab3d8Srobert
DecodeC_SDSP(uint32_t inst)78*f6aab3d8Srobert RISCVInst DecodeC_SDSP(uint32_t inst) {
79*f6aab3d8Srobert uint16_t offset = ((inst >> 1) & 0x1c0) // offset[8:6]
80*f6aab3d8Srobert | ((inst >> 7) & 0x38); // offset[5:3]
81*f6aab3d8Srobert return SD{Rs{gpr_sp_riscv}, DecodeCSS_RS2(inst), uint32_t(offset)};
82*f6aab3d8Srobert }
83*f6aab3d8Srobert
DecodeC_LW(uint32_t inst)84*f6aab3d8Srobert RISCVInst DecodeC_LW(uint32_t inst) {
85*f6aab3d8Srobert uint16_t offset = ((inst << 1) & 0x40) // imm[6]
86*f6aab3d8Srobert | ((inst >> 7) & 0x38) // imm[5:3]
87*f6aab3d8Srobert | ((inst >> 4) & 0x4); // imm[2]
88*f6aab3d8Srobert return LW{DecodeCL_RD(inst), DecodeCL_RS1(inst), uint32_t(offset)};
89*f6aab3d8Srobert }
90*f6aab3d8Srobert
DecodeC_LD(uint32_t inst)91*f6aab3d8Srobert RISCVInst DecodeC_LD(uint32_t inst) {
92*f6aab3d8Srobert uint16_t offset = ((inst << 1) & 0xc0) // imm[7:6]
93*f6aab3d8Srobert | ((inst >> 7) & 0x38); // imm[5:3]
94*f6aab3d8Srobert return LD{DecodeCL_RD(inst), DecodeCL_RS1(inst), uint32_t(offset)};
95*f6aab3d8Srobert }
96*f6aab3d8Srobert
DecodeC_SW(uint32_t inst)97*f6aab3d8Srobert RISCVInst DecodeC_SW(uint32_t inst) {
98*f6aab3d8Srobert uint16_t offset = ((inst << 1) & 0x40) // imm[6]
99*f6aab3d8Srobert | ((inst >> 7) & 0x38) // imm[5:3]
100*f6aab3d8Srobert | ((inst >> 4) & 0x4); // imm[2]
101*f6aab3d8Srobert return SW{DecodeCS_RS1(inst), DecodeCS_RS2(inst), uint32_t(offset)};
102*f6aab3d8Srobert }
103*f6aab3d8Srobert
DecodeC_SD(uint32_t inst)104*f6aab3d8Srobert RISCVInst DecodeC_SD(uint32_t inst) {
105*f6aab3d8Srobert uint16_t offset = ((inst << 1) & 0xc0) // imm[7:6]
106*f6aab3d8Srobert | ((inst >> 7) & 0x38); // imm[5:3]
107*f6aab3d8Srobert return SD{DecodeCS_RS1(inst), DecodeCS_RS2(inst), uint32_t(offset)};
108*f6aab3d8Srobert }
109*f6aab3d8Srobert
DecodeC_J(uint32_t inst)110*f6aab3d8Srobert RISCVInst DecodeC_J(uint32_t inst) {
111*f6aab3d8Srobert uint16_t offset = ((inst >> 1) & 0x800) // offset[11]
112*f6aab3d8Srobert | ((inst << 2) & 0x400) // offset[10]
113*f6aab3d8Srobert | ((inst >> 1) & 0x300) // offset[9:8]
114*f6aab3d8Srobert | ((inst << 1) & 0x80) // offset[7]
115*f6aab3d8Srobert | ((inst >> 1) & 0x40) // offset[6]
116*f6aab3d8Srobert | ((inst << 3) & 0x20) // offset[5]
117*f6aab3d8Srobert | ((inst >> 7) & 0x10) // offset[4]
118*f6aab3d8Srobert | ((inst >> 2) & 0xe); // offset[3:1]
119*f6aab3d8Srobert if ((offset & 0x800) == 0)
120*f6aab3d8Srobert return JAL{Rd{0}, uint32_t(offset)};
121*f6aab3d8Srobert return JAL{Rd{0}, uint32_t(int32_t(int16_t(offset | 0xf000)))};
122*f6aab3d8Srobert }
123*f6aab3d8Srobert
DecodeC_JR(uint32_t inst)124*f6aab3d8Srobert RISCVInst DecodeC_JR(uint32_t inst) {
125*f6aab3d8Srobert auto rs1 = DecodeCR_RS1(inst);
126*f6aab3d8Srobert if (rs1 == 0)
127*f6aab3d8Srobert return RESERVED{inst};
128*f6aab3d8Srobert return JALR{Rd{0}, rs1, 0};
129*f6aab3d8Srobert }
130*f6aab3d8Srobert
DecodeC_JALR(uint32_t inst)131*f6aab3d8Srobert RISCVInst DecodeC_JALR(uint32_t inst) {
132*f6aab3d8Srobert auto rs1 = DecodeCR_RS1(inst);
133*f6aab3d8Srobert if (rs1 == 0)
134*f6aab3d8Srobert return EBREAK{inst};
135*f6aab3d8Srobert return JALR{Rd{1}, rs1, 0};
136*f6aab3d8Srobert }
137*f6aab3d8Srobert
BOffset(uint32_t inst)138*f6aab3d8Srobert constexpr uint16_t BOffset(uint32_t inst) {
139*f6aab3d8Srobert return ((inst >> 4) & 0x100) // offset[8]
140*f6aab3d8Srobert | ((inst << 1) & 0xc0) // offset[7:6]
141*f6aab3d8Srobert | ((inst << 3) & 0x20) // offset[5]
142*f6aab3d8Srobert | ((inst >> 7) & 0x18) // offset[4:3]
143*f6aab3d8Srobert | ((inst >> 2) & 0x6); // offset[2:1]
144*f6aab3d8Srobert }
145*f6aab3d8Srobert
DecodeC_BNEZ(uint32_t inst)146*f6aab3d8Srobert RISCVInst DecodeC_BNEZ(uint32_t inst) {
147*f6aab3d8Srobert auto rs1 = DecodeCB_RS1(inst);
148*f6aab3d8Srobert uint16_t offset = BOffset(inst);
149*f6aab3d8Srobert if ((offset & 0x100) == 0)
150*f6aab3d8Srobert return B{rs1, Rs{0}, uint32_t(offset), 0b001};
151*f6aab3d8Srobert return B{rs1, Rs{0}, uint32_t(int32_t(int16_t(offset | 0xfe00))), 0b001};
152*f6aab3d8Srobert }
153*f6aab3d8Srobert
DecodeC_BEQZ(uint32_t inst)154*f6aab3d8Srobert RISCVInst DecodeC_BEQZ(uint32_t inst) {
155*f6aab3d8Srobert auto rs1 = DecodeCB_RS1(inst);
156*f6aab3d8Srobert uint16_t offset = BOffset(inst);
157*f6aab3d8Srobert if ((offset & 0x100) == 0)
158*f6aab3d8Srobert return B{rs1, Rs{0}, uint32_t(offset), 0b000};
159*f6aab3d8Srobert return B{rs1, Rs{0}, uint32_t(int32_t(int16_t(offset | 0xfe00))), 0b000};
160*f6aab3d8Srobert }
161*f6aab3d8Srobert
DecodeC_LI(uint32_t inst)162*f6aab3d8Srobert RISCVInst DecodeC_LI(uint32_t inst) {
163*f6aab3d8Srobert auto rd = DecodeCI_RD(inst);
164*f6aab3d8Srobert uint16_t imm = ((inst >> 7) & 0x20) | ((inst >> 2) & 0x1f);
165*f6aab3d8Srobert if ((imm & 0x20) == 0)
166*f6aab3d8Srobert return ADDI{rd, Rs{0}, uint32_t(imm)};
167*f6aab3d8Srobert return ADDI{rd, Rs{0}, uint32_t(int32_t(int8_t(imm | 0xc0)))};
168*f6aab3d8Srobert }
169*f6aab3d8Srobert
DecodeC_LUI_ADDI16SP(uint32_t inst)170*f6aab3d8Srobert RISCVInst DecodeC_LUI_ADDI16SP(uint32_t inst) {
171*f6aab3d8Srobert auto rd = DecodeCI_RD(inst);
172*f6aab3d8Srobert if (rd == 0)
173*f6aab3d8Srobert return HINT{inst};
174*f6aab3d8Srobert if (rd == 2) {
175*f6aab3d8Srobert uint16_t nzimm = ((inst >> 3) & 0x200) // nzimm[9]
176*f6aab3d8Srobert | ((inst >> 2) & 0x10) // nzimm[4]
177*f6aab3d8Srobert | ((inst << 1) & 0x40) // nzimm[6]
178*f6aab3d8Srobert | ((inst << 4) & 0x180) // nzimm[8:7]
179*f6aab3d8Srobert | ((inst << 3) & 0x20); // nzimm[5]
180*f6aab3d8Srobert if (nzimm == 0)
181*f6aab3d8Srobert return RESERVED{inst};
182*f6aab3d8Srobert if ((nzimm & 0x200) == 0)
183*f6aab3d8Srobert return ADDI{Rd{gpr_sp_riscv}, Rs{gpr_sp_riscv}, uint32_t(nzimm)};
184*f6aab3d8Srobert return ADDI{Rd{gpr_sp_riscv}, Rs{gpr_sp_riscv},
185*f6aab3d8Srobert uint32_t(int32_t(int16_t(nzimm | 0xfc00)))};
186*f6aab3d8Srobert }
187*f6aab3d8Srobert uint32_t imm =
188*f6aab3d8Srobert ((uint32_t(inst) << 5) & 0x20000) | ((uint32_t(inst) << 10) & 0x1f000);
189*f6aab3d8Srobert if ((imm & 0x20000) == 0)
190*f6aab3d8Srobert return LUI{rd, imm};
191*f6aab3d8Srobert return LUI{rd, uint32_t(int32_t(imm | 0xfffc0000))};
192*f6aab3d8Srobert }
193*f6aab3d8Srobert
DecodeC_ADDI(uint32_t inst)194*f6aab3d8Srobert RISCVInst DecodeC_ADDI(uint32_t inst) {
195*f6aab3d8Srobert auto rd = DecodeCI_RD(inst);
196*f6aab3d8Srobert if (rd == 0)
197*f6aab3d8Srobert return NOP{inst};
198*f6aab3d8Srobert uint16_t imm = ((inst >> 7) & 0x20) | ((inst >> 2) & 0x1f);
199*f6aab3d8Srobert if ((imm & 0x20) == 0)
200*f6aab3d8Srobert return ADDI{rd, rd, uint32_t(imm)};
201*f6aab3d8Srobert return ADDI{rd, rd, uint32_t(int32_t(int8_t(imm | 0xc0)))};
202*f6aab3d8Srobert }
203*f6aab3d8Srobert
DecodeC_ADDIW(uint32_t inst)204*f6aab3d8Srobert RISCVInst DecodeC_ADDIW(uint32_t inst) {
205*f6aab3d8Srobert auto rd = DecodeCI_RD(inst);
206*f6aab3d8Srobert if (rd == 0)
207*f6aab3d8Srobert return RESERVED{inst};
208*f6aab3d8Srobert uint16_t imm = ((inst >> 7) & 0x20) | ((inst >> 2) & 0x1f);
209*f6aab3d8Srobert if ((imm & 0x20) == 0)
210*f6aab3d8Srobert return ADDIW{rd, rd, uint32_t(imm)};
211*f6aab3d8Srobert return ADDIW{rd, rd, uint32_t(int32_t(int8_t(imm | 0xc0)))};
212*f6aab3d8Srobert }
213*f6aab3d8Srobert
DecodeC_ADDI4SPN(uint32_t inst)214*f6aab3d8Srobert RISCVInst DecodeC_ADDI4SPN(uint32_t inst) {
215*f6aab3d8Srobert auto rd = DecodeCIW_RD(inst);
216*f6aab3d8Srobert uint16_t nzuimm = ((inst >> 1) & 0x3c0) // nzuimm[9:6]
217*f6aab3d8Srobert | ((inst >> 7) & 0x30) // nzuimm[5:4]
218*f6aab3d8Srobert | ((inst >> 2) & 0x8) // nzuimm[3]
219*f6aab3d8Srobert | ((inst >> 4) & 0x4); // nzuimm[2]
220*f6aab3d8Srobert
221*f6aab3d8Srobert if (rd == 0 && nzuimm == 0)
222*f6aab3d8Srobert return INVALID{inst};
223*f6aab3d8Srobert if (nzuimm == 0)
224*f6aab3d8Srobert return RESERVED{inst};
225*f6aab3d8Srobert return ADDI{rd, Rs{gpr_sp_riscv}, uint32_t(nzuimm)};
226*f6aab3d8Srobert }
227*f6aab3d8Srobert
DecodeC_SLLI(uint32_t inst)228*f6aab3d8Srobert RISCVInst DecodeC_SLLI(uint32_t inst) {
229*f6aab3d8Srobert auto rd = DecodeCI_RD(inst);
230*f6aab3d8Srobert uint16_t shamt = ((inst >> 7) & 0x20) | ((inst >> 2) & 0x1f);
231*f6aab3d8Srobert if (rd == 0 || shamt == 0)
232*f6aab3d8Srobert return HINT{inst};
233*f6aab3d8Srobert return SLLI{rd, rd, uint8_t(shamt)};
234*f6aab3d8Srobert }
235*f6aab3d8Srobert
DecodeC_SRLI(uint32_t inst)236*f6aab3d8Srobert RISCVInst DecodeC_SRLI(uint32_t inst) {
237*f6aab3d8Srobert auto rd = DecodeCB_RD(inst);
238*f6aab3d8Srobert uint16_t shamt = ((inst >> 7) & 0x20) | ((inst >> 2) & 0x1f);
239*f6aab3d8Srobert if (shamt == 0)
240*f6aab3d8Srobert return HINT{inst};
241*f6aab3d8Srobert return SRLI{rd, rd, uint8_t(shamt)};
242*f6aab3d8Srobert }
243*f6aab3d8Srobert
DecodeC_SRAI(uint32_t inst)244*f6aab3d8Srobert RISCVInst DecodeC_SRAI(uint32_t inst) {
245*f6aab3d8Srobert auto rd = DecodeCB_RD(inst);
246*f6aab3d8Srobert uint16_t shamt = ((inst >> 7) & 0x20) | ((inst >> 2) & 0x1f);
247*f6aab3d8Srobert if (shamt == 0)
248*f6aab3d8Srobert return HINT{inst};
249*f6aab3d8Srobert return SRAI{rd, rd, uint8_t(shamt)};
250*f6aab3d8Srobert }
251*f6aab3d8Srobert
DecodeC_ANDI(uint32_t inst)252*f6aab3d8Srobert RISCVInst DecodeC_ANDI(uint32_t inst) {
253*f6aab3d8Srobert auto rd = DecodeCB_RD(inst);
254*f6aab3d8Srobert uint16_t imm = ((inst >> 7) & 0x20) | ((inst >> 2) & 0x1f);
255*f6aab3d8Srobert if ((imm & 0x20) == 0)
256*f6aab3d8Srobert return ANDI{rd, rd, uint32_t(imm)};
257*f6aab3d8Srobert return ANDI{rd, rd, uint32_t(int32_t(int8_t(imm | 0xc0)))};
258*f6aab3d8Srobert }
259*f6aab3d8Srobert
DecodeC_MV(uint32_t inst)260*f6aab3d8Srobert RISCVInst DecodeC_MV(uint32_t inst) {
261*f6aab3d8Srobert auto rd = DecodeCR_RD(inst);
262*f6aab3d8Srobert auto rs2 = DecodeCR_RS2(inst);
263*f6aab3d8Srobert if (rd == 0)
264*f6aab3d8Srobert return HINT{inst};
265*f6aab3d8Srobert return ADD{rd, Rs{0}, rs2};
266*f6aab3d8Srobert }
267*f6aab3d8Srobert
DecodeC_ADD(uint32_t inst)268*f6aab3d8Srobert RISCVInst DecodeC_ADD(uint32_t inst) {
269*f6aab3d8Srobert auto rd = DecodeCR_RD(inst);
270*f6aab3d8Srobert return ADD{rd, rd, DecodeCR_RS2(inst)};
271*f6aab3d8Srobert }
272*f6aab3d8Srobert
DecodeC_AND(uint32_t inst)273*f6aab3d8Srobert RISCVInst DecodeC_AND(uint32_t inst) {
274*f6aab3d8Srobert auto rd = DecodeCA_RD(inst);
275*f6aab3d8Srobert return AND{rd, rd, DecodeCA_RS2(inst)};
276*f6aab3d8Srobert }
277*f6aab3d8Srobert
DecodeC_OR(uint32_t inst)278*f6aab3d8Srobert RISCVInst DecodeC_OR(uint32_t inst) {
279*f6aab3d8Srobert auto rd = DecodeCA_RD(inst);
280*f6aab3d8Srobert return OR{rd, rd, DecodeCA_RS2(inst)};
281*f6aab3d8Srobert }
282*f6aab3d8Srobert
DecodeC_XOR(uint32_t inst)283*f6aab3d8Srobert RISCVInst DecodeC_XOR(uint32_t inst) {
284*f6aab3d8Srobert auto rd = DecodeCA_RD(inst);
285*f6aab3d8Srobert return XOR{rd, rd, DecodeCA_RS2(inst)};
286*f6aab3d8Srobert }
287*f6aab3d8Srobert
DecodeC_SUB(uint32_t inst)288*f6aab3d8Srobert RISCVInst DecodeC_SUB(uint32_t inst) {
289*f6aab3d8Srobert auto rd = DecodeCA_RD(inst);
290*f6aab3d8Srobert return SUB{rd, rd, DecodeCA_RS2(inst)};
291*f6aab3d8Srobert }
292*f6aab3d8Srobert
DecodeC_SUBW(uint32_t inst)293*f6aab3d8Srobert RISCVInst DecodeC_SUBW(uint32_t inst) {
294*f6aab3d8Srobert auto rd = DecodeCA_RD(inst);
295*f6aab3d8Srobert return SUBW{rd, rd, DecodeCA_RS2(inst)};
296*f6aab3d8Srobert }
297*f6aab3d8Srobert
DecodeC_ADDW(uint32_t inst)298*f6aab3d8Srobert RISCVInst DecodeC_ADDW(uint32_t inst) {
299*f6aab3d8Srobert auto rd = DecodeCA_RD(inst);
300*f6aab3d8Srobert return ADDW{rd, rd, DecodeCA_RS2(inst)};
301*f6aab3d8Srobert }
DecodeC_FLW(uint32_t inst)302*f6aab3d8Srobert RISCVInst DecodeC_FLW(uint32_t inst) {
303*f6aab3d8Srobert uint16_t offset = ((inst << 1) & 0x40) // imm[6]
304*f6aab3d8Srobert | ((inst >> 7) & 0x38) // imm[5:3]
305*f6aab3d8Srobert | ((inst >> 4) & 0x4); // imm[2]
306*f6aab3d8Srobert return FLW{DecodeCL_RD(inst), DecodeCL_RS1(inst), uint32_t(offset)};
307*f6aab3d8Srobert }
308*f6aab3d8Srobert
DecodeC_FSW(uint32_t inst)309*f6aab3d8Srobert RISCVInst DecodeC_FSW(uint32_t inst) {
310*f6aab3d8Srobert uint16_t offset = ((inst << 1) & 0x40) // imm[6]
311*f6aab3d8Srobert | ((inst >> 7) & 0x38) // imm[5:3]
312*f6aab3d8Srobert | ((inst >> 4) & 0x4); // imm[2]
313*f6aab3d8Srobert return FSW{DecodeCS_RS1(inst), DecodeCS_RS2(inst), uint32_t(offset)};
314*f6aab3d8Srobert }
315*f6aab3d8Srobert
DecodeC_FLWSP(uint32_t inst)316*f6aab3d8Srobert RISCVInst DecodeC_FLWSP(uint32_t inst) {
317*f6aab3d8Srobert auto rd = DecodeCI_RD(inst);
318*f6aab3d8Srobert uint16_t offset = ((inst << 4) & 0xc0) // offset[7:6]
319*f6aab3d8Srobert | ((inst >> 7) & 0x20) // offset[5]
320*f6aab3d8Srobert | ((inst >> 2) & 0x1c); // offset[4:2]
321*f6aab3d8Srobert return FLW{rd, Rs{gpr_sp_riscv}, uint32_t(offset)};
322*f6aab3d8Srobert }
323*f6aab3d8Srobert
DecodeC_FSWSP(uint32_t inst)324*f6aab3d8Srobert RISCVInst DecodeC_FSWSP(uint32_t inst) {
325*f6aab3d8Srobert uint16_t offset = ((inst >> 1) & 0xc0) // offset[7:6]
326*f6aab3d8Srobert | ((inst >> 7) & 0x3c); // offset[5:2]
327*f6aab3d8Srobert return FSW{Rs{gpr_sp_riscv}, DecodeCSS_RS2(inst), uint32_t(offset)};
328*f6aab3d8Srobert }
329*f6aab3d8Srobert
DecodeC_FLDSP(uint32_t inst)330*f6aab3d8Srobert RISCVInst DecodeC_FLDSP(uint32_t inst) {
331*f6aab3d8Srobert auto rd = DecodeCI_RD(inst);
332*f6aab3d8Srobert uint16_t offset = ((inst << 4) & 0x1c0) // offset[8:6]
333*f6aab3d8Srobert | ((inst >> 7) & 0x20) // offset[5]
334*f6aab3d8Srobert | ((inst >> 2) & 0x18); // offset[4:3]
335*f6aab3d8Srobert return FLD{rd, Rs{gpr_sp_riscv}, uint32_t(offset)};
336*f6aab3d8Srobert }
337*f6aab3d8Srobert
DecodeC_FSDSP(uint32_t inst)338*f6aab3d8Srobert RISCVInst DecodeC_FSDSP(uint32_t inst) {
339*f6aab3d8Srobert uint16_t offset = ((inst >> 1) & 0x1c0) // offset[8:6]
340*f6aab3d8Srobert | ((inst >> 7) & 0x38); // offset[5:3]
341*f6aab3d8Srobert return FSD{Rs{gpr_sp_riscv}, DecodeCSS_RS2(inst), uint32_t(offset)};
342*f6aab3d8Srobert }
343*f6aab3d8Srobert
DecodeC_FLD(uint32_t inst)344*f6aab3d8Srobert RISCVInst DecodeC_FLD(uint32_t inst) {
345*f6aab3d8Srobert uint16_t offset = ((inst << 1) & 0xc0) // imm[7:6]
346*f6aab3d8Srobert | ((inst >> 7) & 0x38); // imm[5:3]
347*f6aab3d8Srobert return FLD{DecodeCL_RD(inst), DecodeCL_RS1(inst), uint32_t(offset)};
348*f6aab3d8Srobert }
349*f6aab3d8Srobert
DecodeC_FSD(uint32_t inst)350*f6aab3d8Srobert RISCVInst DecodeC_FSD(uint32_t inst) {
351*f6aab3d8Srobert uint16_t offset = ((inst << 1) & 0xc0) // imm[7:6]
352*f6aab3d8Srobert | ((inst >> 7) & 0x38); // imm[5:3]
353*f6aab3d8Srobert return FSD{DecodeCS_RS1(inst), DecodeCS_RS2(inst), uint32_t(offset)};
354*f6aab3d8Srobert }
355*f6aab3d8Srobert
356*f6aab3d8Srobert } // namespace lldb_private
357*f6aab3d8Srobert #endif // LLDB_SOURCE_PLUGINS_INSTRUCTION_RISCV_RISCVCINSTRUCTION_H
358