@@ -366,7 +366,9 @@ DecodeState Core::decode(const FetchInterstage &dt) {
366
366
.ff_rs = FORWARD_NONE,
367
367
.ff_rt = FORWARD_NONE,
368
368
.alu_component = (flags & IMF_AMO) ? AluComponent::PASS :
369
- (flags & IMF_MUL) ? AluComponent::MUL : AluComponent::ALU,
369
+ (flags & IMF_MUL) ? AluComponent::MUL :
370
+ // AluComponent::ALU,
371
+ (flags & (IMF_ALU_REQ_RD_F | IMF_ALU_REQ_RS_F | IMF_ALU_REQ_RT_F)) == (IMF_ALU_REQ_RD_F | IMF_ALU_REQ_RS_F | IMF_ALU_REQ_RT_F) ? AluComponent::FALU : AluComponent::ALU,
370
372
.aluop = alu_op,
371
373
.memctl = mem_ctl,
372
374
.num_rs = num_rs,
@@ -376,8 +378,10 @@ DecodeState Core::decode(const FetchInterstage &dt) {
376
378
.memwrite = bool (flags & IMF_MEMWRITE),
377
379
.alusrc = bool (flags & IMF_ALUSRC),
378
380
.regwrite = regwrite,
381
+ .regwrite_fp = bool (flags & IMF_ALU_REQ_RD_F),
379
382
.alu_req_rs = bool (flags & IMF_ALU_REQ_RS),
380
383
.alu_req_rt = bool (flags & IMF_ALU_REQ_RT),
384
+ .alu_fp = bool (flags & (IMF_ALU_REQ_RD_F | IMF_ALU_REQ_RS_F | IMF_ALU_REQ_RT_F)), // maybe not correct
381
385
.branch_bxx = bool (flags & IMF_BRANCH),
382
386
.branch_jal = bool (flags & IMF_JUMP),
383
387
.branch_val = bool (flags & IMF_BJ_NOT),
@@ -451,6 +455,8 @@ ExecuteState Core::execute(const DecodeInterstage &dt) {
451
455
.memread = dt.memread ,
452
456
.memwrite = dt.memwrite ,
453
457
.regwrite = dt.regwrite ,
458
+ .regwrite_fp = dt.regwrite_fp ,
459
+ .alu_fp = dt.alu_fp ,
454
460
.is_valid = dt.is_valid ,
455
461
.branch_bxx = dt.branch_bxx ,
456
462
.branch_jal = dt.branch_jal ,
@@ -546,13 +552,14 @@ MemoryState Core::memory(const ExecuteInterstage &dt) {
546
552
.num_rd = dt.num_rd ,
547
553
.memtoreg = memread,
548
554
.regwrite = regwrite,
555
+ .regwrite_fp = dt.regwrite_fp ,
549
556
.is_valid = dt.is_valid ,
550
557
.csr_written = csr_written,
551
558
} };
552
559
}
553
560
554
561
WritebackState Core::writeback (const MemoryInterstage &dt) {
555
- if (dt.regwrite ) { regs->write_gp (dt.num_rd , dt.towrite_val ); }
562
+ if (dt.regwrite ) { (dt. regwrite_fp ) ? regs-> write_fp (dt. num_rd , dt. towrite_val ) : regs->write_gp (dt.num_rd , dt.towrite_val ); }
556
563
557
564
return WritebackState { WritebackInternalState {
558
565
.inst = (dt.excause == EXCAUSE_NONE)? dt.inst : Instruction::NOP,
0 commit comments