Changeset 101 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:
- Jan 15, 2009, 6:19:08 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
r100 r101 90 90 91 91 bool overflow = ovf (param->_size_data,gpr1,gpr2,gpr3); 92 bool carry_out = carry(param->_size_data,gpr1,gpr2,gpr3); 92 // bool carry_out = carry(param->_size_data,gpr1,gpr2,gpr3); 93 // In ISA : l.sub don't change flag carry 94 bool carry_out = get_flag(op->_data_rc,FLAG_CY); 93 95 94 96 // Result … … 104 106 105 107 #undef FUNCTION 108 #define FUNCTION "Functionnal_unit::operation_l_mul" 109 void operation_l_mul (execute_operation_t * op, execute_register_t * reg, execute_param_t * param) 110 { 111 log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_mul"); 112 113 Tgeneral_data_t gpr1 = unsigned(param->_size_data,op->_data_ra); 114 Tgeneral_data_t gpr2 = unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb); 115 Tgeneral_data_t gpr3 ; 116 bool overflow ; 117 bool carry_out ; 118 119 if (param->_size_data == 32) 120 { 121 int64_t res = static_cast<int64_t>(gpr1) * static_cast<int64_t>(gpr2); 122 123 log_printf(TRACE,Functionnal_unit,FUNCTION," * res : %llx",res); 124 125 gpr3 = param->_mask_data & static_cast<Tgeneral_data_t>(res); 126 carry_out = res != gpr3; 127 overflow = carry_out; 128 } 129 else 130 { 131 throw ERRORMORPHEO(FUNCTION,_("64 bits multiplcation : not yet implemented\n")); 132 } 133 134 // Result 135 op->_timing = param->_timing[op->_type][op->_operation]; 136 op->_data_rd = gpr3; 137 op->_data_re = 0; 138 op->_data_re = set_flag(op->_data_re,FLAG_OV,overflow ); 139 op->_data_re = set_flag(op->_data_re,FLAG_CY,carry_out); 140 op->_exception = (overflow==1)?EXCEPTION_ALU_RANGE:EXCEPTION_ALU_NONE; 141 op->_no_sequence = 0; 142 //op->_address = 0; 143 }; 144 145 #undef FUNCTION 146 #define FUNCTION "Functionnal_unit::operation_l_mulu" 147 void operation_l_mulu (execute_operation_t * op, execute_register_t * reg, execute_param_t * param) 148 { 149 log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_mulu"); 150 151 Tgeneral_data_t gpr1 = unsigned(param->_size_data,op->_data_ra); 152 Tgeneral_data_t gpr2 = unsigned(param->_size_data,op->_data_rb); 153 Tgeneral_data_t gpr3 ; 154 bool overflow ; 155 bool carry_out ; 156 157 if (param->_size_data == 32) 158 { 159 uint64_t res = static_cast<uint64_t>(gpr1) * static_cast<uint64_t>(gpr2); 160 161 log_printf(TRACE,Functionnal_unit,FUNCTION," * res : %llx",res); 162 163 gpr3 = param->_mask_data & static_cast<Tgeneral_data_t>(res); 164 carry_out = res != gpr3; 165 overflow = carry_out; 166 } 167 else 168 { 169 throw ERRORMORPHEO(FUNCTION,_("64 bits multiplcation : not yet implemented\n")); 170 } 171 172 // Result 173 op->_timing = param->_timing[op->_type][op->_operation]; 174 op->_data_rd = gpr3; 175 op->_data_re = 0; 176 op->_data_re = set_flag(op->_data_re,FLAG_OV,overflow ); 177 op->_data_re = set_flag(op->_data_re,FLAG_CY,carry_out); 178 op->_exception = (overflow==1)?EXCEPTION_ALU_RANGE:EXCEPTION_ALU_NONE; 179 op->_no_sequence = 0; 180 //op->_address = 0; 181 }; 182 183 #undef FUNCTION 184 #define FUNCTION "Functionnal_unit::operation_l_div" 185 void operation_l_div (execute_operation_t * op, execute_register_t * reg, execute_param_t * param) 186 { 187 log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_div"); 188 189 Tgeneral_data_t gpr1 = signed(param->_size_data,op->_data_ra); 190 Tgeneral_data_t gpr2 = signed(param->_size_data,op->_data_rb); 191 Tgeneral_data_t gpr3 = (gpr2!=0)?(gpr1/gpr2):0; 192 bool overflow = ovf (param->_size_data,gpr1,gpr2,gpr3); 193 bool carry_out = (gpr2==0); 194 195 // Result 196 op->_timing = param->_timing[op->_type][op->_operation]; 197 op->_data_rd = gpr3; 198 op->_data_re = 0; 199 op->_data_re = set_flag(op->_data_re,FLAG_OV,overflow ); 200 op->_data_re = set_flag(op->_data_re,FLAG_CY,carry_out); 201 op->_exception = (overflow==1)?EXCEPTION_ALU_RANGE:EXCEPTION_ALU_NONE; 202 op->_no_sequence = 0; 203 //op->_address = 0; 204 }; 205 206 #undef FUNCTION 207 #define FUNCTION "Functionnal_unit::operation_l_divu" 208 void operation_l_divu (execute_operation_t * op, execute_register_t * reg, execute_param_t * param) 209 { 210 log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_divu"); 211 212 Tgeneral_data_t gpr1 = unsigned(param->_size_data,op->_data_ra); 213 Tgeneral_data_t gpr2 = unsigned(param->_size_data,op->_data_rb); 214 Tgeneral_data_t gpr3 = (gpr2!=0)?(gpr1/gpr2):0; 215 bool overflow = ovf (param->_size_data,gpr1,gpr2,gpr3); 216 bool carry_out = (gpr2==0); 217 218 // Result 219 op->_timing = param->_timing[op->_type][op->_operation]; 220 op->_data_rd = gpr3; 221 op->_data_re = 0; 222 op->_data_re = set_flag(op->_data_re,FLAG_OV,overflow ); 223 op->_data_re = set_flag(op->_data_re,FLAG_CY,carry_out); 224 op->_exception = (overflow==1)?EXCEPTION_ALU_RANGE:EXCEPTION_ALU_NONE; 225 op->_no_sequence = 0; 226 //op->_address = 0; 227 }; 228 229 #undef FUNCTION 106 230 #define FUNCTION "Functionnal_unit::operation_l_and" 107 231 void operation_l_and (execute_operation_t * op, execute_register_t * reg, execute_param_t * param) … … 465 589 Tgeneral_data_t gpr2 = unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb); 466 590 591 // Tgeneral_data_t is unsigned 467 592 bool f_out = (gpr1 >= gpr2); 468 593 … … 485 610 Tgeneral_data_t gpr2 = unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb); 486 611 612 // Tgeneral_data_t is unsigned 487 613 bool f_out = (gpr1 > gpr2); 488 614 … … 505 631 Tgeneral_data_t gpr2 = unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb); 506 632 633 // Tgeneral_data_t is unsigned 507 634 bool f_out = (gpr1 <= gpr2); 508 635 … … 525 652 Tgeneral_data_t gpr2 = unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb); 526 653 654 // Tgeneral_data_t is unsigned 527 655 bool f_out = (gpr1 < gpr2); 528 656 … … 544 672 Tgeneral_data_t gpr1 = op->_data_ra; 545 673 Tgeneral_data_t gpr2 = (op->_has_immediat==1)?op->_immediat:op->_data_rb; 546 547 log_printf(TRACE,Functionnal_unit,FUNCTION," * data_ra : %.8x",unsigned(param->_size_data,op->_data_ra)); 548 log_printf(TRACE,Functionnal_unit,FUNCTION," * data_ras : %.8x", signed(param->_size_data,op->_data_ra)); 549 log_printf(TRACE,Functionnal_unit,FUNCTION," * data_rb : %.8x",unsigned(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb)); 550 log_printf(TRACE,Functionnal_unit,FUNCTION," * data_rbs : %.8x", signed(param->_size_data,(op->_has_immediat==1)?op->_immediat:op->_data_rb)); 551 674 552 675 bool f_out; 553 676 554 switch (concatenation_bool(sign(param->_size_data,gpr1),sign(param->_size_data,gpr2))) 555 { 556 case 1 /*b01*/ : f_out = 1 ; break; 557 case 2 /*b10*/ : f_out = 0 ; break; 558 default : f_out = signed(param->_size_data,gpr1) >= signed(param->_size_data,gpr2); break; 559 } 560 561 log_printf(TRACE,Functionnal_unit,FUNCTION," * f_out : %.8x",f_out); 677 if (param->_size_data == 32) 678 f_out = static_cast<int32_t>(gpr1) >= static_cast<int32_t>(gpr2); 679 else 680 f_out = static_cast<int64_t>(gpr1) >= static_cast<int64_t>(gpr2); 681 682 // switch (concatenation_bool(sign(param->_size_data,gpr1),sign(param->_size_data,gpr2))) 683 // { 684 // case 1 /*b01*/ : f_out = 1 ; break; 685 // case 2 /*b10*/ : f_out = 0 ; break; 686 // default : f_out = signed(param->_size_data,gpr1) >= signed(param->_size_data,gpr2); break; 687 // } 562 688 563 689 // Result … … 581 707 bool f_out; 582 708 583 switch (concatenation_bool(sign(param->_size_data,gpr1),sign(param->_size_data,gpr2))) 584 { 585 case 1 /*b01*/ : f_out = 1; break; 586 case 2 /*b10*/ : f_out = 0; break; 587 default : f_out = signed(param->_size_data,gpr1) > signed(param->_size_data,gpr2); break; 588 } 709 if (param->_size_data == 32) 710 f_out = static_cast<int32_t>(gpr1) > static_cast<int32_t>(gpr2); 711 else 712 f_out = static_cast<int64_t>(gpr1) > static_cast<int64_t>(gpr2); 713 714 // switch (concatenation_bool(sign(param->_size_data,gpr1),sign(param->_size_data,gpr2))) 715 // { 716 // case 1 /*b01*/ : f_out = 1; break; 717 // case 2 /*b10*/ : f_out = 0; break; 718 // default : f_out = signed(param->_size_data,gpr1) > signed(param->_size_data,gpr2); break; 719 // } 589 720 590 721 // Result … … 608 739 bool f_out; 609 740 610 switch (concatenation_bool(sign(param->_size_data,gpr1),sign(param->_size_data,gpr2))) 611 { 612 case 1 /*b01*/ : f_out = 0; break; 613 case 2 /*b10*/ : f_out = 1; break; 614 default : f_out = signed(param->_size_data,gpr1) <= signed(param->_size_data,gpr2); break; 615 } 741 if (param->_size_data == 32) 742 f_out = static_cast<int32_t>(gpr1) <= static_cast<int32_t>(gpr2); 743 else 744 f_out = static_cast<int64_t>(gpr1) <= static_cast<int64_t>(gpr2); 745 746 // switch (concatenation_bool(sign(param->_size_data,gpr1),sign(param->_size_data,gpr2))) 747 // { 748 // case 1 /*b01*/ : f_out = 0; break; 749 // case 2 /*b10*/ : f_out = 1; break; 750 // default : f_out = signed(param->_size_data,gpr1) <= signed(param->_size_data,gpr2); break; 751 // } 616 752 617 753 // Result … … 635 771 bool f_out; 636 772 637 switch (concatenation_bool(sign(param->_size_data,gpr1),sign(param->_size_data,gpr2))) 638 { 639 case 1 /*b01*/ : f_out = 0; break; 640 case 2 /*b10*/ : f_out = 1; break; 641 default : f_out = signed(param->_size_data,gpr1) < signed(param->_size_data,gpr2); break; 642 } 773 if (param->_size_data == 32) 774 f_out = static_cast<int32_t>(gpr1) < static_cast<int32_t>(gpr2); 775 else 776 f_out = static_cast<int64_t>(gpr1) < static_cast<int64_t>(gpr2); 777 778 // switch (concatenation_bool(sign(param->_size_data,gpr1),sign(param->_size_data,gpr2))) 779 // { 780 // case 1 /*b01*/ : f_out = 0; break; 781 // case 2 /*b10*/ : f_out = 1; break; 782 // default : f_out = signed(param->_size_data,gpr1) < signed(param->_size_data,gpr2); break; 783 // } 643 784 644 785 // Result
Note: See TracChangeset
for help on using the changeset viewer.