Changeset 88 for trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/Operation/src/Operation.cpp
- Timestamp:
- Dec 10, 2008, 7:31:39 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/Operation/src/Operation.cpp
r81 r88 8 8 9 9 #include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/Operation/include/Operation.h" 10 11 #define neg(data) (~(data)+1) 12 #define sign(data) ((data)>>(param->_size_data-1)) 13 #define unsigned(data) (data) 14 #define signed(data) ((sign(data)==0)?(data):neg(data)) 15 #define ovf(op1, op2, res) ((sign(op1) == sign(op2))?(sign(op1) xor sign(res)):0) 16 #define carry(op1, op2, res) (((res)<(op1)) or ((res)<(op2))) 17 #define set_flag(data,flag,is_set) (((is_set)==1)?((data)|(flag)):((data)&~(flag))) 18 #define get_flag(data,flag) (((data)&(flag))!=0) 19 #define concatenation_bool(a,b) (((a)<<1) | (b)) 10 #include "Behavioural/include/Operation.h" 20 11 21 12 namespace morpheo { … … 43 34 log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_add"); 44 35 45 Tgeneral_data_t gpr1 = unsigned( op->_data_ra);46 Tgeneral_data_t gpr2 = unsigned( (op->_has_immediat==1)?op->_immediat:op->_data_rb);36 Tgeneral_data_t gpr1 = unsigned(param->_size_data,op->_data_ra); 37 Tgeneral_data_t gpr2 = unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb); 47 38 48 39 Tgeneral_data_t gpr3 = param->_mask_data & (gpr1 + gpr2); 49 40 50 bool overflow = ovf ( gpr1,gpr2,gpr3);51 bool carry_out = carry( gpr1,gpr2,gpr3);41 bool overflow = ovf (param->_size_data,gpr1,gpr2,gpr3); 42 bool carry_out = carry(param->_size_data,gpr1,gpr2,gpr3); 52 43 53 44 // Result … … 70 61 Tgeneral_data_t carry_in = get_flag(op->_data_rc,FLAG_CY); 71 62 72 Tgeneral_data_t gpr1 = unsigned( op->_data_ra);73 Tgeneral_data_t gpr2 = unsigned( (op->_has_immediat==1)?op->_immediat:op->_data_rb);63 Tgeneral_data_t gpr1 = unsigned(param->_size_data,op->_data_ra); 64 Tgeneral_data_t gpr2 = unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb); 74 65 Tgeneral_data_t gpr3 = param->_mask_data & (gpr1 + gpr2 + carry_in); 75 66 76 bool overflow = ovf ( gpr1,gpr2,gpr3);77 bool carry_out = carry( gpr1,gpr2,gpr3);67 bool overflow = ovf (param->_size_data,gpr1,gpr2,gpr3); 68 bool carry_out = carry(param->_size_data,gpr1,gpr2,gpr3); 78 69 79 70 // Result … … 94 85 log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_sub"); 95 86 96 Tgeneral_data_t gpr1 = unsigned(op->_data_ra);97 Tgeneral_data_t gpr2 = neg( unsigned(op->_data_rb));87 Tgeneral_data_t gpr1 = unsigned(param->_size_data,op->_data_ra); 88 Tgeneral_data_t gpr2 = neg(param->_size_data,unsigned(param->_size_data,op->_data_rb)); 98 89 Tgeneral_data_t gpr3 = param->_mask_data & (gpr1 + gpr2); 99 90 100 bool overflow = ovf ( gpr1,gpr2,gpr3);101 bool carry_out = carry( gpr1,gpr2,gpr3);91 bool overflow = ovf (param->_size_data,gpr1,gpr2,gpr3); 92 bool carry_out = carry(param->_size_data,gpr1,gpr2,gpr3); 102 93 103 94 // Result … … 118 109 log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_and"); 119 110 120 Tgeneral_data_t gpr1 = unsigned( op->_data_ra);121 Tgeneral_data_t gpr2 = unsigned( (op->_has_immediat==1)?op->_immediat:op->_data_rb);111 Tgeneral_data_t gpr1 = unsigned(param->_size_data,op->_data_ra); 112 Tgeneral_data_t gpr2 = unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb); 122 113 Tgeneral_data_t gpr3 = (gpr1 & gpr2); 123 114 … … 137 128 log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_or"); 138 129 139 Tgeneral_data_t gpr1 = unsigned( op->_data_ra);140 Tgeneral_data_t gpr2 = unsigned( (op->_has_immediat==1)?op->_immediat:op->_data_rb);130 Tgeneral_data_t gpr1 = unsigned(param->_size_data,op->_data_ra); 131 Tgeneral_data_t gpr2 = unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb); 141 132 Tgeneral_data_t gpr3 = (gpr1 | gpr2); 142 133 … … 156 147 log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_xor"); 157 148 158 Tgeneral_data_t gpr1 = unsigned( op->_data_ra);159 Tgeneral_data_t gpr2 = unsigned( (op->_has_immediat==1)?op->_immediat:op->_data_rb);149 Tgeneral_data_t gpr1 = unsigned(param->_size_data,op->_data_ra); 150 Tgeneral_data_t gpr2 = unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb); 160 151 Tgeneral_data_t gpr3 = (gpr1 ^ gpr2); 161 152 … … 175 166 log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_movhi"); 176 167 177 Tgeneral_data_t gpr1 = unsigned( op->_immediat);168 Tgeneral_data_t gpr1 = unsigned(param->_size_data,op->_immediat); 178 169 Tgeneral_data_t gpr2 = param->_mask_data & (gpr1<<16); 179 170 … … 195 186 Tgeneral_data_t f_in = get_flag(op->_data_rc,FLAG_F); 196 187 197 Tgeneral_data_t gpr1 = unsigned( op->_data_ra);198 Tgeneral_data_t gpr2 = unsigned( op->_data_rb);188 Tgeneral_data_t gpr1 = unsigned(param->_size_data,op->_data_ra); 189 Tgeneral_data_t gpr2 = unsigned(param->_size_data,op->_data_rb); 199 190 Tgeneral_data_t gpr3 = ((f_in==0)?gpr2:gpr1); 200 191 … … 215 206 216 207 Tgeneral_data_t f_in = get_flag(op->_data_rc,FLAG_F); 217 Tgeneral_data_t imm = unsigned( op->_immediat);208 Tgeneral_data_t imm = unsigned(param->_size_data,op->_immediat); 218 209 219 210 // Result … … 233 224 234 225 Tgeneral_data_t f_in = get_flag(op->_data_rc,FLAG_F); 235 Tgeneral_data_t imm = unsigned( op->_immediat);226 Tgeneral_data_t imm = unsigned(param->_size_data,op->_immediat); 236 227 237 228 // Result … … 254 245 255 246 256 Tgeneral_data_t gpr = unsigned( op->_data_rb);257 Tgeneral_data_t imm = unsigned( op->_immediat);247 Tgeneral_data_t gpr = unsigned(param->_size_data,op->_data_rb); 248 Tgeneral_data_t imm = unsigned(param->_size_data,op->_immediat); 258 249 259 250 // Result … … 272 263 log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_extend_s"); 273 264 274 Tgeneral_data_t imm = unsigned( op->_immediat);275 Tgeneral_data_t gpr1 = unsigned( op->_data_ra);265 Tgeneral_data_t imm = unsigned(param->_size_data,op->_immediat); 266 Tgeneral_data_t gpr1 = unsigned(param->_size_data,op->_data_ra); 276 267 Tgeneral_data_t gpr2 = extend<Tgeneral_data_t>(param->_size_data, gpr1, true , imm); 277 268 … … 291 282 log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_extend_z"); 292 283 293 Tgeneral_data_t imm = unsigned( op->_immediat);294 Tgeneral_data_t gpr1 = unsigned( op->_data_ra);284 Tgeneral_data_t imm = unsigned(param->_size_data,op->_immediat); 285 Tgeneral_data_t gpr1 = unsigned(param->_size_data,op->_data_ra); 295 286 Tgeneral_data_t gpr2 = extend<Tgeneral_data_t>(param->_size_data, gpr1, false , imm); 296 287 … … 310 301 log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_sll"); 311 302 312 Tgeneral_data_t gpr1 = unsigned( op->_data_ra);313 Tgeneral_data_t gpr2 = param->_mask_shift & unsigned( (op->_has_immediat==1)?op->_immediat:op->_data_rb);303 Tgeneral_data_t gpr1 = unsigned(param->_size_data,op->_data_ra); 304 Tgeneral_data_t gpr2 = param->_mask_shift & unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb); 314 305 Tgeneral_data_t gpr3 = shift_logic_left<Tgeneral_data_t>(param->_size_data, gpr1, gpr2); 315 306 … … 329 320 log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_srl"); 330 321 331 Tgeneral_data_t gpr1 = unsigned( op->_data_ra);332 Tgeneral_data_t gpr2 = param->_mask_shift & unsigned( (op->_has_immediat==1)?op->_immediat:op->_data_rb);322 Tgeneral_data_t gpr1 = unsigned(param->_size_data,op->_data_ra); 323 Tgeneral_data_t gpr2 = param->_mask_shift & unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb); 333 324 Tgeneral_data_t gpr3 = shift_logic_right<Tgeneral_data_t>(param->_size_data, gpr1, gpr2); 334 325 … … 348 339 log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_sra"); 349 340 350 Tgeneral_data_t gpr1 = unsigned( op->_data_ra);351 Tgeneral_data_t gpr2 = param->_mask_shift & unsigned( (op->_has_immediat==1)?op->_immediat:op->_data_rb);341 Tgeneral_data_t gpr1 = unsigned(param->_size_data,op->_data_ra); 342 Tgeneral_data_t gpr2 = param->_mask_shift & unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb); 352 343 Tgeneral_data_t gpr3 = shift_arithmetic_right<Tgeneral_data_t>(param->_size_data, gpr1, gpr2); 353 344 … … 367 358 log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_ror"); 368 359 369 Tgeneral_data_t gpr1 = unsigned( op->_data_ra);370 Tgeneral_data_t gpr2 = param->_mask_shift & unsigned( (op->_has_immediat==1)?op->_immediat:op->_data_rb);360 Tgeneral_data_t gpr1 = unsigned(param->_size_data,op->_data_ra); 361 Tgeneral_data_t gpr2 = param->_mask_shift & unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb); 371 362 Tgeneral_data_t gpr3 = rotate_right<Tgeneral_data_t>(param->_size_data, gpr1, gpr2); 372 363 … … 386 377 log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_ff1"); 387 378 388 Tgeneral_data_t gpr = unsigned( op->_data_ra);379 Tgeneral_data_t gpr = unsigned(param->_size_data,op->_data_ra); 389 380 Tgeneral_data_t index; 390 381 … … 406 397 log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_fl1"); 407 398 408 Tgeneral_data_t gpr = unsigned( op->_data_ra);399 Tgeneral_data_t gpr = unsigned(param->_size_data,op->_data_ra); 409 400 Tgeneral_data_t index; 410 401 … … 426 417 log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_sfeq"); 427 418 428 Tgeneral_data_t gpr1 = unsigned( op->_data_ra);429 Tgeneral_data_t gpr2 = unsigned( (op->_has_immediat==1)?op->_immediat:op->_data_rb);419 Tgeneral_data_t gpr1 = unsigned(param->_size_data,op->_data_ra); 420 Tgeneral_data_t gpr2 = unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb); 430 421 431 422 bool f_out = (gpr1 == gpr2); … … 446 437 log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_sfne"); 447 438 448 Tgeneral_data_t gpr1 = unsigned( op->_data_ra);449 Tgeneral_data_t gpr2 = unsigned( (op->_has_immediat==1)?op->_immediat:op->_data_rb);439 Tgeneral_data_t gpr1 = unsigned(param->_size_data,op->_data_ra); 440 Tgeneral_data_t gpr2 = unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb); 450 441 451 442 bool f_out = (gpr1 != gpr2); … … 466 457 log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_sfgeu"); 467 458 468 Tgeneral_data_t gpr1 = unsigned( op->_data_ra);469 Tgeneral_data_t gpr2 = unsigned( (op->_has_immediat==1)?op->_immediat:op->_data_rb);459 Tgeneral_data_t gpr1 = unsigned(param->_size_data,op->_data_ra); 460 Tgeneral_data_t gpr2 = unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb); 470 461 471 462 bool f_out = (gpr1 >= gpr2); … … 486 477 log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_sfgtu"); 487 478 488 Tgeneral_data_t gpr1 = unsigned( op->_data_ra);489 Tgeneral_data_t gpr2 = unsigned( (op->_has_immediat==1)?op->_immediat:op->_data_rb);479 Tgeneral_data_t gpr1 = unsigned(param->_size_data,op->_data_ra); 480 Tgeneral_data_t gpr2 = unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb); 490 481 491 482 bool f_out = (gpr1 > gpr2); … … 506 497 log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_sfleu"); 507 498 508 Tgeneral_data_t gpr1 = unsigned( op->_data_ra);509 Tgeneral_data_t gpr2 = unsigned( (op->_has_immediat==1)?op->_immediat:op->_data_rb);499 Tgeneral_data_t gpr1 = unsigned(param->_size_data,op->_data_ra); 500 Tgeneral_data_t gpr2 = unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb); 510 501 511 502 bool f_out = (gpr1 <= gpr2); … … 526 517 log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_sfltu"); 527 518 528 Tgeneral_data_t gpr1 = unsigned( op->_data_ra);529 Tgeneral_data_t gpr2 = unsigned( (op->_has_immediat==1)?op->_immediat:op->_data_rb);519 Tgeneral_data_t gpr1 = unsigned(param->_size_data,op->_data_ra); 520 Tgeneral_data_t gpr2 = unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb); 530 521 531 522 bool f_out = (gpr1 < gpr2); … … 549 540 Tgeneral_data_t gpr2 = (op->_has_immediat==1)?op->_immediat:op->_data_rb; 550 541 551 log_printf(TRACE,Functionnal_unit,FUNCTION," * data_ra : %.8x",unsigned( op->_data_ra));552 log_printf(TRACE,Functionnal_unit,FUNCTION," * data_ras : %.8x", signed( op->_data_ra));553 log_printf(TRACE,Functionnal_unit,FUNCTION," * data_rb : %.8x",unsigned( (op->_has_immediat==1)?op->_immediat:op->_data_rb));554 log_printf(TRACE,Functionnal_unit,FUNCTION," * data_rbs : %.8x", signed( (op->_has_immediat==1)?op->_immediat:op->_data_rb));542 log_printf(TRACE,Functionnal_unit,FUNCTION," * data_ra : %.8x",unsigned(param->_size_data,op->_data_ra)); 543 log_printf(TRACE,Functionnal_unit,FUNCTION," * data_ras : %.8x", signed(param->_size_data,op->_data_ra)); 544 log_printf(TRACE,Functionnal_unit,FUNCTION," * data_rb : %.8x",unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb)); 545 log_printf(TRACE,Functionnal_unit,FUNCTION," * data_rbs : %.8x", signed(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb)); 555 546 556 547 bool f_out; 557 548 558 switch (concatenation_bool(sign( gpr1),sign(gpr2)))549 switch (concatenation_bool(sign(param->_size_data,gpr1),sign(param->_size_data,gpr2))) 559 550 { 560 551 case 1 /*b01*/ : f_out = 1 ; break; 561 552 case 2 /*b10*/ : f_out = 0 ; break; 562 default : f_out = signed( gpr1) >= signed(gpr2); break;553 default : f_out = signed(param->_size_data,gpr1) >= signed(param->_size_data,gpr2); break; 563 554 } 564 555 … … 585 576 bool f_out; 586 577 587 switch (concatenation_bool(sign( gpr1),sign(gpr2)))578 switch (concatenation_bool(sign(param->_size_data,gpr1),sign(param->_size_data,gpr2))) 588 579 { 589 580 case 1 /*b01*/ : f_out = 1; break; 590 581 case 2 /*b10*/ : f_out = 0; break; 591 default : f_out = signed( gpr1) > signed(gpr2); break;582 default : f_out = signed(param->_size_data,gpr1) > signed(param->_size_data,gpr2); break; 592 583 } 593 584 … … 612 603 bool f_out; 613 604 614 switch (concatenation_bool(sign( gpr1),sign(gpr2)))605 switch (concatenation_bool(sign(param->_size_data,gpr1),sign(param->_size_data,gpr2))) 615 606 { 616 607 case 1 /*b01*/ : f_out = 0; break; 617 608 case 2 /*b10*/ : f_out = 1; break; 618 default : f_out = signed( gpr1) <= signed(gpr2); break;609 default : f_out = signed(param->_size_data,gpr1) <= signed(param->_size_data,gpr2); break; 619 610 } 620 611 … … 639 630 bool f_out; 640 631 641 switch (concatenation_bool(sign( gpr1),sign(gpr2)))632 switch (concatenation_bool(sign(param->_size_data,gpr1),sign(param->_size_data,gpr2))) 642 633 { 643 634 case 1 /*b01*/ : f_out = 0; break; 644 635 case 2 /*b10*/ : f_out = 1; break; 645 default : f_out = signed( gpr1) < signed(gpr2); break;636 default : f_out = signed(param->_size_data,gpr1) < signed(param->_size_data,gpr2); break; 646 637 } 647 638 … … 661 652 log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_mtspr"); 662 653 663 Tgeneral_data_t imm = unsigned( op->_immediat);664 Tgeneral_data_t gpr1 = unsigned( op->_data_ra);665 Tgeneral_data_t gpr2 = unsigned( op->_data_rb);654 Tgeneral_data_t imm = unsigned(param->_size_data,op->_immediat); 655 Tgeneral_data_t gpr1 = unsigned(param->_size_data,op->_data_ra); 656 Tgeneral_data_t gpr2 = unsigned(param->_size_data,op->_data_rb); 666 657 Tgeneral_data_t addr = range<Tgeneral_data_t>(gpr1|imm,16); 667 658 … … 694 685 else 695 686 { 696 exception = EXCEPTION_ALU_SPR_ACCESS_ NOT_COMPLETE;687 exception = EXCEPTION_ALU_SPR_ACCESS_MUST_WRITE; 697 688 } 698 689 … … 712 703 log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_mfspr"); 713 704 714 Tgeneral_data_t imm = unsigned( op->_immediat);715 Tgeneral_data_t gpr1 = unsigned( op->_data_ra);705 Tgeneral_data_t imm = unsigned(param->_size_data,op->_immediat); 706 Tgeneral_data_t gpr1 = unsigned(param->_size_data,op->_data_ra); 716 707 Tgeneral_data_t gpr2 = 0; 717 708 Tgeneral_data_t addr = range<Tgeneral_data_t>(gpr1|imm,16); … … 745 736 else 746 737 { 747 exception = EXCEPTION_ALU_SPR_ACCESS_ NOT_COMPLETE;738 exception = EXCEPTION_ALU_SPR_ACCESS_MUST_READ; 748 739 } 749 740 … … 784 775 log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_mac"); 785 776 786 Tgeneral_data_t gpr1 = unsigned( op->_data_ra);787 Tgeneral_data_t gpr2 = unsigned( (op->_has_immediat==1)?op->_immediat:op->_data_rb);777 Tgeneral_data_t gpr1 = unsigned(param->_size_data,op->_data_ra); 778 Tgeneral_data_t gpr2 = unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb); 788 779 uint64_t temp = range<uint64_t>(gpr1 * gpr2, 32); 789 780 … … 808 799 log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_msb"); 809 800 810 Tgeneral_data_t gpr1 = unsigned( op->_data_ra);811 Tgeneral_data_t gpr2 = unsigned( (op->_has_immediat==1)?op->_immediat:op->_data_rb);801 Tgeneral_data_t gpr1 = unsigned(param->_size_data,op->_data_ra); 802 Tgeneral_data_t gpr2 = unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb); 812 803 uint64_t temp = range<uint64_t>(gpr1 * gpr2, 32); 813 804
Note: See TracChangeset
for help on using the changeset viewer.