1ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian/* 2ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian * Copyright 2012 The LibYuv Project Authors. All rights reserved. 3ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian * 4ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian * Use of this source code is governed by a BSD-style license 5ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian * that can be found in the LICENSE file in the root of the source 6ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian * tree. An additional intellectual property rights grant can be found 7ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian * in the file PATENTS. All contributing project authors may 8ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian * be found in the AUTHORS file in the root of the source tree. 9ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian */ 10ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 11ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#include "libyuv/basic_types.h" 12ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#include "libyuv/row.h" 13ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 14ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#ifdef __cplusplus 15ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramaniannamespace libyuv { 16ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianextern "C" { 17ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif 18ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 19ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian// This module is for GCC MIPS DSPR2 20ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#if !defined(LIBYUV_DISABLE_MIPS) && \ 21ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian defined(__mips_dsp) && (__mips_dsp_rev >= 2) && \ 22ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian (_MIPS_SIM == _MIPS_SIM_ABI32) 23ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 24ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianvoid ScaleRowDown2_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, 25ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian uint8* dst, int dst_width) { 26ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian __asm__ __volatile__( 27ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".set push \n" 28ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".set noreorder \n" 29ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 30ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "srl $t9, %[dst_width], 4 \n" // iterations -> by 16 31ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "beqz $t9, 2f \n" 32ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian " nop \n" 33ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 34ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".p2align 2 \n" 35ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "1: \n" 36ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t0, 0(%[src_ptr]) \n" // |3|2|1|0| 37ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t1, 4(%[src_ptr]) \n" // |7|6|5|4| 38ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t2, 8(%[src_ptr]) \n" // |11|10|9|8| 39ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t3, 12(%[src_ptr]) \n" // |15|14|13|12| 40ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t4, 16(%[src_ptr]) \n" // |19|18|17|16| 41ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t5, 20(%[src_ptr]) \n" // |23|22|21|20| 42ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t6, 24(%[src_ptr]) \n" // |27|26|25|24| 43ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t7, 28(%[src_ptr]) \n" // |31|30|29|28| 44ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian // TODO(fbarchard): Use odd pixels instead of even. 45ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "precr.qb.ph $t8, $t1, $t0 \n" // |6|4|2|0| 46ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "precr.qb.ph $t0, $t3, $t2 \n" // |14|12|10|8| 47ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "precr.qb.ph $t1, $t5, $t4 \n" // |22|20|18|16| 48ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "precr.qb.ph $t2, $t7, $t6 \n" // |30|28|26|24| 49ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu %[src_ptr], %[src_ptr], 32 \n" 50ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu $t9, $t9, -1 \n" 51ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sw $t8, 0(%[dst]) \n" 52ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sw $t0, 4(%[dst]) \n" 53ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sw $t1, 8(%[dst]) \n" 54ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sw $t2, 12(%[dst]) \n" 55ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "bgtz $t9, 1b \n" 56ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian " addiu %[dst], %[dst], 16 \n" 57ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 58ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "2: \n" 59ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "andi $t9, %[dst_width], 0xf \n" // residue 60ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "beqz $t9, 3f \n" 61ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian " nop \n" 62ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 63ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "21: \n" 64ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lbu $t0, 0(%[src_ptr]) \n" 65ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu %[src_ptr], %[src_ptr], 2 \n" 66ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu $t9, $t9, -1 \n" 67ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sb $t0, 0(%[dst]) \n" 68ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "bgtz $t9, 21b \n" 69ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian " addiu %[dst], %[dst], 1 \n" 70ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 71ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "3: \n" 72ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".set pop \n" 73ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian : [src_ptr] "+r" (src_ptr), 74ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian [dst] "+r" (dst) 75ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian : [dst_width] "r" (dst_width) 76ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian : "t0", "t1", "t2", "t3", "t4", "t5", 77ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "t6", "t7", "t8", "t9" 78ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ); 79ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian} 80ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 81ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianvoid ScaleRowDown2Box_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, 82ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian uint8* dst, int dst_width) { 83ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const uint8* t = src_ptr + src_stride; 84ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 85ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian __asm__ __volatile__ ( 86ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".set push \n" 87ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".set noreorder \n" 88ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 89ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "srl $t9, %[dst_width], 3 \n" // iterations -> step 8 90ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "bltz $t9, 2f \n" 91ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian " nop \n" 92ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 93ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".p2align 2 \n" 94ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "1: \n" 95ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t0, 0(%[src_ptr]) \n" // |3|2|1|0| 96ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t1, 4(%[src_ptr]) \n" // |7|6|5|4| 97ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t2, 8(%[src_ptr]) \n" // |11|10|9|8| 98ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t3, 12(%[src_ptr]) \n" // |15|14|13|12| 99ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t4, 0(%[t]) \n" // |19|18|17|16| 100ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t5, 4(%[t]) \n" // |23|22|21|20| 101ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t6, 8(%[t]) \n" // |27|26|25|24| 102ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t7, 12(%[t]) \n" // |31|30|29|28| 103ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu $t9, $t9, -1 \n" 104ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "srl $t8, $t0, 16 \n" // |X|X|3|2| 105ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "ins $t0, $t4, 16, 16 \n" // |17|16|1|0| 106ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "ins $t4, $t8, 0, 16 \n" // |19|18|3|2| 107ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t0, $t0 \n" // |17+16+1+0| 108ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t4, $t4 \n" // |19+18+3+2| 109ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "shra_r.w $t0, $t0, 2 \n" // |t0+2|>>2 110ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "shra_r.w $t4, $t4, 2 \n" // |t4+2|>>2 111ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "srl $t8, $t1, 16 \n" // |X|X|7|6| 112ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "ins $t1, $t5, 16, 16 \n" // |21|20|5|4| 113ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "ins $t5, $t8, 0, 16 \n" // |22|23|7|6| 114ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t1, $t1 \n" // |21+20+5+4| 115ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t5, $t5 \n" // |23+22+7+6| 116ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "shra_r.w $t1, $t1, 2 \n" // |t1+2|>>2 117ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "shra_r.w $t5, $t5, 2 \n" // |t5+2|>>2 118ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "srl $t8, $t2, 16 \n" // |X|X|11|10| 119ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "ins $t2, $t6, 16, 16 \n" // |25|24|9|8| 120ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "ins $t6, $t8, 0, 16 \n" // |27|26|11|10| 121ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t2, $t2 \n" // |25+24+9+8| 122ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t6, $t6 \n" // |27+26+11+10| 123ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "shra_r.w $t2, $t2, 2 \n" // |t2+2|>>2 124ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "shra_r.w $t6, $t6, 2 \n" // |t5+2|>>2 125ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "srl $t8, $t3, 16 \n" // |X|X|15|14| 126ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "ins $t3, $t7, 16, 16 \n" // |29|28|13|12| 127ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "ins $t7, $t8, 0, 16 \n" // |31|30|15|14| 128ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t3, $t3 \n" // |29+28+13+12| 129ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t7, $t7 \n" // |31+30+15+14| 130ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "shra_r.w $t3, $t3, 2 \n" // |t3+2|>>2 131ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "shra_r.w $t7, $t7, 2 \n" // |t7+2|>>2 132ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu %[src_ptr], %[src_ptr], 16 \n" 133ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu %[t], %[t], 16 \n" 134ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sb $t0, 0(%[dst]) \n" 135ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sb $t4, 1(%[dst]) \n" 136ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sb $t1, 2(%[dst]) \n" 137ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sb $t5, 3(%[dst]) \n" 138ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sb $t2, 4(%[dst]) \n" 139ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sb $t6, 5(%[dst]) \n" 140ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sb $t3, 6(%[dst]) \n" 141ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sb $t7, 7(%[dst]) \n" 142ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "bgtz $t9, 1b \n" 143ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian " addiu %[dst], %[dst], 8 \n" 144ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 145ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "2: \n" 146ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "andi $t9, %[dst_width], 0x7 \n" // x = residue 147ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "beqz $t9, 3f \n" 148ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian " nop \n" 149ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 150ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "21: \n" 151ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lwr $t1, 0(%[src_ptr]) \n" 152ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lwl $t1, 3(%[src_ptr]) \n" 153ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lwr $t2, 0(%[t]) \n" 154ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lwl $t2, 3(%[t]) \n" 155ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "srl $t8, $t1, 16 \n" 156ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "ins $t1, $t2, 16, 16 \n" 157ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "ins $t2, $t8, 0, 16 \n" 158ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t1, $t1 \n" 159ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t2, $t2 \n" 160ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "shra_r.w $t1, $t1, 2 \n" 161ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "shra_r.w $t2, $t2, 2 \n" 162ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sb $t1, 0(%[dst]) \n" 163ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sb $t2, 1(%[dst]) \n" 164ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu %[src_ptr], %[src_ptr], 4 \n" 165ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu $t9, $t9, -2 \n" 166ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu %[t], %[t], 4 \n" 167ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "bgtz $t9, 21b \n" 168ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian " addiu %[dst], %[dst], 2 \n" 169ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 170ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "3: \n" 171ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".set pop \n" 172ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 173ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian : [src_ptr] "+r" (src_ptr), 174ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian [dst] "+r" (dst), [t] "+r" (t) 175ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian : [dst_width] "r" (dst_width) 176ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian : "t0", "t1", "t2", "t3", "t4", "t5", 177ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "t6", "t7", "t8", "t9" 178ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ); 179ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian} 180ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 181ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianvoid ScaleRowDown4_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, 182ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian uint8* dst, int dst_width) { 183ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian __asm__ __volatile__ ( 184ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".set push \n" 185ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".set noreorder \n" 186ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 187ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "srl $t9, %[dst_width], 3 \n" 188ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "beqz $t9, 2f \n" 189ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian " nop \n" 190ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 191ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".p2align 2 \n" 192ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "1: \n" 193ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t1, 0(%[src_ptr]) \n" // |3|2|1|0| 194ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t2, 4(%[src_ptr]) \n" // |7|6|5|4| 195ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t3, 8(%[src_ptr]) \n" // |11|10|9|8| 196ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t4, 12(%[src_ptr]) \n" // |15|14|13|12| 197ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t5, 16(%[src_ptr]) \n" // |19|18|17|16| 198ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t6, 20(%[src_ptr]) \n" // |23|22|21|20| 199ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t7, 24(%[src_ptr]) \n" // |27|26|25|24| 200ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t8, 28(%[src_ptr]) \n" // |31|30|29|28| 201ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "precr.qb.ph $t1, $t2, $t1 \n" // |6|4|2|0| 202ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "precr.qb.ph $t2, $t4, $t3 \n" // |14|12|10|8| 203ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "precr.qb.ph $t5, $t6, $t5 \n" // |22|20|18|16| 204ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "precr.qb.ph $t6, $t8, $t7 \n" // |30|28|26|24| 205ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "precr.qb.ph $t1, $t2, $t1 \n" // |12|8|4|0| 206ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "precr.qb.ph $t5, $t6, $t5 \n" // |28|24|20|16| 207ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu %[src_ptr], %[src_ptr], 32 \n" 208ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu $t9, $t9, -1 \n" 209ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sw $t1, 0(%[dst]) \n" 210ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sw $t5, 4(%[dst]) \n" 211ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "bgtz $t9, 1b \n" 212ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian " addiu %[dst], %[dst], 8 \n" 213ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 214ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "2: \n" 215ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "andi $t9, %[dst_width], 7 \n" // residue 216ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "beqz $t9, 3f \n" 217ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian " nop \n" 218ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 219ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "21: \n" 220ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lbu $t1, 0(%[src_ptr]) \n" 221ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu %[src_ptr], %[src_ptr], 4 \n" 222ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu $t9, $t9, -1 \n" 223ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sb $t1, 0(%[dst]) \n" 224ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "bgtz $t9, 21b \n" 225ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian " addiu %[dst], %[dst], 1 \n" 226ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 227ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "3: \n" 228ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".set pop \n" 229ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian : [src_ptr] "+r" (src_ptr), 230ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian [dst] "+r" (dst) 231ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian : [dst_width] "r" (dst_width) 232ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian : "t1", "t2", "t3", "t4", "t5", 233ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "t6", "t7", "t8", "t9" 234ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ); 235ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian} 236ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 237ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianvoid ScaleRowDown4Box_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, 238ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian uint8* dst, int dst_width) { 239ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian intptr_t stride = src_stride; 240ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const uint8* s1 = src_ptr + stride; 241ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const uint8* s2 = s1 + stride; 242ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const uint8* s3 = s2 + stride; 243ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 244ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian __asm__ __volatile__ ( 245ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".set push \n" 246ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".set noreorder \n" 247ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 248ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "srl $t9, %[dst_width], 1 \n" 249ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "andi $t8, %[dst_width], 1 \n" 250ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 251ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".p2align 2 \n" 252ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "1: \n" 253ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t0, 0(%[src_ptr]) \n" // |3|2|1|0| 254ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t1, 0(%[s1]) \n" // |7|6|5|4| 255ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t2, 0(%[s2]) \n" // |11|10|9|8| 256ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t3, 0(%[s3]) \n" // |15|14|13|12| 257ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t4, 4(%[src_ptr]) \n" // |19|18|17|16| 258ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t5, 4(%[s1]) \n" // |23|22|21|20| 259ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t6, 4(%[s2]) \n" // |27|26|25|24| 260ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t7, 4(%[s3]) \n" // |31|30|29|28| 261ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t0, $t0 \n" // |3 + 2 + 1 + 0| 262ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t1, $t1 \n" // |7 + 6 + 5 + 4| 263ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t2, $t2 \n" // |11 + 10 + 9 + 8| 264ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t3, $t3 \n" // |15 + 14 + 13 + 12| 265ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t4, $t4 \n" // |19 + 18 + 17 + 16| 266ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t5, $t5 \n" // |23 + 22 + 21 + 20| 267ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t6, $t6 \n" // |27 + 26 + 25 + 24| 268ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t7, $t7 \n" // |31 + 30 + 29 + 28| 269ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "add $t0, $t0, $t1 \n" 270ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "add $t1, $t2, $t3 \n" 271ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "add $t0, $t0, $t1 \n" 272ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "add $t4, $t4, $t5 \n" 273ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "add $t6, $t6, $t7 \n" 274ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "add $t4, $t4, $t6 \n" 275ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "shra_r.w $t0, $t0, 4 \n" 276ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "shra_r.w $t4, $t4, 4 \n" 277ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sb $t0, 0(%[dst]) \n" 278ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sb $t4, 1(%[dst]) \n" 279ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu %[src_ptr], %[src_ptr], 8 \n" 280ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu %[s1], %[s1], 8 \n" 281ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu %[s2], %[s2], 8 \n" 282ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu %[s3], %[s3], 8 \n" 283ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu $t9, $t9, -1 \n" 284ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "bgtz $t9, 1b \n" 285ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian " addiu %[dst], %[dst], 2 \n" 286ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "beqz $t8, 2f \n" 287ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian " nop \n" 288ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 289ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t0, 0(%[src_ptr]) \n" // |3|2|1|0| 290ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t1, 0(%[s1]) \n" // |7|6|5|4| 291ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t2, 0(%[s2]) \n" // |11|10|9|8| 292ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t3, 0(%[s3]) \n" // |15|14|13|12| 293ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t0, $t0 \n" // |3 + 2 + 1 + 0| 294ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t1, $t1 \n" // |7 + 6 + 5 + 4| 295ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t2, $t2 \n" // |11 + 10 + 9 + 8| 296ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t3, $t3 \n" // |15 + 14 + 13 + 12| 297ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "add $t0, $t0, $t1 \n" 298ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "add $t1, $t2, $t3 \n" 299ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "add $t0, $t0, $t1 \n" 300ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "shra_r.w $t0, $t0, 4 \n" 301ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sb $t0, 0(%[dst]) \n" 302ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 303ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "2: \n" 304ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".set pop \n" 305ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 306ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian : [src_ptr] "+r" (src_ptr), 307ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian [dst] "+r" (dst), 308ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian [s1] "+r" (s1), 309ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian [s2] "+r" (s2), 310ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian [s3] "+r" (s3) 311ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian : [dst_width] "r" (dst_width) 312ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian : "t0", "t1", "t2", "t3", "t4", "t5", 313ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "t6","t7", "t8", "t9" 314ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ); 315ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian} 316ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 317ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianvoid ScaleRowDown34_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, 318ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian uint8* dst, int dst_width) { 319ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian __asm__ __volatile__ ( 320ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".set push \n" 321ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".set noreorder \n" 322ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".p2align 2 \n" 323ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "1: \n" 324ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t1, 0(%[src_ptr]) \n" // |3|2|1|0| 325ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t2, 4(%[src_ptr]) \n" // |7|6|5|4| 326ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t3, 8(%[src_ptr]) \n" // |11|10|9|8| 327ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t4, 12(%[src_ptr]) \n" // |15|14|13|12| 328ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t5, 16(%[src_ptr]) \n" // |19|18|17|16| 329ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t6, 20(%[src_ptr]) \n" // |23|22|21|20| 330ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t7, 24(%[src_ptr]) \n" // |27|26|25|24| 331ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t8, 28(%[src_ptr]) \n" // |31|30|29|28| 332ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "precrq.qb.ph $t0, $t2, $t4 \n" // |7|5|15|13| 333ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "precrq.qb.ph $t9, $t6, $t8 \n" // |23|21|31|30| 334ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu %[dst_width], %[dst_width], -24 \n" 335ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "ins $t1, $t1, 8, 16 \n" // |3|1|0|X| 336ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "ins $t4, $t0, 8, 16 \n" // |X|15|13|12| 337ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "ins $t5, $t5, 8, 16 \n" // |19|17|16|X| 338ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "ins $t8, $t9, 8, 16 \n" // |X|31|29|28| 339ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu %[src_ptr], %[src_ptr], 32 \n" 340ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "packrl.ph $t0, $t3, $t0 \n" // |9|8|7|5| 341ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "packrl.ph $t9, $t7, $t9 \n" // |25|24|23|21| 342ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "prepend $t1, $t2, 8 \n" // |4|3|1|0| 343ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "prepend $t3, $t4, 24 \n" // |15|13|12|11| 344ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "prepend $t5, $t6, 8 \n" // |20|19|17|16| 345ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "prepend $t7, $t8, 24 \n" // |31|29|28|27| 346ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sw $t1, 0(%[dst]) \n" 347ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sw $t0, 4(%[dst]) \n" 348ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sw $t3, 8(%[dst]) \n" 349ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sw $t5, 12(%[dst]) \n" 350ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sw $t9, 16(%[dst]) \n" 351ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sw $t7, 20(%[dst]) \n" 352ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "bnez %[dst_width], 1b \n" 353ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian " addiu %[dst], %[dst], 24 \n" 354ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".set pop \n" 355ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian : [src_ptr] "+r" (src_ptr), 356ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian [dst] "+r" (dst), 357ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian [dst_width] "+r" (dst_width) 358ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian : 359ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian : "t0", "t1", "t2", "t3", "t4", "t5", 360ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "t6","t7", "t8", "t9" 361ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ); 362ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian} 363ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 364ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianvoid ScaleRowDown34_0_Box_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, 365ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian uint8* d, int dst_width) { 366ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian __asm__ __volatile__ ( 367ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".set push \n" 368ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".set noreorder \n" 369ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "repl.ph $t3, 3 \n" // 0x00030003 370ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 371ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".p2align 2 \n" 372ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "1: \n" 373ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t0, 0(%[src_ptr]) \n" // |S3|S2|S1|S0| 374ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lwx $t1, %[src_stride](%[src_ptr]) \n" // |T3|T2|T1|T0| 375ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "rotr $t2, $t0, 8 \n" // |S0|S3|S2|S1| 376ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "rotr $t6, $t1, 8 \n" // |T0|T3|T2|T1| 377ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "muleu_s.ph.qbl $t4, $t2, $t3 \n" // |S0*3|S3*3| 378ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "muleu_s.ph.qbl $t5, $t6, $t3 \n" // |T0*3|T3*3| 379ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "andi $t0, $t2, 0xFFFF \n" // |0|0|S2|S1| 380ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "andi $t1, $t6, 0xFFFF \n" // |0|0|T2|T1| 381ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t0, $t0 \n" 382ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t1, $t1 \n" 383ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "shra_r.w $t0, $t0, 1 \n" 384ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "shra_r.w $t1, $t1, 1 \n" 385ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "preceu.ph.qbr $t2, $t2 \n" // |0|S2|0|S1| 386ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "preceu.ph.qbr $t6, $t6 \n" // |0|T2|0|T1| 387ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "rotr $t2, $t2, 16 \n" // |0|S1|0|S2| 388ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "rotr $t6, $t6, 16 \n" // |0|T1|0|T2| 389ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addu.ph $t2, $t2, $t4 \n" 390ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addu.ph $t6, $t6, $t5 \n" 391ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sll $t5, $t0, 1 \n" 392ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "add $t0, $t5, $t0 \n" 393ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "shra_r.ph $t2, $t2, 2 \n" 394ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "shra_r.ph $t6, $t6, 2 \n" 395ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "shll.ph $t4, $t2, 1 \n" 396ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addq.ph $t4, $t4, $t2 \n" 397ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addu $t0, $t0, $t1 \n" 398ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu %[src_ptr], %[src_ptr], 4 \n" 399ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "shra_r.w $t0, $t0, 2 \n" 400ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addu.ph $t6, $t6, $t4 \n" 401ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "shra_r.ph $t6, $t6, 2 \n" 402ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "srl $t1, $t6, 16 \n" 403ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu %[dst_width], %[dst_width], -3 \n" 404ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sb $t1, 0(%[d]) \n" 405ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sb $t0, 1(%[d]) \n" 406ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sb $t6, 2(%[d]) \n" 407ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "bgtz %[dst_width], 1b \n" 408ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian " addiu %[d], %[d], 3 \n" 409ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "3: \n" 410ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".set pop \n" 411ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian : [src_ptr] "+r" (src_ptr), 412ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian [src_stride] "+r" (src_stride), 413ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian [d] "+r" (d), 414ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian [dst_width] "+r" (dst_width) 415ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian : 416ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian : "t0", "t1", "t2", "t3", 417ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "t4", "t5", "t6" 418ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ); 419ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian} 420ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 421ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianvoid ScaleRowDown34_1_Box_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, 422ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian uint8* d, int dst_width) { 423ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian __asm__ __volatile__ ( 424ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".set push \n" 425ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".set noreorder \n" 426ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "repl.ph $t2, 3 \n" // 0x00030003 427ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 428ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".p2align 2 \n" 429ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "1: \n" 430ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t0, 0(%[src_ptr]) \n" // |S3|S2|S1|S0| 431ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lwx $t1, %[src_stride](%[src_ptr]) \n" // |T3|T2|T1|T0| 432ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "rotr $t4, $t0, 8 \n" // |S0|S3|S2|S1| 433ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "rotr $t6, $t1, 8 \n" // |T0|T3|T2|T1| 434ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "muleu_s.ph.qbl $t3, $t4, $t2 \n" // |S0*3|S3*3| 435ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "muleu_s.ph.qbl $t5, $t6, $t2 \n" // |T0*3|T3*3| 436ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "andi $t0, $t4, 0xFFFF \n" // |0|0|S2|S1| 437ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "andi $t1, $t6, 0xFFFF \n" // |0|0|T2|T1| 438ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t0, $t0 \n" 439ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t1, $t1 \n" 440ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "shra_r.w $t0, $t0, 1 \n" 441ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "shra_r.w $t1, $t1, 1 \n" 442ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "preceu.ph.qbr $t4, $t4 \n" // |0|S2|0|S1| 443ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "preceu.ph.qbr $t6, $t6 \n" // |0|T2|0|T1| 444ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "rotr $t4, $t4, 16 \n" // |0|S1|0|S2| 445ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "rotr $t6, $t6, 16 \n" // |0|T1|0|T2| 446ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addu.ph $t4, $t4, $t3 \n" 447ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addu.ph $t6, $t6, $t5 \n" 448ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "shra_r.ph $t6, $t6, 2 \n" 449ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "shra_r.ph $t4, $t4, 2 \n" 450ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addu.ph $t6, $t6, $t4 \n" 451ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu %[src_ptr], %[src_ptr], 4 \n" 452ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "shra_r.ph $t6, $t6, 1 \n" 453ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addu $t0, $t0, $t1 \n" 454ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu %[dst_width], %[dst_width], -3 \n" 455ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "shra_r.w $t0, $t0, 1 \n" 456ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "srl $t1, $t6, 16 \n" 457ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sb $t1, 0(%[d]) \n" 458ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sb $t0, 1(%[d]) \n" 459ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sb $t6, 2(%[d]) \n" 460ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "bgtz %[dst_width], 1b \n" 461ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian " addiu %[d], %[d], 3 \n" 462ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "3: \n" 463ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".set pop \n" 464ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian : [src_ptr] "+r" (src_ptr), 465ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian [src_stride] "+r" (src_stride), 466ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian [d] "+r" (d), 467ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian [dst_width] "+r" (dst_width) 468ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian : 469ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian : "t0", "t1", "t2", "t3", 470ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "t4", "t5", "t6" 471ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ); 472ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian} 473ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 474ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianvoid ScaleRowDown38_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, 475ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian uint8* dst, int dst_width) { 476ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian __asm__ __volatile__ ( 477ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".set push \n" 478ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".set noreorder \n" 479ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 480ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".p2align 2 \n" 481ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "1: \n" 482ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t0, 0(%[src_ptr]) \n" // |3|2|1|0| 483ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t1, 4(%[src_ptr]) \n" // |7|6|5|4| 484ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t2, 8(%[src_ptr]) \n" // |11|10|9|8| 485ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t3, 12(%[src_ptr]) \n" // |15|14|13|12| 486ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t4, 16(%[src_ptr]) \n" // |19|18|17|16| 487ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t5, 20(%[src_ptr]) \n" // |23|22|21|20| 488ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t6, 24(%[src_ptr]) \n" // |27|26|25|24| 489ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t7, 28(%[src_ptr]) \n" // |31|30|29|28| 490ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "wsbh $t0, $t0 \n" // |2|3|0|1| 491ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "wsbh $t6, $t6 \n" // |26|27|24|25| 492ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "srl $t0, $t0, 8 \n" // |X|2|3|0| 493ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "srl $t3, $t3, 16 \n" // |X|X|15|14| 494ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "srl $t5, $t5, 16 \n" // |X|X|23|22| 495ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "srl $t7, $t7, 16 \n" // |X|X|31|30| 496ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "ins $t1, $t2, 24, 8 \n" // |8|6|5|4| 497ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "ins $t6, $t5, 0, 8 \n" // |26|27|24|22| 498ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "ins $t1, $t0, 0, 16 \n" // |8|6|3|0| 499ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "ins $t6, $t7, 24, 8 \n" // |30|27|24|22| 500ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "prepend $t2, $t3, 24 \n" // |X|15|14|11| 501ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "ins $t4, $t4, 16, 8 \n" // |19|16|17|X| 502ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "ins $t4, $t2, 0, 16 \n" // |19|16|14|11| 503ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu %[src_ptr], %[src_ptr], 32 \n" 504ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu %[dst_width], %[dst_width], -12 \n" 505ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu $t8,%[dst_width], -12 \n" 506ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sw $t1, 0(%[dst]) \n" 507ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sw $t4, 4(%[dst]) \n" 508ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sw $t6, 8(%[dst]) \n" 509ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "bgez $t8, 1b \n" 510ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian " addiu %[dst], %[dst], 12 \n" 511ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".set pop \n" 512ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian : [src_ptr] "+r" (src_ptr), 513ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian [dst] "+r" (dst), 514ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian [dst_width] "+r" (dst_width) 515ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian : 516ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian : "t0", "t1", "t2", "t3", "t4", 517ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "t5", "t6", "t7", "t8" 518ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ); 519ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian} 520ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 521ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianvoid ScaleRowDown38_2_Box_MIPS_DSPR2(const uint8* src_ptr, ptrdiff_t src_stride, 522ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian uint8* dst_ptr, int dst_width) { 523ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian intptr_t stride = src_stride; 524ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const uint8* t = src_ptr + stride; 525ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const int c = 0x2AAA; 526ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 527ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian __asm__ __volatile__ ( 528ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".set push \n" 529ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".set noreorder \n" 530ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 531ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".p2align 2 \n" 532ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "1: \n" 533ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t0, 0(%[src_ptr]) \n" // |S3|S2|S1|S0| 534ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t1, 4(%[src_ptr]) \n" // |S7|S6|S5|S4| 535ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t2, 0(%[t]) \n" // |T3|T2|T1|T0| 536ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t3, 4(%[t]) \n" // |T7|T6|T5|T4| 537ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "rotr $t1, $t1, 16 \n" // |S5|S4|S7|S6| 538ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "packrl.ph $t4, $t1, $t3 \n" // |S7|S6|T7|T6| 539ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "packrl.ph $t5, $t3, $t1 \n" // |T5|T4|S5|S4| 540ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t4, $t4 \n" // S7+S6+T7+T6 541ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t5, $t5 \n" // T5+T4+S5+S4 542ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "precrq.qb.ph $t6, $t0, $t2 \n" // |S3|S1|T3|T1| 543ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "precrq.qb.ph $t6, $t6, $t6 \n" // |S3|T3|S3|T3| 544ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "srl $t4, $t4, 2 \n" // t4 / 4 545ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "srl $t6, $t6, 16 \n" // |0|0|S3|T3| 546ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t6, $t6 \n" // 0+0+S3+T3 547ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addu $t6, $t5, $t6 \n" 548ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "mul $t6, $t6, %[c] \n" // t6 * 0x2AAA 549ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sll $t0, $t0, 8 \n" // |S2|S1|S0|0| 550ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sll $t2, $t2, 8 \n" // |T2|T1|T0|0| 551ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t0, $t0 \n" // S2+S1+S0+0 552ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t2, $t2 \n" // T2+T1+T0+0 553ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addu $t0, $t0, $t2 \n" 554ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "mul $t0, $t0, %[c] \n" // t0 * 0x2AAA 555ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu %[src_ptr], %[src_ptr], 8 \n" 556ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu %[t], %[t], 8 \n" 557ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu %[dst_width], %[dst_width], -3 \n" 558ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu %[dst_ptr], %[dst_ptr], 3 \n" 559ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "srl $t6, $t6, 16 \n" 560ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "srl $t0, $t0, 16 \n" 561ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sb $t4, -1(%[dst_ptr]) \n" 562ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sb $t6, -2(%[dst_ptr]) \n" 563ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "bgtz %[dst_width], 1b \n" 564ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian " sb $t0, -3(%[dst_ptr]) \n" 565ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".set pop \n" 566ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian : [src_ptr] "+r" (src_ptr), 567ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian [dst_ptr] "+r" (dst_ptr), 568ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian [t] "+r" (t), 569ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian [dst_width] "+r" (dst_width) 570ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian : [c] "r" (c) 571ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian : "t0", "t1", "t2", "t3", "t4", "t5", "t6" 572ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ); 573ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian} 574ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 575ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanianvoid ScaleRowDown38_3_Box_MIPS_DSPR2(const uint8* src_ptr, 576ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ptrdiff_t src_stride, 577ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian uint8* dst_ptr, int dst_width) { 578ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian intptr_t stride = src_stride; 579ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const uint8* s1 = src_ptr + stride; 580ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian stride += stride; 581ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const uint8* s2 = src_ptr + stride; 582ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const int c1 = 0x1C71; 583ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian const int c2 = 0x2AAA; 584ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 585ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian __asm__ __volatile__ ( 586ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".set push \n" 587ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".set noreorder \n" 588ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 589ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".p2align 2 \n" 590ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "1: \n" 591ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t0, 0(%[src_ptr]) \n" // |S3|S2|S1|S0| 592ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t1, 4(%[src_ptr]) \n" // |S7|S6|S5|S4| 593ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t2, 0(%[s1]) \n" // |T3|T2|T1|T0| 594ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t3, 4(%[s1]) \n" // |T7|T6|T5|T4| 595ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t4, 0(%[s2]) \n" // |R3|R2|R1|R0| 596ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "lw $t5, 4(%[s2]) \n" // |R7|R6|R5|R4| 597ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "rotr $t1, $t1, 16 \n" // |S5|S4|S7|S6| 598ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "packrl.ph $t6, $t1, $t3 \n" // |S7|S6|T7|T6| 599ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t6, $t6 \n" // S7+S6+T7+T6 600ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "packrl.ph $t7, $t3, $t1 \n" // |T5|T4|S5|S4| 601ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t7, $t7 \n" // T5+T4+S5+S4 602ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sll $t8, $t5, 16 \n" // |R5|R4|0|0| 603ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t8, $t8 \n" // R5+R4 604ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addu $t7, $t7, $t8 \n" 605ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "srl $t8, $t5, 16 \n" // |0|0|R7|R6| 606ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t8, $t8 \n" // R7 + R6 607ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addu $t6, $t6, $t8 \n" 608ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "mul $t6, $t6, %[c2] \n" // t6 * 0x2AAA 609ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "precrq.qb.ph $t8, $t0, $t2 \n" // |S3|S1|T3|T1| 610ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "precrq.qb.ph $t8, $t8, $t4 \n" // |S3|T3|R3|R1| 611ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "srl $t8, $t8, 8 \n" // |0|S3|T3|R3| 612ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t8, $t8 \n" // S3 + T3 + R3 613ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addu $t7, $t7, $t8 \n" 614ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "mul $t7, $t7, %[c1] \n" // t7 * 0x1C71 615ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sll $t0, $t0, 8 \n" // |S2|S1|S0|0| 616ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sll $t2, $t2, 8 \n" // |T2|T1|T0|0| 617ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sll $t4, $t4, 8 \n" // |R2|R1|R0|0| 618ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t0, $t0 \n" 619ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t2, $t2 \n" 620ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "raddu.w.qb $t4, $t4 \n" 621ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addu $t0, $t0, $t2 \n" 622ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addu $t0, $t0, $t4 \n" 623ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "mul $t0, $t0, %[c1] \n" // t0 * 0x1C71 624ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu %[src_ptr], %[src_ptr], 8 \n" 625ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu %[s1], %[s1], 8 \n" 626ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu %[s2], %[s2], 8 \n" 627ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu %[dst_width], %[dst_width], -3 \n" 628ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "addiu %[dst_ptr], %[dst_ptr], 3 \n" 629ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "srl $t6, $t6, 16 \n" 630ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "srl $t7, $t7, 16 \n" 631ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "srl $t0, $t0, 16 \n" 632ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sb $t6, -1(%[dst_ptr]) \n" 633ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "sb $t7, -2(%[dst_ptr]) \n" 634ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "bgtz %[dst_width], 1b \n" 635ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian " sb $t0, -3(%[dst_ptr]) \n" 636ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ".set pop \n" 637ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian : [src_ptr] "+r" (src_ptr), 638ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian [dst_ptr] "+r" (dst_ptr), 639ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian [s1] "+r" (s1), 640ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian [s2] "+r" (s2), 641ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian [dst_width] "+r" (dst_width) 642ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian : [c1] "r" (c1), [c2] "r" (c2) 643ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian : "t0", "t1", "t2", "t3", "t4", 644ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian "t5", "t6", "t7", "t8" 645ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian ); 646ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian} 647ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 648ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif // defined(__mips_dsp) && (__mips_dsp_rev >= 2) 649ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 650ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#ifdef __cplusplus 651ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian} // extern "C" 652ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian} // namespace libyuv 653ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#endif 654ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian 655