У меня есть код C:
int64_t sample_max(int64_t *beg, int64_t len) {
if (len == 0) {
return 0;
}
int64_t max = 0x8000000000000000;
int64_t *end = beg + len;
while (beg < end) {
if (*beg > max) {
max = *beg;
}
beg++;
}
return max;
}
и завершите его с помощью лязга:
clang -S -target x86_64-unknown-none -masm=intel -mno-red-zone -mstackrealign -mllvm -inline-threshold=1000 -fno-asynchronous-unwind-tables -fno-exceptions -fno-rtti -O3 -fno-builtin -ffast-math -mavx2 lib/sample.c -o lib/sample_avx2.s
и я обнаружил, что clang / llvm выполняет локальные переменные "max = 0x8000000000000000" до глобальных:
vpbroadcastq ymm0, qword ptr [rip + .LCPI1_0]
vmovdqa ymm3, ymm0
vmovdqa ymm2, ymm0
vmovdqa ymm1, ymm0
....
.LCPI1_0:
.quad -9223372036854775808 # 0x8000000000000000
.section .rodata,"a",@progbits
.align 32
Как предотвратить компиляцию локальных переменных clang / llvm в глобальные?
Можем ли мы скомпилировать 0x8000000000000000 в непосредственные значения?
Спасибо.