e2k: optimize
This commit is contained in:
parent
0e0d06070c
commit
760b1d9805
47
src/e2k.S
47
src/e2k.S
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue