1 /* 2 * Copyright (c) 2017 The WebM project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #include "./vp8_rtcd.h" 12 #include "vpx_ports/asmdefs_mmi.h" 13 14 #define COPY_MEM_16X2 \ 15 "gsldlc1 %[ftmp0], 0x07(%[src]) \n\t" \ 16 "gsldrc1 %[ftmp0], 0x00(%[src]) \n\t" \ 17 "ldl %[tmp0], 0x0f(%[src]) \n\t" \ 18 "ldr %[tmp0], 0x08(%[src]) \n\t" \ 19 MMI_ADDU(%[src], %[src], %[src_stride]) \ 20 "gssdlc1 %[ftmp0], 0x07(%[dst]) \n\t" \ 21 "gssdrc1 %[ftmp0], 0x00(%[dst]) \n\t" \ 22 "sdl %[tmp0], 0x0f(%[dst]) \n\t" \ 23 "sdr %[tmp0], 0x08(%[dst]) \n\t" \ 24 MMI_ADDU(%[dst], %[dst], %[dst_stride]) \ 25 "gsldlc1 %[ftmp1], 0x07(%[src]) \n\t" \ 26 "gsldrc1 %[ftmp1], 0x00(%[src]) \n\t" \ 27 "ldl %[tmp1], 0x0f(%[src]) \n\t" \ 28 "ldr %[tmp1], 0x08(%[src]) \n\t" \ 29 MMI_ADDU(%[src], %[src], %[src_stride]) \ 30 "gssdlc1 %[ftmp1], 0x07(%[dst]) \n\t" \ 31 "gssdrc1 %[ftmp1], 0x00(%[dst]) \n\t" \ 32 "sdl %[tmp1], 0x0f(%[dst]) \n\t" \ 33 "sdr %[tmp1], 0x08(%[dst]) \n\t" \ 34 MMI_ADDU(%[dst], %[dst], %[dst_stride]) 35 36 #define COPY_MEM_8X2 \ 37 "gsldlc1 %[ftmp0], 0x07(%[src]) \n\t" \ 38 "gsldrc1 %[ftmp0], 0x00(%[src]) \n\t" \ 39 MMI_ADDU(%[src], %[src], %[src_stride]) \ 40 "ldl %[tmp0], 0x07(%[src]) \n\t" \ 41 "ldr %[tmp0], 0x00(%[src]) \n\t" \ 42 MMI_ADDU(%[src], %[src], %[src_stride]) \ 43 \ 44 "gssdlc1 %[ftmp0], 0x07(%[dst]) \n\t" \ 45 "gssdrc1 %[ftmp0], 0x00(%[dst]) \n\t" \ 46 MMI_ADDU(%[dst], %[dst], %[dst_stride]) \ 47 "sdl %[tmp0], 0x07(%[dst]) \n\t" \ 48 "sdr %[tmp0], 0x00(%[dst]) \n\t" \ 49 MMI_ADDU(%[dst], %[dst], %[dst_stride]) 50 vp8_copy_mem16x16_mmi(unsigned char * src,int src_stride,unsigned char * dst,int dst_stride)51 void vp8_copy_mem16x16_mmi(unsigned char *src, int src_stride, 52 unsigned char *dst, int dst_stride) { 53 double ftmp[2]; 54 uint64_t tmp[2]; 55 uint8_t loop_count = 4; 56 57 /* clang-format off */ 58 __asm__ volatile ( 59 "1: \n\t" 60 COPY_MEM_16X2 61 COPY_MEM_16X2 62 MMI_ADDIU(%[loop_count], %[loop_count], -0x01) 63 "bnez %[loop_count], 1b \n\t" 64 : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]), 65 [tmp0]"=&r"(tmp[0]), [tmp1]"=&r"(tmp[1]), 66 [loop_count]"+&r"(loop_count), 67 [dst]"+&r"(dst), [src]"+&r"(src) 68 : [src_stride]"r"((mips_reg)src_stride), 69 [dst_stride]"r"((mips_reg)dst_stride) 70 : "memory" 71 ); 72 /* clang-format on */ 73 } 74 vp8_copy_mem8x8_mmi(unsigned char * src,int src_stride,unsigned char * dst,int dst_stride)75 void vp8_copy_mem8x8_mmi(unsigned char *src, int src_stride, unsigned char *dst, 76 int dst_stride) { 77 double ftmp[2]; 78 uint64_t tmp[1]; 79 uint8_t loop_count = 4; 80 81 /* clang-format off */ 82 __asm__ volatile ( 83 "1: \n\t" 84 COPY_MEM_8X2 85 MMI_ADDIU(%[loop_count], %[loop_count], -0x01) 86 "bnez %[loop_count], 1b \n\t" 87 : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]), 88 [tmp0]"=&r"(tmp[0]), [loop_count]"+&r"(loop_count), 89 [dst]"+&r"(dst), [src]"+&r"(src) 90 : [src_stride]"r"((mips_reg)src_stride), 91 [dst_stride]"r"((mips_reg)dst_stride) 92 : "memory" 93 ); 94 /* clang-format on */ 95 } 96 vp8_copy_mem8x4_mmi(unsigned char * src,int src_stride,unsigned char * dst,int dst_stride)97 void vp8_copy_mem8x4_mmi(unsigned char *src, int src_stride, unsigned char *dst, 98 int dst_stride) { 99 double ftmp[2]; 100 uint64_t tmp[1]; 101 102 /* clang-format off */ 103 __asm__ volatile ( 104 COPY_MEM_8X2 105 COPY_MEM_8X2 106 : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]), 107 [tmp0]"=&r"(tmp[0]), 108 [dst]"+&r"(dst), [src]"+&r"(src) 109 : [src_stride]"r"((mips_reg)src_stride), 110 [dst_stride]"r"((mips_reg)dst_stride) 111 : "memory" 112 ); 113 /* clang-format on */ 114 } 115