📄 mcomp.cpp
字号:
dc.Byte(); dc.Ldr(dc.r6, dc.r0, 3);
dc.Orr(dc.r5, dc.r5, dc.r7, dc.LSL, 16);
dc.Byte(); dc.Ldr(dc.r7, dc.r0, 7);
dc.Orr(dc.r4, dc.r4, dc.r6, dc.LSL, 24);
dc.Byte(); dc.Ldr(dc.r6, dc.r0, 8);
dc.Orr(dc.r5, dc.r5, dc.r7, dc.LSL, 24);
dc.Add(dc.r0, dc.r0, dc.r2);
dc.Mov(dc.r2, dc.r4, dc.LSR, 8);
dc.Mov(dc.r3, dc.r5, dc.LSR, 8);
dc.Orr(dc.r2, dc.r2, dc.r5, dc.LSL, 24);
dc.Orr(dc.r3, dc.r3, dc.r6, dc.LSL, 24);
}else{
dc.Ldr(dc.r5, dc.r0, 4);
dc.Ldr(dc.r6, dc.r0, 8);
dc.LdrAdvance(dc.r4, dc.r0, dc.r2);
if(Pos+8 < 32){
dc.Mov(dc.r3, dc.r5, dc.LSR, Pos+8);
dc.Orr(dc.r3, dc.r3, dc.r6, dc.LSL, 32-Pos-8);
dc.Mov(dc.r2, dc.r4, dc.LSR, Pos+8);
dc.Orr(dc.r2, dc.r2, dc.r5, dc.LSL, 32-Pos-8);
}else{
dc.Mov(dc.r2, dc.r5);
dc.Mov(dc.r3, dc.r6);
}
if(Pos > 0){
dc.Mov(dc.r4, dc.r4, dc.LSR, Pos);
dc.Mov(dc.r6, dc.r6, dc.LSL, 32-Pos);
dc.Orr(dc.r4, dc.r4, dc.r5, dc.LSL, 32-Pos);
dc.Orr(dc.r5, dc.r6, dc.r5, dc.LSR, Pos);
}
}
dc.And(dc.r6, dc.r2, dc.r14);
dc.And(dc.r2, dc.r12, dc.r2, dc.LSR, 2);
dc.And(dc.r7, dc.r4, dc.r14);
dc.And(dc.r4, dc.r12, dc.r4, dc.LSR, 2);
dc.Add(dc.r4, dc.r4, dc.r2);
dc.Add(dc.r6, dc.r6, dc.r7);
dc.And(dc.r2, dc.r3, dc.r14);
dc.And(dc.r3, dc.r12, dc.r3, dc.LSR, 2);
dc.And(dc.r7, dc.r5, dc.r14);
dc.And(dc.r5, dc.r12, dc.r5, dc.LSR, 2);
dc.Add(dc.r5, dc.r5, dc.r3);
dc.Add(dc.r7, dc.r2, dc.r7);
}else{
//read result r8, dc.r9 dc.And(dc.r2, dc.r3 (one pixel to right)
//r10, dc.r11 can be used
if(Pos<0){
dc.Byte(); dc.Ldr(dc.r8, dc.r0, 0);
dc.Byte(); dc.Ldr(dc.r10, dc.r0, 1);
dc.Byte(); dc.Ldr(dc.r9, dc.r0, 4);
dc.Byte(); dc.Ldr(dc.r11, dc.r0, 5);
dc.Orr(dc.r8, dc.r8, dc.r10, dc.LSL, 8);
dc.Byte(); dc.Ldr(dc.r10, dc.r0, 2);
dc.Orr(dc.r9, dc.r9, dc.r11, dc.LSL, 8);
dc.Byte(); dc.Ldr(dc.r11, dc.r0, 6);
dc.Orr(dc.r8, dc.r8, dc.r10, dc.LSL, 16);
dc.Byte(); dc.Ldr(dc.r10, dc.r0, 3);
dc.Orr(dc.r9, dc.r9, dc.r11, dc.LSL, 16);
dc.Byte(); dc.Ldr(dc.r11, dc.r0, 7);
dc.Orr(dc.r8, dc.r8, dc.r10, dc.LSL, 24);
dc.Byte(); dc.Ldr(dc.r10, dc.r0, 8);
dc.Orr(dc.r9, dc.r9, dc.r11, dc.LSL, 24);
dc.Add(dc.r0, dc.r0, dc.r2);
dc.Mov(dc.r2, dc.r8, dc.LSR, 8);
dc.Mov(dc.r3, dc.r9, dc.LSR, 8);
dc.Orr(dc.r2, dc.r2, dc.r9, dc.LSL, 24);
dc.Orr(dc.r3, dc.r3, dc.r10, dc.LSL, 24);
}else{
dc.Ldr(dc.r9, dc.r0, 4);
dc.Ldr(dc.r10, dc.r0, 8);
dc.LdrAdvance(dc.r8, dc.r0, dc.r2);
if(Pos+8 < 32){
dc.Mov(dc.r3, dc.r9, dc.LSR, Pos+8);
dc.Orr(dc.r3, dc.r3, dc.r10, dc.LSL, 32-Pos-8);
dc.Mov(dc.r2, dc.r8, dc.LSR, Pos+8);
dc.Orr(dc.r2, dc.r2, dc.r9, dc.LSL, 32-Pos-8);
}else{
dc.Mov(dc.r2, dc.r9);
dc.Mov(dc.r3, dc.r10);
}
if(Pos > 0){
dc.Mov(dc.r8, dc.r8, dc.LSR, Pos);
dc.Mov(dc.r10, dc.r10, dc.LSL, 32-Pos);
dc.Orr(dc.r8, dc.r8, dc.r9, dc.LSL, 32-Pos);
dc.Orr(dc.r9, dc.r10, dc.r9, dc.LSR, Pos);
}
}
dc.And(dc.r10, dc.r2, dc.r14);
dc.And(dc.r2, dc.r12, dc.r2, dc.LSR, 2);
dc.And(dc.r11, dc.r8, dc.r14);
dc.And(dc.r8, dc.r12, dc.r8, dc.LSR, 2);
dc.Add(dc.r8, dc.r8, dc.r2);
dc.Add(dc.r10, dc.r10, dc.r11);
dc.And(dc.r2, dc.r3, dc.r14);
dc.And(dc.r3, dc.r12, dc.r3, dc.LSR, 2);
dc.And(dc.r11, dc.r9, dc.r14);
dc.And(dc.r9, dc.r12, dc.r9, dc.LSR, 2);
dc.Add(dc.r9, dc.r9, dc.r3);
dc.Add(dc.r11, dc.r2, dc.r11);
}
dc.Ldr(dc.r2, dc.sp, 0);
}
//----------------------------
static void CopyHorVerRow(C_dyn_code &dc, int Pos, bool parity, bool round, bool add){
//r14 03030303
//r12 3f3f3f3f
LoadHorVerRow(dc, Pos, parity);
if(round){
dc.And(dc.r3, dc.r14, dc.r14, dc.LSR, 1); //0x01010101
}else{
dc.And(dc.r3, dc.r14, dc.r14, dc.LSL, 1); //0x02020202
}
if(parity){
dc.Add(dc.r8, dc.r8, dc.r4);
dc.Add(dc.r9, dc.r9, dc.r5);
dc.Add(dc.r10, dc.r10, dc.r6);
dc.Add(dc.r11, dc.r11, dc.r7);
dc.Add(dc.r10, dc.r10, dc.r3);
dc.Add(dc.r11, dc.r11, dc.r3);
dc.And(dc.r10, dc.r14, dc.r10, dc.LSR, 2);
dc.And(dc.r11, dc.r14, dc.r11, dc.LSR, 2);
if(add){
dc.Add(dc. r8, dc.r8, dc.r10);
dc.Add(dc. r9, dc.r9, dc.r11);
dc.Orr(dc. r12, dc.r12, dc.r12, dc.LSL, 1); //0x7F7F7F7F
dc.Ldr(dc.r11, dc.r1, 4);
dc.Ldr(dc.r10, dc.r1, 0);
dc.And(dc. r3, dc.r12, dc.r9, dc.LSR, 1);
dc.Orr(dc.r9, dc.r11, dc.r9);
dc.And(dc. r11, dc.r12, dc.r11, dc.LSR, 1);
dc.Add(dc.r11, dc.r11, dc.r3);
dc.And(dc. r3, dc.r12, dc.r8, dc.LSR, 1);
dc.Orr(dc.r8, dc.r10, dc.r8);
dc.And(dc. r10, dc.r12, dc.r10, dc.LSR, 1);
dc.Add(dc.r10, dc.r10, dc.r3);
dc.And(dc.r3, dc.r14, dc.r14, dc.LSR, 1); //0x01010101
dc.Mvn(dc.r12, dc.r14, dc.LSL, 6); //restore r12
dc.And(dc.r9, dc.r9, dc.r3);
dc.And(dc.r8, dc.r8, dc.r3);
dc.Add(dc.r11, dc.r11, dc.r9);
dc.Add(dc.r10, dc.r10, dc.r8);
dc.Ldr(dc.r3, dc.sp, 4); //end src for loop compare
dc.Str(dc.r11, dc.r1, 4);
dc.StrAdvance(dc.r10, dc.r1, 8);
}else{
dc.Add(dc. r8, dc.r8, dc.r10);
dc.Ldr(dc.r10, dc.sp, 8); //dstpitch
dc.Add(dc. r9, dc.r9, dc.r11);
dc.Ldr(dc.r3, dc.sp, 4); //end src for loop compare
dc.Str(dc.r9, dc.r1, 4);
dc.StrAdvance(dc.r8, dc.r1, dc.r10);
}
}else{
dc.Add(dc.r4, dc.r4, dc.r8);
dc.Add(dc.r5, dc.r5, dc.r9);
dc.Add(dc.r6, dc.r6, dc.r10);
dc.Add(dc.r7, dc.r7, dc.r11);
dc.Add(dc.r6, dc.r6, dc.r3);
dc.Add(dc.r7, dc.r7, dc.r3);
dc.And(dc.r6, dc.r14, dc.r6, dc.LSR, 2);
dc.And(dc.r7, dc.r14, dc.r7, dc.LSR, 2);
if(add){
dc.Add(dc. r4, dc.r4, dc.r6);
dc.Add(dc. r5, dc.r5, dc.r7);
dc.Orr(dc. r12, dc.r12, dc.r12, dc.LSL, 1); //0x7F7F7F7F
dc.Ldr(dc.r7, dc.r1, 4);
dc.Ldr(dc.r6, dc.r1, 0);
dc.And(dc. r3, dc.r12, dc.r5, dc.LSR, 1);
dc.Orr(dc.r5, dc.r7, dc.r5);
dc.And(dc. r7, dc.r12, dc.r7, dc.LSR, 1);
dc.Add(dc.r7, dc.r7, dc.r3);
dc.And(dc. r3, dc.r12, dc.r4, dc.LSR, 1);
dc.Orr(dc.r4, dc.r6, dc.r4);
dc.And(dc. r6, dc.r12, dc.r6, dc.LSR, 1);
dc.Add(dc.r6, dc.r6, dc.r3);
dc.And(dc.r3, dc.r14, dc.r14, dc.LSR, 1); //0x01010101
dc.Mvn(dc.r12, dc.r14, dc.LSL, 6); //restore r12
dc.And(dc.r5, dc.r5, dc.r3);
dc.And(dc.r4, dc.r4, dc.r3);
dc.Add(dc.r7, dc.r7, dc.r5);
dc.Add(dc.r6, dc.r6, dc.r4);
dc.Str(dc.r7, dc.r1, 4);
dc.StrAdvance(dc.r6, dc.r1, 8);
}else{
dc.Ldr(dc.r3, dc.sp, 8); //dstpitch
dc.Add(dc. r4, dc.r4, dc.r6);
dc.Add(dc. r5, dc.r5, dc.r7);
dc.Str(dc.r5, dc.r1, 4);
dc.StrAdvance(dc.r4, dc.r1, dc.r3);
}
}
}
//----------------------------
typedef void (*t_BuldFunc)(C_dyn_code &dc, int Pos, bool round, bool add, bool ARM5);
static void BuildAddBlock(C_dyn_code &dc, int Pos, bool round, bool add, bool ARM5){
void *data = dc.DeclareData(0x01010101);
PreLoad2Init(dc, ARM5, -1);
dc.Ldr(dc.r14, data);
dc.Mov(dc.r11, 8);
dc.Mvn(dc.r12, dc.r14, dc.LSL, 7);
{
void *loop = dc.Label();
PreLoad2(dc, ARM5, Pos);
AddBlockRow(dc, Pos);
dc.Set(); dc.Sub(dc.r11, dc.r11, 1);
dc.Branch(dc.NE, loop);
}
dc.FunctionEnd();
dc.PutLabel(data);
}
//----------------------------
static void BuildCopyBlockHor(C_dyn_code &dc, int Pos, bool round, bool add, bool ARM5){
void *data = dc.DeclareData(0x01010101);
PreLoad2Init(dc, ARM5, Pos);
dc.Ldr(dc.r14, data);
dc.Mov(dc.r11, 8);
dc.Mvn(dc.r12, dc.r14, dc.LSL, 7);
{
void *loop = dc.Label();
PreLoad2(dc, ARM5, Pos);
CopyHorRow(dc, Pos, round, add);
dc.Set(); dc.Sub(dc.r11, dc.r11, 1);
dc.Branch(dc.NE, loop);
}
dc.FunctionEnd();
dc.PutLabel(data);
}
//----------------------------
static void BuildCopyBlockVer(C_dyn_code &dc, int Pos, bool round, bool add, bool ARM5){
void *data = dc.DeclareData(0x01010101);
dc.Sub(dc.sp, dc.sp, 4);
dc.Add(dc.r4, dc.r0, dc.r2, dc.LSL, 3);
dc.Add(dc.r4, dc.r4, dc.r2);
dc.Str(dc.r4, dc.sp, 0); //end src
dc.Ldr(dc.r14, data);
dc.Mvn(dc.r12, dc.r14, dc.LSL, 7);
PreLoad(dc, ARM5, Pos);
LoadVerRow(dc, Pos, true);
{
void *loop = dc.Label();
PreLoad(dc, ARM5, Pos);
CopyVerRow(dc, Pos, 0, round, add);
PreLoad(dc, ARM5, Pos);
CopyVerRow(dc, Pos, 1, round, add);
dc.Cmp(dc.r0, dc.r7);
dc.Branch(dc.NE, loop);
}
dc.Add(dc.sp, dc.sp, 4);
dc.FunctionEnd();
dc.PutLabel(data);
}
//----------------------------
static void BuildCopyBlockHorVer(C_dyn_code &dc, int Pos, bool round, bool add, bool ARM5){
void *data = dc.DeclareData(0x03030303);
dc.Sub(dc.sp, dc.sp, 12);
dc.Add(dc.r4, dc.r0, dc.r2, dc.LSL, 3);
dc.Add(dc.r4, dc.r4, dc.r2);
dc.Str(dc.r2, dc.sp, 0); //srcpitch
dc.Str(dc.r4, dc.sp, 4); //end src
dc.Str(dc.r3, dc.sp, 8); //dstpitch
dc.Ldr(dc.r14, data);
dc.Mvn(dc.r12, dc.r14, dc.LSL, 6);
PreLoad(dc, ARM5, Pos);
LoadHorVerRow(dc, Pos, 1);
{
void *loop = dc.Label();
PreLoad(dc, ARM5, Pos);
CopyHorVerRow(dc, Pos, 0, round, add);
PreLoad(dc, ARM5, Pos);
CopyHorVerRow(dc, Pos, 1, round, add);
dc.Cmp(dc.r0, dc.r3);
dc.Branch(dc.NE, loop);
}
dc.Add(dc.sp, dc.sp, 12);
dc.FunctionEnd();
dc.PutLabel(data);
}
//----------------------------
static void BuildCopyBlockRow(C_dyn_code &dc, int Pos){
if(Pos > 0){
dc.Ldr(dc.r5, dc.r0, 8);
dc.Ldr(dc.r6, dc.r0, 4);
dc.LdrAdvance(dc.r4, dc.r0, dc.r2);
dc.Mov(dc.r5, dc.r5, dc.LSL, 32-Pos);
dc.Orr(dc.r5, dc.r5, dc.r6, dc.LSR, Pos);
dc.Mov(dc.r4, dc.r4, dc.LSR, Pos);
dc.Orr(dc.r4, dc.r4, dc.r6, dc.LSL, 32-Pos);
}else{
dc.Ldr(dc.r5, dc.r0, 4);
dc.LdrAdvance(dc.r4, dc.r0, dc.r2);
}
dc.Str(dc.r5, dc.r1, 4);
dc.StrAdvance(dc.r4, dc.r1, dc.r3);
}
//----------------------------
static void BuildCopyBlock(C_dyn_code &dc, int Pos, bool round, bool add, bool ARM5){
PreLoad2Init(dc, ARM5, Pos);
PreLoad2(dc, ARM5, Pos);
BuildCopyBlockRow(dc, Pos);
PreLoad2(dc, ARM5, Pos);
BuildCopyBlockRow(dc, Pos);
PreLoad2(dc, ARM5, Pos);
BuildCopyBlockRow(dc, Pos);
PreLoad2(dc, ARM5, Pos);
BuildCopyBlockRow(dc, Pos);
PreLoad2(dc, ARM5, Pos);
BuildCopyBlockRow(dc, Pos);
PreLoad2(dc, ARM5, Pos);
BuildCopyBlockRow(dc, Pos);
PreLoad2(dc, ARM5, Pos);
BuildCopyBlockRow(dc, Pos);
PreLoad2(dc, ARM5, Pos);
BuildCopyBlockRow(dc, Pos);
dc.FunctionEnd();
}
//----------------------------
static void BuildCopyBlock8x8(C_dyn_code &dc, int Pos, bool round, bool add, bool ARM5){
dc.Mov(dc.r11, 3);
{
void *loop = dc.Label();
#ifdef USE_PLD
if(ARM5)
dc.Pld(dc.r0, dc.r2,dc.LSL, 1);
#endif
dc.Ldr(dc.r7, dc.r0, 4);
dc.LdrAdvance(dc.r6, dc.r0, dc.r2);
#ifdef USE_PLD
if(ARM5)
dc.Pld(dc.r0, dc.r2, dc.LSL, 1);
#endif
dc.Ldr(dc.r5, dc.r0, 4);
dc.LdrAdvance(dc.r4, dc.r0, dc.r2);
dc.Str(dc.r7, dc.r1, 4);
dc.StrAdvance(dc.r6, dc.r1, dc.r3);
dc.Str(dc.r5, dc.r1, 4);
dc.StrAdvance(dc.r4, dc.r1, dc.r3);
dc.Set(); dc.Sub(dc.r11, dc.r11, 1);
dc.Branch(dc.NE, loop);
}
//unroll last (no preload needed)
dc.Ldr(dc.r7, dc.r0, 4);
dc.LdrAdvance(dc.r6,dc.r0, dc.r2);
dc.Ldr(dc.r5, dc.r0, 4);
dc.LdrAdvance(dc.r4,dc.r0, dc.r2);
dc.Str(dc.r7, dc.r1, 4);
dc.StrAdvance(dc.r6, dc.r1, dc.r3);
dc.Str(dc.r5, dc.r1, 4);
dc.StrAdvance(dc.r4, dc.r1, dc.r3);
dc.FunctionEnd();
}
//----------------------------
static void CopyBlock16x16Row(C_dyn_code &dc){
dc.Ldr(dc.r7, dc.r0, 12);
dc.Ldr(dc.r6, dc.r0, 8);
dc.Ldr(dc.r5, dc.r0, 4);
dc.LdrAdvance(dc.r4, dc.r0, dc.r2);
dc.Str(dc.r7, dc.r1, 12);
dc.Str(dc.r6, dc.r1, 8);
dc.Str(dc.r5, dc.r1, 4);
dc.StrAdvance(dc.r4, dc.r1, dc.r3);
}
//----------------------------
static void BuildCopyBlock16x16(C_dyn_code &dc, int Pos, bool round, bool add, bool ARM5){
dc.Mov(dc.r11, 15);
{
void *loop = dc.Label();
#ifdef USE_PLD
if(ARM5)
dc.Pld(dc.r0, dc.r2, dc.LSL, 1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -