A run-time optimization strategy uses a trace picker to identify traces of
program code in a native code pool, and a translator to translate the
traces into a code cache where the traces are executed natively. Static
branch prediction hints are encoded in branch instruction in the
translated traces. A program module implementing the present invention is
initialized with an empty code cache and a pool of instruction in a native
code pool. The trace picker analyzes the instructions in the native code
pool and identifies traces of instructions that tend to be executed as a
group. When a trace is identified, basic blocks lying along the trace path
are translated into a code cache, with static branch predictions encoded
into the branch instructions of the basic blocks based on branching
behavior observed when the trace is identified. Control then passes to the
basic blocks in the code cache, and the basic blocks in the code cache are
executed natively using the static branch prediction hints encoded into
the branch instructions.
Una estrategia de optimización run-time utiliza a recogedor del rastro para identificar rastros del código del programa en una piscina del código nativo, y un traductor para traducir los rastros a un código deposita donde los rastros se ejecutan nativo. Las indirectas estáticas de la predicción del rama se codifican en la instrucción de rama en los rastros traducidos. Un módulo del programa que pone la actual invención en ejecucio'n se inicializa con un escondrijo vacío del código y una piscina de la instrucción en una piscina del código nativo. El recogedor del rastro analiza las instrucciones en la piscina del código nativo e identifica rastros de las instrucciones que tienden para ser ejecutadas como grupo. Cuando se identifica un rastro, los bloques básicos que mienten a lo largo de la trayectoria del rastro se traducen a un escondrijo del código, con las predicciones estáticas del rama codificadas en las instrucciones de rama de los bloques básicos basados en el comportamiento de ramificación observado cuando se identifica el rastro. El control entonces pasa a los bloques básicos en el escondrijo del código, y los bloques básicos en el escondrijo del código se ejecutan nativo usando las indirectas estáticas de la predicción del rama codificadas en las instrucciones de rama.