Я смотрю на вывод некоторых компиляторов для платформы MIPS и пытаюсь понять, как функция возвращает и что допустимо.
Вот простой пример:
int two_x_squared(int x)
{
return 2*x*x;
}
Если я скомпилируйте его с помощью Compiler Explorer Понятно
two_x_squared(int):
sll $2,$4,1
mult $2,$4
mflo $2
j $31
nop
ОК, ничего страшного, я думаю, j $31
переходит на обратный адрес, и nop
может быть чем-тотребуется для защиты от спекулятивного выполнения в конвейере.
Но затем я компилирую с XC32 в -O2
и получаю
two_x_squared:
mul $4,$4,$4
j $31
sll $2,$4,1
Итак ... строка после j $31
получаетвыполнено после прыжка?!