Оптимизация кода C для генерации "более эффективного кода сборки" для указанного c компилятора / процессора - это то, что вы обычно не должны делать. Напишите ясный и простой для понимания код C и позвольте компилятору выполнить оптимизацию.
Даже если вы делаете все виды трюков с кодом C и в итоге получаете "более эффективный код сборки" для вашего Если указать c компилятор / процессор, может оказаться, что простое обновление компилятора может все испортить, и вам придется снова изменить код C.
Для чего-то столь же простого, как ваш код, напишите это в коде ассемблера с самого начала. Но имейте в виду, что вам нужно быть настоящим экспертом в этом языке процессора / ассемблера, чтобы победить достойный компилятор.
В любом случае ... Если мы хотим догадаться, это мое предположение:
void some_function(int *data)
{
int i, j, x;
for (i = 0; i < 64; i++)
{
// Handle even i-values
x = i/2;
for (j = 0; j < 64; j += 2)
{
*data = x;
++data;
*data = x;
++data;
++x; // Increment after writing to data twice
}
++i;
// Handle odd i-values
x = i/2;
for (j = 0; j < 64; j += 2)
{
*data = x;
++data;
++x; // Increment after writing to data once
*data = x;
++data;
}
}
}
Идея состоит в том, чтобы 1) заменить индексирование массива приращениями указателя и 2) заменить (i+j)/2
целочисленными приращениями.
У меня нет сделано какое-либо измерение поэтому я не могу точно сказать, что это будет хорошим решением. Я оставлю это OP.
Та же идея, что и выше, но с еще несколькими настройками (предложено @ user3386109)
void some_function(int *data)
{
for (int i = 0; i < 32; i++)
{
// when i is even, the output is in matched pairs
int value = i;
for (int j = 0; j < 32; j++)
{
*data++ = value;
*data++ = value++;
}
// when i is odd, the output starts with a singleton
// followed by matched pairs, and ending with a singleton
value = i;
*data++ = value++;
for (int j = 0; j < 31; j++)
{
*data++ = value;
*data++ = value++;
}
*data++ = value;
}
}