📄 misc.asm
字号:
r3 = -r3;
r3 += 32;
r1 <<= r3; //r1 value; r3 shift
r3 = [p0];
r3 = r3 | r1;
[p0++] = r3; //point to pos
r0 = r0 + r2;
[p0++] = r0; //point to tail
cc = r5 <= r0;
if cc jump LABEL1;
r5 = [sp++];
rts;
LABEL1:
p1 = [p0];
i0 = 0;
r2 = ~r3;
(r6, r2) = byteunpack r3:2;//unpack r2
r7 = (a1 = r6.h*r2.h), r6 = (a0 = r6.l*r2.l);
r7 = r7.l * r6.l(is);
cc = r7;
if !cc jump INSERT_ZERO1;
//no 0xff
(r7, r6) = byteunpack r3:2(r); //unpack r3
r6 = bytepack(r6.l, r6.h);
r7 = bytepack(r7.l, r7.h);
r1 = bytepack(r7, r6);
[p1++] = r1;
[p0--] = p1; //point to pos
r0 += -32;
[p0--] = r0; //point to buf
r0 = 0;
[p0] = r0;
r5 = [sp++];
rts;
SHIFTABOVE32:
r3 += -32;
r5 = r1;
r1 >>= r3;
r0 = [p0];//p0 point to buf
r0 = r0 | r1;
p1 = [p0+8];
r2 = ~r0;
(r6, r2) = byteunpack r3:2;//unpack r2
r7 = (a1 = r6.h*r2.h), r6 = (a0 = r6.l*r2.l);
r7 = r7.l * r6.l(is);
cc = r7;
if !cc jump INSERT_ZERO1;
//no 0xff
(r7, r6) = byteunpack r1:0; //unpack r0
r6 = bytepack(r6.l, r6.h);
r7 = bytepack(r7.l, r7.h);
r1 = bytepack(r7, r6);
[p1++] = r1;
[p0+8] = p1;
r0 = 32;
r0 = r0 - r3;
r5 <<= r0;
[p0++] = r7;
[p0] = r3;
r5 = [sp++];
rts;
INSERT_ZERO1:
_BitstreamPutBits.end:
nop;
void BitstreamPutBits(unsigned short value,unsigned char size)
{
unsigned int shift = 32 - stream.pos - size;
value &= (1<<size)-1;
if (shift <= 32) {
stream.buf |= value << shift;
stream.pos += size;
if (stream.pos >= 32) {
unsigned int b = stream.buf;
BSWAP(&b);
*stream.tail++ = b;
stream.buf = 0;
stream.pos -= 32;
}
} else {
unsigned int remainder;
unsigned int b;
shift = size - (32 - stream.pos);
stream.buf |= value >> shift;
b = stream.buf;
BSWAP(&b);
*stream.tail++ = b;
remainder = shift;
shift = 32 - shift;
stream.buf = value << shift;
stream.pos = remainder;
}
}
*/
_pre_fetch:
p0 = r0; //s
p2 = r0;
p2 += 4;
p1 = r1; //stride
prefetch [p0];
p0 = p0 + p1;
prefetch [p0];
p0 = p0 + p1;
prefetch [p0];
p0 = p0 + p1;
prefetch [p0];
p0 = p0 + p1;
prefetch [p0];
p0 = p0 + p1;
prefetch [p0];
p0 = p0 + p1;
prefetch [p0];
p0 = p0 + p1;
prefetch [p0];
prefetch [p2];
p2 = p2 + p1;
prefetch [p2];
p2 = p2 + p1;
prefetch [p2];
p2 = p2 + p1;
prefetch [p2];
p2 = p2 + p1;
prefetch [p2];
p2 = p2 + p1;
prefetch [p2];
p2 = p2 + p1;
prefetch [p2];
p2 = p2 + p1;
prefetch [p2];
/* p2 = 1;
nop;nop;nop;nop;
lsetup(lsfetch, lefetch) lc0 = p2;
lsfetch:
prefetch [p0];
// nop;nop;nop;nop;
lefetch: nop; //p0 = p0 + p1;
*/
rts;
_pre_fetch.end:
nop;
_copy8to16:
[--sp] = (r7:6, p5:4);
p5 = r1; //s
p1 = r2; //stride
p2 = 8;
i0 = 0;
p0 = r1; //s
l1 = 0;
i1 = r0; //d
m0 = r2;
p1 += -4;
r2.l = 0xFF80; //-128
r2.h = r2.l << 0;
r0 = [p0++];
lsetup(lscopy, lecopy) lc0 = p2;
lscopy:
(r7, r6) = byteunpack r1:0;
r6 = r6 +|+ r2;
r7 = r7 +|+ r2 || [i1++] = r6 || r0 = [p0++p1];
[i1++] = r7 || (r7, r6) = byteunpack r1:0;
r6 = r6 +|+ r2;
r7 = r7 +|+ r2 || [i1++] = r6;
lecopy: [i1++] = r7 || r0 = [p0++];
(r7:6, p5:4) = [sp++];
rts;
_copy8to16.end:
nop;
//quantize(short* sigBuf, short* lpBuf, unsigned char* quantTab);
_quantize:
link 0;
[--sp] = (r7:4, p5:3);
p0.l = _FZBT;
p0.h = _FZBT;
p4 = r0; //non_zero_ac_index
p1 = r1; //lpBuf
l2 = 0;
i2 = r2; // quant table
i0 = 0;
p3 = r0; //sigBuf
p2 = 32;
r7 = r7 - r7(ns) || r2.l = w[i2++]; //q
p5 = 16;
lsetup(ls0, le0) lc0 = p2;
ls0:
(r3, r6) = byteunpack r3:2 || r4 = [p1++]; //coeff
r5 = abs r4(v) || p2 = [p0++]; //temp = abs(coeff);
r3 = r6 >> 1(v); //qval>>1
r5 = r5 +|+ r3; //temp += qval>>1
r0 = r5.l(z); //temp
r1 = r6.l(z); //qval
cc = r1 < r0;
if cc jump DIV;
p2 = p3 + (p2 << 1); //sigBuf[FZBT[i]]
STORE:
w[p2] = r7 || r0 = r5 >> 16;
p2 = [p0++] || r1 = r6 >> 16;
cc = r1 < r0;
if cc jump DIV1;
r7 = r7 - r7(ns);
p2 = p3 + (p2 << 1); //sigBuf[FZBT[i]]
STORE1:
le0: r7 = r7 - r7(ns) || w[p2] = r7 || r2.l = w[i2++]; //q;
r0 = p4;
r1 = p3;
r0 = r0 - r1;
r0 >>= 1; //non_zero_ac_index
(r7:4, p5:3) = [sp++];
unlink;
rts;
DIV:
// p5 = 16;
divs(r0, r1);
lsetup(lpdivs,lpdive) lc1 = p5;
lpdivs:
lpdive: divq(r0, r1);
r7 = r0.l(x);
cc = bittst(r4, 15);
r1 = -r7;
if cc r7 = r1;
p2 = p3 + (p2 << 1); //sigBuf[FZBT[i]]
cc = p4 < p2;
if cc p4 = p2;
jump STORE;
DIV1:
// p5 = 16;
divs(r0, r1);
lsetup(lpdiv1s,lpdiv1e) lc1 = p5;
lpdiv1s:
lpdiv1e: divq(r0, r1);
r7 = r0.l(x);
cc = bittst(r4, 31);
r1 = -r7;
if cc r7 = r1;
p2 = p3 + (p2 << 1); //sigBuf[FZBT[i]]
cc = p4 < p2;
if cc p4 = p2;
jump STORE1;
_quantize.end:
nop;
/*
copy8to16(short* d, unsigned char* s, int stride)
{
int i, j;
for(i = 0; i < 8; i++)
{
for(j = 0; j < 8; j++)
{
d[i*8+j] = (short)(s[i*stride+j]-128);
}
}
}
//quantize(short* sigBuf, short* lpBuf, unsigned char* quantTab, unsigned char* FZBT);
_quantize:
link 0;
[--sp] = (r7:4, p5:3);
p1 = r1; //lpBuf
r3 = [fp+20];
l1 = 0;
i1 = r3; //FZBT
l2 = 0;
i2 = r2; // quant table
i0 = 0;
p3 = r0; //sigBuf
p2 = 32;
r2.l = w[i1++]; //FZBT
a1 = a0 = 0;
lsetup(ls0, le0) lc0 = p2;
ls0:
(r3, r7) = byteunpack r3:2 || r2.l = w[i2++]; //q
r3 = r7.l(z);
p2 = r3; //FZBT[i]
(r3, r6) = byteunpack r3:2 || r4 = [p1++]; //coeff
r5 = abs r4(v); //temp = abs(coeff);
r3 = r6 >> 1(v); //qval>>1
r5 = r5 +|+ r3; //temp += qval>>1
p2 = p3 + (p2 << 1); //sigBuf[FZBT[i]]
r0 = r5.l(z); //temp
r1 = r6.l(z); //qval
cc = r1 < r0;
if cc jump DIV;
r0 = 0;
STORE:
w[p2] = r0 || r7 = r7 >> 16;
p2 = r7; //FZBT[i+1]
// r5.l = r5.h << 0;
// r0 = r5.l(z); //temp += qval>>1
// r6.l = r6.h << 0;
// r1 = r6.l(z); //qval
// cc = r1 < r0;
r0 = r5 >> 16;
r1 = r6 >> 16;
cc = r1 < r0;
p2 = p3 + (p2 << 1);
if cc jump DIV1;
r0 = 0;
STORE1:
le0: w[p2] = r0 || r2.l = w[i1++]; //FZBT;
(r7:4, p5:3) = [sp++];
unlink;
rts;
DIV:
p5 = 16;
divs(r0, r1);
lsetup(lpdivs,lpdive) lc1 = p5;
lpdivs:
lpdive: divq(r0, r1);
r0 = r0.l(x);
cc = bittst(r4, 15);
r1 = -r0;
if cc r0 = r1;
jump STORE;
DIV1:
p5 = 16;
divs(r0, r1);
lsetup(lpdiv1s,lpdiv1e) lc1 = p5;
lpdiv1s:
lpdiv1e: divq(r0, r1);
r0 = r0.l(x);
cc = bittst(r4, 31);
r1 = -r0;
if cc r0 = r1;
jump STORE1;
_quantize.end:
nop;
*/
/*
for (i = 0; i < DCTBLOCKSIZE; i++) //量化操作
{
short temp;
unsigned short coeff;
unsigned short qval;
coeff = lpBuf[i];
qval = quantTab[i];
temp = abs(qcoeff);
temp += qval>>1; // for rounding
if(temp > qval)
temp /= qval;
else
temp = 0;
if(qcoeff < 0) temp = -temp;
sigBuf[FZBT[i]] = temp;
}
*/
_ComputeVLI:
r0 = abs r0;
r1 = 2047(z);
r2 = 15;
r0 = r0 & r1; //2048->0
r1.l = signbits r0.l;
r1.h = 0;
r0 = r2 - r1; //16-(signbits+1)
rts;
_ComputeVLI.end:
nop;
/*
unsigned char ComputeVLI(short val)
{
unsigned char binStrLen = 0;
val = abs(val);
if(val == 1)
{
binStrLen = 1;
}
else if(val >= 2 && val <= 3)
{
binStrLen = 2;
}
else if(val >= 4 && val <= 7)
{
binStrLen = 3;
}
else if(val >= 8 && val <= 15)
{
binStrLen = 4;
}
else if(val >= 16 && val <= 31)
{
binStrLen = 5;
}
else if(val >= 32 && val <= 63)
{
binStrLen = 6;
}
else if(val >= 64 && val <= 127)
{
binStrLen = 7;
}
else if(val >= 128 && val <= 255)
{
binStrLen = 8;
}
else if(val >= 256 && val <= 511)
{
binStrLen = 9;
}
else if(val >= 512 && val <= 1023)
{
binStrLen = 10;
}
else if(val >= 1024 && val <= 2047)
{
binStrLen = 11;
}
return binStrLen;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -