Poor man's JIT compiler

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I'm trying to get gcc version 4.3.2 to emit X86-64 code
fragments that I can catenate to perform my own JIT
compilation, but the compiler is being recalcitrant.

(I was using a jump table, but its performance was underwhelming.)

Roughly, what I've done is to create a set of code fragments,
with labels so that I can determine their address ( via &&label)
and length. E.g.,

topLoad1:  reg1 = x[i];
botLoad1:

topLoad2:  reg2 = y[i];
botLoad2:

topAdd:    regz = reg1 + reg2;
BotAdd:

topStore:  z[i] = regz;
botStore:

Then, I have a table of fragment addresses (topLoad1, topLoad2, etc.)
and lengths (botLoad1-topLoad1, botLoad2-topLoad2), and a
(unknown statically) list of fragments to be assembled to build
working code, e.g.:

 (Load2, Load1, Add, Store, Loop)

I assemble the fragments into a code buffer and jump to it,
or so the story goes. Unfortunately, what I'm seeing in the
generated code fragments is not fun:

1. GCC sometimes, but NOT always, inserts jumps to the next
   fragment. E.g.:

----------------------------------------------

.L46:
        .loc 2 34 0
        movq    -264(%rbp), %rax
        movq    %rax, -40(%rbp)
.L47:
.L7:
        .loc 2 40 0
        movl    %r8d, %eax
        jmp     .L48
.L6:
.L48:
        .loc 2 43 0
        movl    %r11d, %ecx
.L49:
.L50:
----------------------------------------------

Note the jmp .L48. If GCC always inserted a jump, I could
remove it, or if it never inserted the jump, I'd be even
happier, but it only does it now and then. I tried adding
my own jumps to force this:

topLoad2:  reg2 = y[i];
           goto botLoad2;
botLoad2:

but GCC removed them. And inserted others.

Today, I'm using these compiler options:

gcc  -O0 -ggdb -mtune=opteron -fno-align-labels -fno-align-jumps

So, I welcome suggestions on how to solve or work around these
problems. Or even a completely different approach.

Thanks,
Robert



[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux