cosmopolitan/tool/viz/lib/doublechrominance.S

55 lines
2.6 KiB
ArmAsm

/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8 -*-│
vi: set et ft=asm ts=8 tw=8 fenc=utf-8 :vi
Copyright 2020 Justine Alexandra Roberts Tunney
This program is free software; you can redistribute it and/or modify │
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License. │
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of │
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software │
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA
*/
#include "libc/macros.h"
/ Duplicates chrominance samples horizontally, e.g.
/
/ 12345678--------
/ 1122334455667788
/
/ @param %edi is size of %rsi array in bytes
/ @param %rsi is char[edi/16][16] output and %rsi==%rdx is OK
/ @param %rdx is char[edi/16][8] input
/ @return %rax is %rsi
doublechrominance:
.leafprologue
.profilable
shr $1,%edi # backwards algorithm
jbe 1f # do nothing if !n || n%2
mov %edi,%ecx
shr $4,%ecx
shl $4,%ecx
0: cmp %edi,%ecx
je 0f
dec %edi
movzbl (%rdx,%rdi),%eax
mov %al,(%rsi,%rdi,2)
mov %al,1(%rsi,%rdi,2)
jmp 0b
0: sub $8,%edi
movq (%rdx,%rdi),%xmm0
punpcklbw %xmm0,%xmm0
movdqu %xmm0,(%rsi,%rdi,2)
jnz 0b
1: mov %rsi,%rax
.leafepilogue
.endfn doublechrominance,globl
.source __FILE__