decoder.isa (11723:0596db108c53) decoder.isa (11724:d92c26d481b7)
1// -*- mode:c++ -*-
2
3// Copyright (c) 2015 RISC-V Foundation
4// Copyright (c) 2016 The University of Virginia
5// All rights reserved.
6//
7// Redistribution and use in source and binary forms, with or without
8// modification, are permitted provided that the following conditions are

--- 136 unchanged lines hidden (view full) ---

145 }
146
147 0x33: decode FUNCT3 {
148 format ROp {
149 0x0: decode FUNCT7 {
150 0x0: add({{
151 Rd = Rs1_sd + Rs2_sd;
152 }});
1// -*- mode:c++ -*-
2
3// Copyright (c) 2015 RISC-V Foundation
4// Copyright (c) 2016 The University of Virginia
5// All rights reserved.
6//
7// Redistribution and use in source and binary forms, with or without
8// modification, are permitted provided that the following conditions are

--- 136 unchanged lines hidden (view full) ---

145 }
146
147 0x33: decode FUNCT3 {
148 format ROp {
149 0x0: decode FUNCT7 {
150 0x0: add({{
151 Rd = Rs1_sd + Rs2_sd;
152 }});
153 0x1: mul({{
154 Rd = Rs1_sd*Rs2_sd;
155 }}, IntMultOp);
153 0x20: sub({{
154 Rd = Rs1_sd - Rs2_sd;
155 }});
156 }
157 0x1: decode FUNCT7 {
158 0x0: sll({{
159 Rd = Rs1 << Rs2<5:0>;
160 }});
156 0x20: sub({{
157 Rd = Rs1_sd - Rs2_sd;
158 }});
159 }
160 0x1: decode FUNCT7 {
161 0x0: sll({{
162 Rd = Rs1 << Rs2<5:0>;
163 }});
164 0x1: mulh({{
165 bool negate = (Rs1_sd < 0) != (Rs2_sd < 0);
166
167 uint64_t Rs1_lo = (uint32_t)std::abs(Rs1_sd);
168 uint64_t Rs1_hi = (uint64_t)std::abs(Rs1_sd) >> 32;
169 uint64_t Rs2_lo = (uint32_t)std::abs(Rs2_sd);
170 uint64_t Rs2_hi = (uint64_t)std::abs(Rs2_sd) >> 32;
171
172 uint64_t hi = Rs1_hi*Rs2_hi;
173 uint64_t mid1 = Rs1_hi*Rs2_lo;
174 uint64_t mid2 = Rs1_lo*Rs2_hi;
175 uint64_t lo = Rs2_lo*Rs1_lo;
176 uint64_t carry = ((uint64_t)(uint32_t)mid1
177 + (uint64_t)(uint32_t)mid2 + (lo >> 32)) >> 32;
178
179 uint64_t res = hi + (mid1 >> 32) + (mid2 >> 32) + carry;
180 Rd = negate ? ~res + (Rs1_sd*Rs2_sd == 0 ? 1 : 0) : res;
181 }}, IntMultOp);
161 }
162 0x2: decode FUNCT7 {
163 0x0: slt({{
164 Rd = (Rs1_sd < Rs2_sd) ? 1 : 0;
165 }});
182 }
183 0x2: decode FUNCT7 {
184 0x0: slt({{
185 Rd = (Rs1_sd < Rs2_sd) ? 1 : 0;
186 }});
187 0x1: mulhsu({{
188 bool negate = Rs1_sd < 0;
189 uint64_t Rs1_lo = (uint32_t)std::abs(Rs1_sd);
190 uint64_t Rs1_hi = (uint64_t)std::abs(Rs1_sd) >> 32;
191 uint64_t Rs2_lo = (uint32_t)Rs2;
192 uint64_t Rs2_hi = Rs2 >> 32;
193
194 uint64_t hi = Rs1_hi*Rs2_hi;
195 uint64_t mid1 = Rs1_hi*Rs2_lo;
196 uint64_t mid2 = Rs1_lo*Rs2_hi;
197 uint64_t lo = Rs1_lo*Rs2_lo;
198 uint64_t carry = ((uint64_t)(uint32_t)mid1
199 + (uint64_t)(uint32_t)mid2 + (lo >> 32)) >> 32;
200
201 uint64_t res = hi + (mid1 >> 32) + (mid2 >> 32) + carry;
202 Rd = negate ? ~res + (Rs1_sd*Rs2 == 0 ? 1 : 0) : res;
203 }}, IntMultOp);
166 }
167 0x3: decode FUNCT7 {
168 0x0: sltu({{
169 Rd = (Rs1 < Rs2) ? 1 : 0;
170 }});
204 }
205 0x3: decode FUNCT7 {
206 0x0: sltu({{
207 Rd = (Rs1 < Rs2) ? 1 : 0;
208 }});
209 0x1: mulhu({{
210 uint64_t Rs1_lo = (uint32_t)Rs1;
211 uint64_t Rs1_hi = Rs1 >> 32;
212 uint64_t Rs2_lo = (uint32_t)Rs2;
213 uint64_t Rs2_hi = Rs2 >> 32;
214
215 uint64_t hi = Rs1_hi*Rs2_hi;
216 uint64_t mid1 = Rs1_hi*Rs2_lo;
217 uint64_t mid2 = Rs1_lo*Rs2_hi;
218 uint64_t lo = Rs1_lo*Rs2_lo;
219 uint64_t carry = ((uint64_t)(uint32_t)mid1
220 + (uint64_t)(uint32_t)mid2 + (lo >> 32)) >> 32;
221
222 Rd = hi + (mid1 >> 32) + (mid2 >> 32) + carry;
223 }}, IntMultOp);
171 }
172 0x4: decode FUNCT7 {
173 0x0: xor({{
174 Rd = Rs1 ^ Rs2;
175 }});
224 }
225 0x4: decode FUNCT7 {
226 0x0: xor({{
227 Rd = Rs1 ^ Rs2;
228 }});
229 0x1: div({{
230 if (Rs2_sd == 0) {
231 Rd_sd = -1;
232 } else if (Rs1_sd == std::numeric_limits<int64_t>::min()
233 && Rs2_sd == -1) {
234 Rd_sd = std::numeric_limits<int64_t>::min();
235 } else {
236 Rd_sd = Rs1_sd/Rs2_sd;
237 }
238 }}, IntDivOp);
176 }
177 0x5: decode FUNCT7 {
178 0x0: srl({{
179 Rd = Rs1 >> Rs2<5:0>;
180 }});
239 }
240 0x5: decode FUNCT7 {
241 0x0: srl({{
242 Rd = Rs1 >> Rs2<5:0>;
243 }});
244 0x1: divu({{
245 if (Rs2 == 0) {
246 Rd = std::numeric_limits<uint64_t>::max();
247 } else {
248 Rd = Rs1/Rs2;
249 }
250 }}, IntDivOp);
181 0x20: sra({{
182 Rd_sd = Rs1_sd >> Rs2<5:0>;
183 }});
184 }
185 0x6: decode FUNCT7 {
186 0x0: or({{
187 Rd = Rs1 | Rs2;
188 }});
251 0x20: sra({{
252 Rd_sd = Rs1_sd >> Rs2<5:0>;
253 }});
254 }
255 0x6: decode FUNCT7 {
256 0x0: or({{
257 Rd = Rs1 | Rs2;
258 }});
259 0x1: rem({{
260 if (Rs2_sd == 0) {
261 Rd = Rs1_sd;
262 } else if (Rs1_sd == std::numeric_limits<int64_t>::min()
263 && Rs2_sd == -1) {
264 Rd = 0;
265 } else {
266 Rd = Rs1_sd%Rs2_sd;
267 }
268 }}, IntDivOp);
189 }
190 0x7: decode FUNCT7 {
191 0x0: and({{
192 Rd = Rs1 & Rs2;
193 }});
269 }
270 0x7: decode FUNCT7 {
271 0x0: and({{
272 Rd = Rs1 & Rs2;
273 }});
274 0x1: remu({{
275 if (Rs2 == 0) {
276 Rd = Rs1;
277 } else {
278 Rd = Rs1%Rs2;
279 }
280 }}, IntDivOp);
194 }
195 }
196 }
197
198 0x37: UOp::lui({{
199 Rd = (uint64_t)imm;
200 }});
201
202 0x3b: decode FUNCT3 {
203 format ROp {
204 0x0: decode FUNCT7 {
205 0x0: addw({{
206 Rd_sd = Rs1_sw + Rs2_sw;
207 }});
281 }
282 }
283 }
284
285 0x37: UOp::lui({{
286 Rd = (uint64_t)imm;
287 }});
288
289 0x3b: decode FUNCT3 {
290 format ROp {
291 0x0: decode FUNCT7 {
292 0x0: addw({{
293 Rd_sd = Rs1_sw + Rs2_sw;
294 }});
295 0x1: mulw({{
296 Rd_sd = (int32_t)(Rs1_sw*Rs2_sw);
297 }}, IntMultOp);
208 0x20: subw({{
209 Rd_sd = Rs1_sw - Rs2_sw;
210 }});
211 }
212 0x1: sllw({{
213 Rd_sd = Rs1_sw << Rs2<4:0>;
214 }});
298 0x20: subw({{
299 Rd_sd = Rs1_sw - Rs2_sw;
300 }});
301 }
302 0x1: sllw({{
303 Rd_sd = Rs1_sw << Rs2<4:0>;
304 }});
305 0x4: divw({{
306 if (Rs2_sw == 0) {
307 Rd_sd = -1;
308 } else if (Rs1_sw == std::numeric_limits<int32_t>::min()
309 && Rs2_sw == -1) {
310 Rd_sd = std::numeric_limits<int32_t>::min();
311 } else {
312 Rd_sd = Rs1_sw/Rs2_sw;
313 }
314 }}, IntDivOp);
215 0x5: decode FUNCT7 {
216 0x0: srlw({{
217 Rd_uw = Rs1_uw >> Rs2<4:0>;
218 }});
315 0x5: decode FUNCT7 {
316 0x0: srlw({{
317 Rd_uw = Rs1_uw >> Rs2<4:0>;
318 }});
319 0x1: divuw({{
320 if (Rs2_uw == 0) {
321 Rd_sd = std::numeric_limits<IntReg>::max();
322 } else {
323 Rd_sd = (int32_t)(Rs1_uw/Rs2_uw);
324 }
325 }}, IntDivOp);
219 0x20: sraw({{
220 Rd_sd = Rs1_sw >> Rs2<4:0>;
221 }});
222 }
326 0x20: sraw({{
327 Rd_sd = Rs1_sw >> Rs2<4:0>;
328 }});
329 }
330 0x6: remw({{
331 if (Rs2_sw == 0) {
332 Rd_sd = Rs1_sw;
333 } else if (Rs1_sw == std::numeric_limits<int32_t>::min()
334 && Rs2_sw == -1) {
335 Rd_sd = 0;
336 } else {
337 Rd_sd = Rs1_sw%Rs2_sw;
338 }
339 }}, IntDivOp);
340 0x7: remuw({{
341 if (Rs2_uw == 0) {
342 Rd_sd = (int32_t)Rs1_uw;
343 } else {
344 Rd_sd = (int32_t)(Rs1_uw%Rs2_uw);
345 }
346 }}, IntDivOp);
223 }
224 }
225
226 0x63: decode FUNCT3 {
227 format SBOp {
228 0x0: beq({{
229 if (Rs1 == Rs2) {
230 NPC = PC + imm;

--- 102 unchanged lines hidden ---
347 }
348 }
349
350 0x63: decode FUNCT3 {
351 format SBOp {
352 0x0: beq({{
353 if (Rs1 == Rs2) {
354 NPC = PC + imm;

--- 102 unchanged lines hidden ---