e2k: optimize

This commit is contained in:
Denis Drakhnia 2023-12-13 12:52:01 +02:00
parent 0e0d06070c
commit 760b1d9805
1 changed files with 33 additions and 14 deletions

View File

@ -46,7 +46,6 @@
#define IS_NOT_TAKEN %pred29 #define IS_NOT_TAKEN %pred29
#define LOOP %ctpr1 #define LOOP %ctpr1
#define PIPELINE %ctpr2
#define CALL %ctpr3 #define CALL %ctpr3
.text .text
@ -61,7 +60,7 @@ run_program_e2k:
addd,1 TAPE, 0, CUR addd,1 TAPE, 0, CUR
addd,2 0, 0, PC addd,2 0, 0, PC
ldb,3 TAPE, 0, ACC ldb,3 TAPE, 0, ACC
disp PIPELINE, pipeline disp %ctpr1, pipeline
} }
{ {
nop 3 nop 3
@ -72,7 +71,7 @@ run_program_e2k:
} }
{ {
rrd,0 %clkr, STATS_CPU_CYCLES rrd,0 %clkr, STATS_CPU_CYCLES
ct PIPELINE ct %ctpr1
} }
call: call:
@ -125,7 +124,6 @@ call:
! II0 - F - Fetch (latency 3) ! II0 - F - Fetch (latency 3)
! II1 - D - Decode (latency 3) ! II1 - D - Decode (latency 3)
! II2 - E - Execute (latency 3-7) ! II2 - E - Execute (latency 3-7)
! TODO: branch prediction
pipeline: pipeline:
{ {
addd,0 PC, 4, NPC_E addd,0 PC, 4, NPC_E
@ -134,10 +132,10 @@ pipeline:
disp LOOP, loop disp LOOP, loop
} }
{ {
nop 1
ldw,2,sm CODE, NPC_E, INSN_D ldw,2,sm CODE, NPC_E, INSN_D
disp PIPELINE, pipeline
}
disp CALL, call disp CALL, call
}
{ {
cmpandesb,0,sm INSN_E, OP_MOV, IS_NOT_MOV_E cmpandesb,0,sm INSN_E, OP_MOV, IS_NOT_MOV_E
cmpandesb,1,sm INSN_E, OP_BEQZ, IS_NOT_BEQZ_E cmpandesb,1,sm INSN_E, OP_BEQZ, IS_NOT_BEQZ_E
@ -197,17 +195,38 @@ loop:
ct LOOP ? ~IS_NOT_EXE_E ct LOOP ? ~IS_NOT_EXE_E
} }
{ {
! Execute (extra): exit pipeline and call function addd,3 NPC_E, 0, PC ? IS_NOT_TAKEN
addd,1 NPC_E, 0, PC ? ~IS_NOT_CALL_E addd,4 BRANCH_TARGET_E, 0, PC ? ~IS_NOT_TAKEN
ldw,0,sm CODE, NPC_E, INSN_E ? IS_NOT_TAKEN
ldw,2,sm CODE, BRANCH_TARGET_E, INSN_E ? ~IS_NOT_TAKEN
ct CALL ? ~IS_NOT_CALL_E ct CALL ? ~IS_NOT_CALL_E
} }
{ {
! Execute (extra): restart pipeline addd,0 NPC_E, 4, NPC_E ? IS_NOT_TAKEN
addd,0 NPC_E, 0, PC ? IS_NOT_TAKEN addd,1 BRANCH_TARGET_E, 4, NPC_E ? ~IS_NOT_TAKEN
addd,1 BRANCH_TARGET_E, 0, PC ? ~IS_NOT_TAKEN addd,3 PC, 8, NPC_D
addd,2 STATS_BRANCHES, 1, STATS_BRANCHES ? ~IS_NOT_BRANCH }
addd,3 STATS_BRANCHES_TAKEN, 1, STATS_BRANCHES_TAKEN ? ~IS_NOT_TAKEN {
ct PIPELINE ? ~IS_NOT_BRANCH ldw,2,sm CODE, NPC_E, INSN_D
addd,0 STATS_BRANCHES, 1, STATS_BRANCHES ? ~IS_NOT_BRANCH
addd,1 STATS_BRANCHES_TAKEN, 1, STATS_BRANCHES_TAKEN ? ~IS_NOT_TAKEN
}
{
cmpandesb,0,sm INSN_E, OP_MOV, IS_NOT_MOV_E
cmpandesb,1,sm INSN_E, OP_BEQZ, IS_NOT_BEQZ_E
getfd,2,sm INSN_E, 0x7686, IMM_E
}
{
cmpandesb,0,sm INSN_E, OP_BNEZ, IS_NOT_BNEZ_E
cmpandesb,1,sm INSN_E, OP_ADD, IS_NOT_ADD_E
addd,2,sm NPC_E, IMM_E, BRANCH_TARGET_E
cmpandesb,3,sm INSN_E, OP_EXE, IS_NOT_EXE_E
cmpandesb,4,sm INSN_E, OP_CALL, IS_NOT_CALL_E
ct LOOP ? ~IS_NOT_BRANCH
} }
{ {
! remove end op from counter ! remove end op from counter