qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

hvx_histogram.c (2387B)


      1 /*
      2  *  Copyright(c) 2021 Qualcomm Innovation Center, Inc. All Rights Reserved.
      3  *
      4  *  This program is free software; you can redistribute it and/or modify
      5  *  it under the terms of the GNU General Public License as published by
      6  *  the Free Software Foundation; either version 2 of the License, or
      7  *  (at your option) any later version.
      8  *
      9  *  This program is distributed in the hope that it will be useful,
     10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
     11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     12  *  GNU General Public License for more details.
     13  *
     14  *  You should have received a copy of the GNU General Public License
     15  *  along with this program; if not, see <http://www.gnu.org/licenses/>.
     16  */
     17 
     18 #include <stdio.h>
     19 #include <stdint.h>
     20 #include <string.h>
     21 #include "hvx_histogram_row.h"
     22 
     23 const int vector_len = 128;
     24 const int width = 275;
     25 const int height = 20;
     26 const int stride = (width + vector_len - 1) & -vector_len;
     27 
     28 int err;
     29 
     30 static uint8_t input[height][stride] __attribute__((aligned(128))) = {
     31 #include "hvx_histogram_input.h"
     32 };
     33 
     34 static int result[256] __attribute__((aligned(128)));
     35 static int expect[256] __attribute__((aligned(128)));
     36 
     37 static void check(void)
     38 {
     39     for (int i = 0; i < 256; i++) {
     40         int res = result[i];
     41         int exp = expect[i];
     42         if (res != exp) {
     43             printf("ERROR at %3d: 0x%04x != 0x%04x\n",
     44                    i, res, exp);
     45             err++;
     46         }
     47     }
     48 }
     49 
     50 static void ref_histogram(uint8_t *src, int stride, int width, int height,
     51                           int *hist)
     52 {
     53     for (int i = 0; i < 256; i++) {
     54         hist[i] = 0;
     55     }
     56 
     57     for (int i = 0; i < height; i++) {
     58         for (int j = 0; j < width; j++) {
     59             hist[src[i * stride + j]]++;
     60         }
     61     }
     62 }
     63 
     64 static void hvx_histogram(uint8_t *src, int stride, int width, int height,
     65                           int *hist)
     66 {
     67     int n = 8192 / width;
     68 
     69     for (int i = 0; i < 256; i++) {
     70         hist[i] = 0;
     71     }
     72 
     73     for (int i = 0; i < height; i += n) {
     74         int k = height - i > n ? n : height - i;
     75         hvx_histogram_row(src, stride, width, k, hist);
     76         src += n * stride;
     77     }
     78 }
     79 
     80 int main()
     81 {
     82     ref_histogram(&input[0][0], stride, width, height, expect);
     83     hvx_histogram(&input[0][0], stride, width, height, result);
     84     check();
     85 
     86     puts(err ? "FAIL" : "PASS");
     87     return err ? 1 : 0;
     88 }