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
29using namespace android;
30
31class ScanlineAssembly : public Assembly {
32    AssemblyKey<needs_t> mKey;
33public:
34    ScanlineAssembly(needs_t needs, size_t size)
35        : Assembly(size), mKey(needs) { }
36    const AssemblyKey<needs_t>& key() const { return mKey; }
37};
38
39static 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
73int 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