On 22 Feb 2017, at 14:58, Ronie Salgado roniesalg@gmail.com wrote:
Dear Ronie,
GDB layout asm on the line 25313 shows the generated code.
B+>│0x565aac77 <interpret+214836> flds -0x1d6c(%ebp) │ │0x565aac7d <interpret+214842> sub $0x8,%esp │ │0x565aac80 <interpret+214845> lea -0x8(%esp),%esp │ │0x565aac84 <interpret+214849> fstpl (%esp) │ │0x565aac87 <interpret+214852> mov -0x4008(%ebp),%ebx │ │0x565aac8d <interpret+214858> call 0x56570840
Of special importance, is the instruction: mov -0x4008(%ebp),%ebx . this is the PLT entry for sqrt, and this is where ebx with the currentBytecode is destroyed.
I tried to reproduce it but I think I don't generate enough register pressure?
#include <stdint.h> #include <sys/types.h> #include <math.h>
int interpret(int *ops, const size_t num_ops) { register int op __asm__("%ebx"); size_t off = 0;
while (off < num_ops) { op = ops[off]; switch(op) { case 1: case 2: sqrt(op + num_ops); break; default: break; } off += 1; } }
can you think of a way to get closer to the interpreter? Is it using computed goto? If there is a reproducer I am happy to open a bug with the GCC project and try to bring it to a resolution.
holger