1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdio.h>
2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdint.h>
3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
46090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang#include "private/pixelflinger/ggl_context.h"
5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
66090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang#include "buffer.h"
76090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang#include "scanline.h"
86090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang
96090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang#include "codeflinger/CodeCache.h"
106090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang#include "codeflinger/GGLAssembler.h"
116090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang#include "codeflinger/ARMAssembler.h"
12734f50c2fe5b8778370b687c29401effcb254862Duane Sand#if defined(__mips__) && !defined(__LP64__) && __mips_isa_rev < 6
132bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#include "codeflinger/MIPSAssembler.h"
14606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes#elif defined(__mips__) && defined(__LP64__) && __mips_isa_rev == 6
15606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes#include "codeflinger/MIPS64Assembler.h"
16734f50c2fe5b8778370b687c29401effcb254862Duane Sand#endif
17d4146e6091d6ed947ce9edd0f8ef3e5fe066d716Colin Cross#include "codeflinger/Arm64Assembler.h"
186090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang
19606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes#if defined(__arm__) || (defined(__mips__) && ((!defined(__LP64__) && __mips_isa_rev < 6) || (defined(__LP64__) && __mips_isa_rev == 6))) || defined(__aarch64__)
206090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang#   define ANDROID_ARM_CODEGEN  1
216090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang#else
226090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang#   define ANDROID_ARM_CODEGEN  0
236090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang#endif
246090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang
25606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes#if defined(__mips__) && ((!defined(__LP64__) && __mips_isa_rev < 6) || (defined(__LP64__) && __mips_isa_rev == 6))
262bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#define ASSEMBLY_SCRATCH_SIZE   4096
27658f89dc5c418dbbc0c5d78f5861855b90ca8c9fAshok Bhat#elif defined(__aarch64__)
28658f89dc5c418dbbc0c5d78f5861855b90ca8c9fAshok Bhat#define ASSEMBLY_SCRATCH_SIZE   8192
292bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#else
306090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang#define ASSEMBLY_SCRATCH_SIZE   2048
312bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#endif
326090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang
336090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huangusing namespace android;
346090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang
356090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huangclass ScanlineAssembly : public Assembly {
366090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang    AssemblyKey<needs_t> mKey;
376090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huangpublic:
386090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang    ScanlineAssembly(needs_t needs, size_t size)
396090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang        : Assembly(size), mKey(needs) { }
406090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang    const AssemblyKey<needs_t>& key() const { return mKey; }
416090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang};
426090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang
43c7f344e9a9070c748bc885a5e60edbd256ffffd5Chih-Hung Hsieh#if ANDROID_ARM_CODEGEN
446090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huangstatic void ggl_test_codegen(uint32_t n, uint32_t p, uint32_t t0, uint32_t t1)
456090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang{
466090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang    GGLContext* c;
476090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang    gglInit(&c);
486090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang    needs_t needs;
496090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang    needs.n = n;
506090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang    needs.p = p;
516090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang    needs.t[0] = t0;
526090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang    needs.t[1] = t1;
536090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang    sp<ScanlineAssembly> a(new ScanlineAssembly(needs, ASSEMBLY_SCRATCH_SIZE));
542bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
552bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#if defined(__arm__)
566090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang    GGLAssembler assembler( new ARMAssembler(a) );
572bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#endif
582bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
59734f50c2fe5b8778370b687c29401effcb254862Duane Sand#if defined(__mips__) && !defined(__LP64__) && __mips_isa_rev < 6
602bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind    GGLAssembler assembler( new ArmToMipsAssembler(a) );
612bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind#endif
622bc2b792782b304b15d8c48b54916a9b3fa3a7acPaul Lind
63606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes#if defined(__mips__) && defined(__LP64__) && __mips_isa_rev == 6
64606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes    GGLAssembler assembler( new ArmToMips64Assembler(a) );
65606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes#endif
66606d4aecfb6a1e911dac207caeba617d1379c1f7Elliott Hughes
67658f89dc5c418dbbc0c5d78f5861855b90ca8c9fAshok Bhat#if defined(__aarch64__)
68d4146e6091d6ed947ce9edd0f8ef3e5fe066d716Colin Cross    GGLAssembler assembler( new ArmToArm64Assembler(a) );
69658f89dc5c418dbbc0c5d78f5861855b90ca8c9fAshok Bhat#endif
70658f89dc5c418dbbc0c5d78f5861855b90ca8c9fAshok Bhat
716090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang    int err = assembler.scanline(needs, (context_t*)c);
726090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang    if (err != 0) {
736090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang        printf("error %08x (%s)\n", err, strerror(-err));
746090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang    }
756090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang    gglUninit(c);
76c7f344e9a9070c748bc885a5e60edbd256ffffd5Chih-Hung Hsieh}
776090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang#else
78c7f344e9a9070c748bc885a5e60edbd256ffffd5Chih-Hung Hsiehstatic void ggl_test_codegen(uint32_t, uint32_t, uint32_t, uint32_t) {
79d4146e6091d6ed947ce9edd0f8ef3e5fe066d716Colin Cross    printf("This test runs only on ARM, Arm64 or MIPS\n");
806090dacd1894429baaf13f7b30b2f6e9e2c1617fJim Huang}
81c7f344e9a9070c748bc885a5e60edbd256ffffd5Chih-Hung Hsieh#endif
82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint main(int argc, char** argv)
84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (argc != 2) {
86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        printf("usage: %s 00000117:03454504_00001501_00000000\n", argv[0]);
87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return 0;
88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    uint32_t n;
90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    uint32_t p;
91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    uint32_t t0;
92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    uint32_t t1;
93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    sscanf(argv[1], "%08x:%08x_%08x_%08x", &p, &n, &t0, &t1);
94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    ggl_test_codegen(n, p,  t0, t1);
95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return 0;
96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
97