Я пытаюсь написать планировщик для запуска так называемых «волокон». К сожалению, я не очень привык писать встроенную сборку.встроенная сборка - бесполезные инструкции промежуточного копирования
typedef struct {
//fiber's stack
long rsp;
long rbp;
//next fiber in ready list
struct fiber *next;
} fiber;
//currently executing fiber
fiber *fib;
Так сама первая задача - очевидно - создание волокна для функции main
поэтому оно может быть приостановлено.
int main(int argc, char* argv[]){
//create fiber for main function
fib = malloc(sizeof(*fib));
__asm__(
"movq %%rsp, %0;"
"movq %%rbp, %1;"
: "=r"(fib->rsp),"=r"(fib->rbp)
);
//jump to actual main and execute
__asm__(...);
}
Это компилируется в
movl $24, %edi #,
call malloc #
#APP
# 27 "scheduler.c" 1
movq %rsp, %rcx;movq %rbp, %rdx; # tmp92, tmp93
# 0 "" 2
#NO_APP
movq %rax, fib(%rip) # tmp91, fib
movq %rcx, (%rax) # tmp92, MEM[(struct fiber *)_3].rsp
movq %rdx, 8(%rax) # tmp93, MEM[(struct fiber *)_3].rbp
Почему это компилировать mov
сек во временные регистры? Могу ли я как-то избавиться от них?
Первая версия этого вопроса имела выход asm от gcc -O0
, с еще большим количеством инструкций и временными данными.
Включение оптимизаций не избавляется от них.
Включили ли вы оптимизацию? – Jester
@Jester У меня не было сначала, но включение их не избавляет от временных (см. Выше). – User1291
C не поддерживает _methods_ – Olaf