Thanks for your interest! The bit-level format of the byte-code is
called "BitCode." It was created for the LLVM project, and is
documented here:
http://llvm.org/docs/BitCodeFormat.html
In Gazelle, that's implemented in runtime/bc_read_stream.{c,h}. If
you're interested in interpreting Gazelle bytecode in Java (which is
something I'd love to see), I'd start by implementing BitCode.
The Gazelle-specific semantics that are layered on top of BitCode are
described very tersely in docs/FILEFORMAT. The meanings of those
structures are described in the last section of the manual ("The
Gazelle Algorithm"). The manual isn't a full specification, but it
should be a good start.
Josh