Optimize 8 by 16 bit multiply
This commit is contained in:
parent
1f492e7820
commit
056b49e1d1
|
@ -839,6 +839,55 @@ W1: asl accu
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
__asm mul16by8
|
||||||
|
{
|
||||||
|
lsr
|
||||||
|
beq zero
|
||||||
|
more:
|
||||||
|
ldx #0
|
||||||
|
ldy #0
|
||||||
|
bcc skip
|
||||||
|
odd:
|
||||||
|
ldy accu
|
||||||
|
ldx accu + 1
|
||||||
|
bcs skip
|
||||||
|
|
||||||
|
loop:
|
||||||
|
sta tmpy
|
||||||
|
|
||||||
|
clc
|
||||||
|
tya
|
||||||
|
adc accu
|
||||||
|
tay
|
||||||
|
txa
|
||||||
|
adc accu + 1
|
||||||
|
tax
|
||||||
|
|
||||||
|
lda tmpy
|
||||||
|
skip:
|
||||||
|
asl accu
|
||||||
|
rol accu + 1
|
||||||
|
lsr
|
||||||
|
bcc skip
|
||||||
|
bne loop
|
||||||
|
done:
|
||||||
|
clc
|
||||||
|
tya
|
||||||
|
adc accu
|
||||||
|
sta accu
|
||||||
|
txa
|
||||||
|
adc accu + 1
|
||||||
|
sta accu + 1
|
||||||
|
rts
|
||||||
|
zero:
|
||||||
|
bcs one
|
||||||
|
sta accu
|
||||||
|
sta accu + 1
|
||||||
|
one:
|
||||||
|
rts
|
||||||
|
}
|
||||||
|
#else
|
||||||
__asm mul16by8
|
__asm mul16by8
|
||||||
{
|
{
|
||||||
ldy #0
|
ldy #0
|
||||||
|
@ -866,6 +915,7 @@ L2:
|
||||||
sty tmp + 2
|
sty tmp + 2
|
||||||
rts
|
rts
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
__asm divs16
|
__asm divs16
|
||||||
{
|
{
|
||||||
|
|
|
@ -9390,6 +9390,8 @@ int NativeCodeBasicBlock::ShortMultiply(InterCodeProcedure* proc, NativeCodeProc
|
||||||
|
|
||||||
NativeCodeGenerator::Runtime& rt(nproc->mGenerator->ResolveRuntime(Ident::Unique("mul16by8")));
|
NativeCodeGenerator::Runtime& rt(nproc->mGenerator->ResolveRuntime(Ident::Unique("mul16by8")));
|
||||||
mIns.Push(NativeCodeInstruction(ins, ASMIT_JSR, ASMIM_ABSOLUTE, rt.mOffset, rt.mLinkerObject, NCIF_RUNTIME | NCIF_LOWER | NCIF_UPPER | NCIF_USE_CPU_REG_A));
|
mIns.Push(NativeCodeInstruction(ins, ASMIT_JSR, ASMIM_ABSOLUTE, rt.mOffset, rt.mLinkerObject, NCIF_RUNTIME | NCIF_LOWER | NCIF_UPPER | NCIF_USE_CPU_REG_A));
|
||||||
|
|
||||||
|
return BC_REG_ACCU;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -9425,6 +9427,8 @@ int NativeCodeBasicBlock::ShortMultiply(InterCodeProcedure* proc, NativeCodeProc
|
||||||
|
|
||||||
NativeCodeGenerator::Runtime& rt(nproc->mGenerator->ResolveRuntime(Ident::Unique("mul16by8")));
|
NativeCodeGenerator::Runtime& rt(nproc->mGenerator->ResolveRuntime(Ident::Unique("mul16by8")));
|
||||||
mIns.Push(NativeCodeInstruction(ins, ASMIT_JSR, ASMIM_ABSOLUTE, rt.mOffset, rt.mLinkerObject, NCIF_RUNTIME | NCIF_LOWER | NCIF_UPPER | NCIF_USE_CPU_REG_A));
|
mIns.Push(NativeCodeInstruction(ins, ASMIT_JSR, ASMIM_ABSOLUTE, rt.mOffset, rt.mLinkerObject, NCIF_RUNTIME | NCIF_LOWER | NCIF_UPPER | NCIF_USE_CPU_REG_A));
|
||||||
|
|
||||||
|
return BC_REG_ACCU;
|
||||||
}
|
}
|
||||||
|
|
||||||
return BC_REG_WORK + 2;
|
return BC_REG_WORK + 2;
|
||||||
|
@ -10995,7 +10999,7 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p
|
||||||
|
|
||||||
NativeCodeGenerator::Runtime& frt(nproc->mGenerator->ResolveRuntime(Ident::Unique("mul16by8")));
|
NativeCodeGenerator::Runtime& frt(nproc->mGenerator->ResolveRuntime(Ident::Unique("mul16by8")));
|
||||||
mIns.Push(NativeCodeInstruction(ins, ASMIT_JSR, ASMIM_ABSOLUTE, frt.mOffset, frt.mLinkerObject, NCIF_RUNTIME | NCIF_LOWER | NCIF_UPPER | NCIF_USE_CPU_REG_A));
|
mIns.Push(NativeCodeInstruction(ins, ASMIT_JSR, ASMIM_ABSOLUTE, frt.mOffset, frt.mLinkerObject, NCIF_RUNTIME | NCIF_LOWER | NCIF_UPPER | NCIF_USE_CPU_REG_A));
|
||||||
reg = BC_REG_WORK + 2;
|
reg = BC_REG_ACCU;
|
||||||
}
|
}
|
||||||
else if (ins->mOperator == IA_MUL && ins->mSrc[1].IsUByte())
|
else if (ins->mOperator == IA_MUL && ins->mSrc[1].IsUByte())
|
||||||
{
|
{
|
||||||
|
@ -11019,7 +11023,7 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p
|
||||||
|
|
||||||
NativeCodeGenerator::Runtime& frt(nproc->mGenerator->ResolveRuntime(Ident::Unique("mul16by8")));
|
NativeCodeGenerator::Runtime& frt(nproc->mGenerator->ResolveRuntime(Ident::Unique("mul16by8")));
|
||||||
mIns.Push(NativeCodeInstruction(ins, ASMIT_JSR, ASMIM_ABSOLUTE, frt.mOffset, frt.mLinkerObject, NCIF_RUNTIME | NCIF_LOWER | NCIF_UPPER | NCIF_USE_CPU_REG_A));
|
mIns.Push(NativeCodeInstruction(ins, ASMIT_JSR, ASMIM_ABSOLUTE, frt.mOffset, frt.mLinkerObject, NCIF_RUNTIME | NCIF_LOWER | NCIF_UPPER | NCIF_USE_CPU_REG_A));
|
||||||
reg = BC_REG_WORK + 2;
|
reg = BC_REG_ACCU;
|
||||||
}
|
}
|
||||||
#if 1
|
#if 1
|
||||||
else if (ins->mOperator == IA_DIVS && ins->mSrc[0].mTemp < 0 && (ins->mSrc[0].mIntConst == 2 || ins->mSrc[0].mIntConst == 4 || ins->mSrc[0].mIntConst == 8))
|
else if (ins->mOperator == IA_DIVS && ins->mSrc[0].mTemp < 0 && (ins->mSrc[0].mIntConst == 2 || ins->mSrc[0].mIntConst == 4 || ins->mSrc[0].mIntConst == 8))
|
||||||
|
|
Loading…
Reference in New Issue