Add "16bit * 8bit / 8bit" to fixed point math library
This commit is contained in:
parent
4538f0295d
commit
8c77a5d256
|
@ -426,3 +426,92 @@ int lmuldiv16s(int a, int b, int c)
|
||||||
E1:
|
E1:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
unsigned lmuldiv16by8(unsigned a, char b, char c)
|
||||||
|
{
|
||||||
|
__asm {
|
||||||
|
|
||||||
|
lda #0
|
||||||
|
sta accu + 0
|
||||||
|
sta accu + 1
|
||||||
|
sta accu + 2
|
||||||
|
sta accu + 3
|
||||||
|
|
||||||
|
lda b
|
||||||
|
beq z1
|
||||||
|
|
||||||
|
lda c
|
||||||
|
l1:
|
||||||
|
asl
|
||||||
|
bcs e1
|
||||||
|
cmp b
|
||||||
|
bcs e2
|
||||||
|
|
||||||
|
asl a + 0
|
||||||
|
rol a + 1
|
||||||
|
jmp l1
|
||||||
|
e2:
|
||||||
|
clc
|
||||||
|
e1:
|
||||||
|
ror
|
||||||
|
sta c
|
||||||
|
|
||||||
|
ldx #16
|
||||||
|
l2:
|
||||||
|
lda b
|
||||||
|
sec
|
||||||
|
sbc c
|
||||||
|
bcc w1
|
||||||
|
sta b
|
||||||
|
|
||||||
|
clc
|
||||||
|
lda accu + 2
|
||||||
|
adc a
|
||||||
|
sta accu + 2
|
||||||
|
lda accu + 3
|
||||||
|
adc a + 1
|
||||||
|
sta accu + 3
|
||||||
|
bcc * + 8
|
||||||
|
inc accu + 0
|
||||||
|
bne * + 4
|
||||||
|
inc accu + 1
|
||||||
|
|
||||||
|
w1:
|
||||||
|
asl accu + 2
|
||||||
|
rol accu + 3
|
||||||
|
rol accu + 0
|
||||||
|
rol accu + 1
|
||||||
|
|
||||||
|
asl b
|
||||||
|
bcc w2
|
||||||
|
lda b
|
||||||
|
sbc c
|
||||||
|
sta b
|
||||||
|
|
||||||
|
clc
|
||||||
|
lda accu + 2
|
||||||
|
adc a
|
||||||
|
sta accu + 2
|
||||||
|
lda accu + 3
|
||||||
|
adc a + 1
|
||||||
|
sta accu + 3
|
||||||
|
bcc * + 8
|
||||||
|
inc accu + 0
|
||||||
|
bne * + 4
|
||||||
|
inc accu + 1
|
||||||
|
|
||||||
|
w2:
|
||||||
|
dex
|
||||||
|
bne l2
|
||||||
|
z1:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int lmuldiv16sby8(int a, char b, char c)
|
||||||
|
{
|
||||||
|
if (a < 0)
|
||||||
|
return -(int)lmuldiv16by8(-a, b, c);
|
||||||
|
else
|
||||||
|
return lmuldiv16by8(a, b, c);
|
||||||
|
}
|
||||||
|
|
|
@ -37,6 +37,11 @@ __native unsigned lmuldiv16u(unsigned a, unsigned b, unsigned c)
|
||||||
// Multiply two signed 16bit numbers and divide the result by another signed 16bit number a * b / c
|
// Multiply two signed 16bit numbers and divide the result by another signed 16bit number a * b / c
|
||||||
__native int lmuldiv16s(int a, int b, int c)
|
__native int lmuldiv16s(int a, int b, int c)
|
||||||
|
|
||||||
|
|
||||||
|
__native unsigned lmuldiv16by8(unsigned a, char b, char c);
|
||||||
|
|
||||||
|
inline int lmuldiv16sby8(int a, char b, char c);
|
||||||
|
|
||||||
#pragma compile("fixmath.c")
|
#pragma compile("fixmath.c")
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -15325,8 +15325,11 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass
|
||||||
}
|
}
|
||||||
else if (mIns[i].mType == ASMIT_STY && (mIns[i].mMode == ASMIM_ZERO_PAGE || mIns[i].mMode == ASMIM_ABSOLUTE))
|
else if (mIns[i].mType == ASMIT_STY && (mIns[i].mMode == ASMIM_ZERO_PAGE || mIns[i].mMode == ASMIM_ABSOLUTE))
|
||||||
{
|
{
|
||||||
if (MoveStoreYUp(i))
|
if (i > 1 || mIns[0].mType != ASMIT_STX)
|
||||||
changed = true;
|
{
|
||||||
|
if (MoveStoreYUp(i))
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (mIns[i].mType == ASMIT_LDY && mIns[i].mMode == ASMIM_ZERO_PAGE && !(mIns[i].mLive & LIVE_MEM))
|
else if (mIns[i].mType == ASMIT_LDY && mIns[i].mMode == ASMIM_ZERO_PAGE && !(mIns[i].mLive & LIVE_MEM))
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue