Home | History | Annotate | Download | only in codegen
      1 #include <stdio.h>
      2 #include <stdint.h>
      3 
      4 #include "private/pixelflinger/ggl_context.h"
      5 
      6 #include "buffer.h"
      7 #include "scanline.h"
      8 
      9 #include "codeflinger/CodeCache.h"
     10 #include "codeflinger/GGLAssembler.h"
     11 #include "codeflinger/ARMAssembler.h"
     12 #include "codeflinger/MIPSAssembler.h"
     13 #include "codeflinger/Arm64Assembler.h"
     14 
     15 #if defined(__arm__) || defined(__mips__) || defined(__aarch64__)
     16 #   define ANDROID_ARM_CODEGEN  1
     17 #else
     18 #   define ANDROID_ARM_CODEGEN  0
     19 #endif
     20 
     21 #if defined (__mips__)
     22 #define ASSEMBLY_SCRATCH_SIZE   4096
     23 #elif defined(__aarch64__)
     24 #define ASSEMBLY_SCRATCH_SIZE   8192
     25 #else
     26 #define ASSEMBLY_SCRATCH_SIZE   2048
     27 #endif
     28 
     29 using namespace android;
     30 
     31 class ScanlineAssembly : public Assembly {
     32     AssemblyKey<needs_t> mKey;
     33 public:
     34     ScanlineAssembly(needs_t needs, size_t size)
     35         : Assembly(size), mKey(needs) { }
     36     const AssemblyKey<needs_t>& key() const { return mKey; }
     37 };
     38 
     39 static void ggl_test_codegen(uint32_t n, uint32_t p, uint32_t t0, uint32_t t1)
     40 {
     41 #if ANDROID_ARM_CODEGEN
     42     GGLContext* c;
     43     gglInit(&c);
     44     needs_t needs;
     45     needs.n = n;
     46     needs.p = p;
     47     needs.t[0] = t0;
     48     needs.t[1] = t1;
     49     sp<ScanlineAssembly> a(new ScanlineAssembly(needs, ASSEMBLY_SCRATCH_SIZE));
     50 
     51 #if defined(__arm__)
     52     GGLAssembler assembler( new ARMAssembler(a) );
     53 #endif
     54 
     55 #if defined(__mips__) && !defined(__LP64__)
     56     GGLAssembler assembler( new ArmToMipsAssembler(a) );
     57 #endif
     58 
     59 #if defined(__aarch64__)
     60     GGLAssembler assembler( new ArmToArm64Assembler(a) );
     61 #endif
     62 
     63     int err = assembler.scanline(needs, (context_t*)c);
     64     if (err != 0) {
     65         printf("error %08x (%s)\n", err, strerror(-err));
     66     }
     67     gglUninit(c);
     68 #else
     69     printf("This test runs only on ARM, Arm64 or MIPS\n");
     70 #endif
     71 }
     72 
     73 int main(int argc, char** argv)
     74 {
     75     if (argc != 2) {
     76         printf("usage: %s 00000117:03454504_00001501_00000000\n", argv[0]);
     77         return 0;
     78     }
     79     uint32_t n;
     80     uint32_t p;
     81     uint32_t t0;
     82     uint32_t t1;
     83     sscanf(argv[1], "%08x:%08x_%08x_%08x", &p, &n, &t0, &t1);
     84     ggl_test_codegen(n, p,  t0, t1);
     85     return 0;
     86 }
     87