Я не вижу ничего очевидного. В дополнение к тому, что сказал Алекс, есть два небольших предложения, которые могут помочь:
1) Длинный оператор if
в первом цикле имеет ряд состояний отказа. Вы заказали его так, чтобы тот, который с наибольшей вероятностью потерпел неудачу, был первым? При оценке короткого замыкания, чем раньше вы сможете найти false
, тем меньше работы потребуется для оценки всего выражения.
2) Вы объявляете много переменных вне двух циклов for, и я понимаю, почему вы это сделали. Вполне возможно, что JVM сможет лучше оптимизировать ситуацию, если вы переместите объявления внутри двух циклов, чтобы переменные объявлялись как можно локально.
Для того и другого вам нужно выполнить несколько временных прогонов, чтобы увидеть, действительно ли они имеют значение. Вы также можете использовать профилировщик, чтобы увидеть, где код проводит большую часть своего времени.
У меня есть еще один комментарий. В строках вроде:
data[pointer + 7] = (short) ((tmp10 - tmp3) >> F3);
вы используете >>
вместо >>>
для сдвига битов возможно отрицательного числа. Вы уверены, что это то, что вы хотите сделать, если tmp3> tmp10?