decoder.isa (8433:c6ebf7c6dcac) | decoder.isa (8564:f81bcb16fa1b) |
---|---|
1// -*- mode:c++ -*- 2 3// Copyright (c) 2007 MIPS Technologies, Inc. 4// All rights reserved. 5// 6// Redistribution and use in source and binary forms, with or without 7// modification, are permitted provided that the following conditions are 8// met: redistributions of source code must retain the above copyright --- 149 unchanged lines hidden (view full) --- 158 NNPC = Rs; 159 }}, IsCall); 160 } 161 } 162 163 format BasicOp { 164 0x2: movz({{ Rd = (Rt == 0) ? Rs : Rd; }}); 165 0x3: movn({{ Rd = (Rt != 0) ? Rs : Rd; }}); | 1// -*- mode:c++ -*- 2 3// Copyright (c) 2007 MIPS Technologies, Inc. 4// All rights reserved. 5// 6// Redistribution and use in source and binary forms, with or without 7// modification, are permitted provided that the following conditions are 8// met: redistributions of source code must retain the above copyright --- 149 unchanged lines hidden (view full) --- 158 NNPC = Rs; 159 }}, IsCall); 160 } 161 } 162 163 format BasicOp { 164 0x2: movz({{ Rd = (Rt == 0) ? Rs : Rd; }}); 165 0x3: movn({{ Rd = (Rt != 0) ? Rs : Rd; }}); |
166#if FULL_SYSTEM 167 0x4: syscall({{ fault = new SystemCallFault(); }}); 168#else 169 0x4: syscall({{ xc->syscall(R2); }}, 170 IsSerializeAfter, IsNonSpeculative); 171#endif | 166 0x4: decode FULL_SYSTEM { 167 0: syscall_se({{ xc->syscall(R2); }}, 168 IsSerializeAfter, IsNonSpeculative); 169 default: syscall({{ fault = new SystemCallFault(); }}); 170 } |
172 0x7: sync({{ ; }}, IsMemBarrier); 173 0x5: break({{fault = new BreakpointFault();}}); 174 } 175 176 } 177 178 0x2: decode FUNCTION_LO { 179 0x0: HiLoRsSelOp::mfhi({{ Rd = HI_RS_SEL; }}, --- 26 unchanged lines hidden (view full) --- 206 }}, IntDivOp); 207 } 208 } 209 210 0x4: decode HINT { 211 0x0: decode FUNCTION_LO { 212 format IntOp { 213 0x0: add({{ | 171 0x7: sync({{ ; }}, IsMemBarrier); 172 0x5: break({{fault = new BreakpointFault();}}); 173 } 174 175 } 176 177 0x2: decode FUNCTION_LO { 178 0x0: HiLoRsSelOp::mfhi({{ Rd = HI_RS_SEL; }}, --- 26 unchanged lines hidden (view full) --- 205 }}, IntDivOp); 206 } 207 } 208 209 0x4: decode HINT { 210 0x0: decode FUNCTION_LO { 211 format IntOp { 212 0x0: add({{ |
214 /* More complicated since an ADD can cause 215 an arithmetic overflow exception */ 216 int64_t Src1 = Rs.sw; 217 int64_t Src2 = Rt.sw; 218 int64_t temp_result; 219#if FULL_SYSTEM 220 if (((Src1 >> 31) & 1) == 1) 221 Src1 |= 0x100000000LL; 222#endif 223 temp_result = Src1 + Src2; 224#if FULL_SYSTEM 225 if (bits(temp_result, 31) == 226 bits(temp_result, 32)) { 227#endif 228 Rd.sw = temp_result; 229#if FULL_SYSTEM 230 } else { | 213 IntReg result; 214 Rd = result = Rs + Rt; 215 if (FULL_SYSTEM && 216 findOverflow(32, result, Rs, Rt)) { |
231 fault = new ArithmeticFault(); 232 } | 217 fault = new ArithmeticFault(); 218 } |
233#endif | |
234 }}); 235 0x1: addu({{ Rd.sw = Rs.sw + Rt.sw;}}); 236 0x2: sub({{ | 219 }}); 220 0x1: addu({{ Rd.sw = Rs.sw + Rt.sw;}}); 221 0x2: sub({{ |
237 /* More complicated since an SUB can cause 238 an arithmetic overflow exception */ 239 int64_t Src1 = Rs.sw; 240 int64_t Src2 = Rt.sw; 241 int64_t temp_result = Src1 - Src2; 242#if FULL_SYSTEM 243 if (bits(temp_result, 31) == 244 bits(temp_result, 32)) { 245#endif 246 Rd.sw = temp_result; 247#if FULL_SYSTEM 248 } else { | 222 IntReg result; 223 Rd = result = Rs - Rt; 224 if (FULL_SYSTEM && 225 findOverflow(32, result, Rs, ~Rt)) { |
249 fault = new ArithmeticFault(); 250 } | 226 fault = new ArithmeticFault(); 227 } |
251#endif | |
252 }}); 253 0x3: subu({{ Rd.sw = Rs.sw - Rt.sw; }}); 254 0x4: and({{ Rd = Rs & Rt; }}); 255 0x5: or({{ Rd = Rs | Rt; }}); 256 0x6: xor({{ Rd = Rs ^ Rt; }}); 257 0x7: nor({{ Rd = ~(Rs | Rt); }}); 258 } 259 } --- 82 unchanged lines hidden (view full) --- 342 0x6: blez({{ cond = (Rs.sw <= 0); }}); 343 0x7: bgtz({{ cond = (Rs.sw > 0); }}); 344 } 345 } 346 347 0x1: decode OPCODE_LO { 348 format IntImmOp { 349 0x0: addi({{ | 228 }}); 229 0x3: subu({{ Rd.sw = Rs.sw - Rt.sw; }}); 230 0x4: and({{ Rd = Rs & Rt; }}); 231 0x5: or({{ Rd = Rs | Rt; }}); 232 0x6: xor({{ Rd = Rs ^ Rt; }}); 233 0x7: nor({{ Rd = ~(Rs | Rt); }}); 234 } 235 } --- 82 unchanged lines hidden (view full) --- 318 0x6: blez({{ cond = (Rs.sw <= 0); }}); 319 0x7: bgtz({{ cond = (Rs.sw > 0); }}); 320 } 321 } 322 323 0x1: decode OPCODE_LO { 324 format IntImmOp { 325 0x0: addi({{ |
350 int64_t Src1 = Rs.sw; 351 int64_t Src2 = imm; 352 int64_t temp_result; 353#if FULL_SYSTEM 354 if (((Src1 >> 31) & 1) == 1) 355 Src1 |= 0x100000000LL; 356#endif 357 temp_result = Src1 + Src2; 358#if FULL_SYSTEM 359 if (bits(temp_result, 31) == bits(temp_result, 32)) { 360#endif 361 Rt.sw = temp_result; 362#if FULL_SYSTEM 363 } else { | 326 IntReg result; 327 Rt = result = Rs + imm; 328 if (FULL_SYSTEM && 329 findOverflow(32, result, Rs, imm)) { |
364 fault = new ArithmeticFault(); 365 } | 330 fault = new ArithmeticFault(); 331 } |
366#endif | |
367 }}); 368 0x1: addiu({{ Rt.sw = Rs.sw + imm; }}); 369 0x2: slti({{ Rt.sw = (Rs.sw < imm) ? 1 : 0 }}); 370 0x3: sltiu({{ Rt.uw = (Rs.uw < (uint32_t)sextImm) ? 1 : 0;}}); 371 0x4: andi({{ Rt.sw = Rs.sw & zextImm; }}); 372 0x5: ori({{ Rt.sw = Rs.sw | zextImm; }}); 373 0x6: xori({{ Rt.sw = Rs.sw ^ zextImm; }}); 374 --- 1136 unchanged lines hidden (view full) --- 1511 0x7: Prefetch::prefx({{ EA = Rs + Rt; }}); 1512 } 1513 1514 0x3: decode FUNCTION_LO { 1515 0x6: Float64Op::alnv_ps({{ 1516 if (Rs<2:0> == 0) { 1517 Fd.ud = Fs.ud; 1518 } else if (Rs<2:0> == 4) { | 332 }}); 333 0x1: addiu({{ Rt.sw = Rs.sw + imm; }}); 334 0x2: slti({{ Rt.sw = (Rs.sw < imm) ? 1 : 0 }}); 335 0x3: sltiu({{ Rt.uw = (Rs.uw < (uint32_t)sextImm) ? 1 : 0;}}); 336 0x4: andi({{ Rt.sw = Rs.sw & zextImm; }}); 337 0x5: ori({{ Rt.sw = Rs.sw | zextImm; }}); 338 0x6: xori({{ Rt.sw = Rs.sw ^ zextImm; }}); 339 --- 1136 unchanged lines hidden (view full) --- 1476 0x7: Prefetch::prefx({{ EA = Rs + Rt; }}); 1477 } 1478 1479 0x3: decode FUNCTION_LO { 1480 0x6: Float64Op::alnv_ps({{ 1481 if (Rs<2:0> == 0) { 1482 Fd.ud = Fs.ud; 1483 } else if (Rs<2:0> == 4) { |
1519#if BYTE_ORDER == BIG_ENDIAN 1520 Fd.ud = Fs.ud<31:0> << 32 | Ft.ud<63:32>; 1521#elif BYTE_ORDER == LITTLE_ENDIAN 1522 Fd.ud = Ft.ud<31:0> << 32 | Fs.ud<63:32>; 1523#endif | 1484 if (GuestByteOrder == BigEndianByteOrder) 1485 Fd.ud = Fs.ud<31:0> << 32 | Ft.ud<63:32>; 1486 else 1487 Fd.ud = Ft.ud<31:0> << 32 | Fs.ud<63:32>; |
1524 } else { 1525 Fd.ud = Fd.ud; 1526 } 1527 }}); 1528 } 1529 1530 format FloatAccOp { 1531 0x4: decode FUNCTION_LO { --- 931 unchanged lines hidden (view full) --- 2463 dspac = dspac << 32; 2464 dspac |= Rs.uw; 2465 dspctl = insertBits(dspctl, 5, 0, 2466 dspctl<5:0> + 32); 2467 }}); 2468 } 2469 } 2470 } | 1488 } else { 1489 Fd.ud = Fd.ud; 1490 } 1491 }}); 1492 } 1493 1494 format FloatAccOp { 1495 0x4: decode FUNCTION_LO { --- 931 unchanged lines hidden (view full) --- 2427 dspac = dspac << 32; 2428 dspac |= Rs.uw; 2429 dspctl = insertBits(dspctl, 5, 0, 2430 dspctl<5:0> + 32); 2431 }}); 2432 } 2433 } 2434 } |
2471 0x3: decode OP { 2472#if FULL_SYSTEM 2473 0x0: FailUnimpl::rdhwr(); 2474#else 2475 0x0: decode RD { 2476 29: BasicOp::rdhwr({{ Rt = TpValue; }}); | 2435 0x3: decode OP default FailUnimpl::rdhwr() { 2436 0x0: decode FULL_SYSTEM { 2437 0: decode RD { 2438 29: BasicOp::rdhwr_se({{ Rt = TpValue; }}); 2439 } |
2477 } | 2440 } |
2478#endif | |
2479 } 2480 } 2481 } 2482 } 2483 2484 0x4: decode OPCODE_LO { 2485 format LoadMemory { 2486 0x0: lb({{ Rt.sw = Mem.sb; }}); --- 75 unchanged lines hidden --- | 2441 } 2442 } 2443 } 2444 } 2445 2446 0x4: decode OPCODE_LO { 2447 format LoadMemory { 2448 0x0: lb({{ Rt.sw = Mem.sb; }}); --- 75 unchanged lines hidden --- |