/* { dg-do compile { target ia32 } } */ /* { dg-options "-O2 -mgeneral-regs-only -mno-cld -miamcu -maccumulate-outgoing-args" } */ struct interrupt_frame; extern void callback0 (unsigned int id, unsigned int len) __attribute__((no_caller_saved_registers)); extern void callback1 (unsigned int id, unsigned int len) __attribute__((no_caller_saved_registers)); extern void callback2 (unsigned int id, unsigned int len) __attribute__((no_caller_saved_registers)); typedef void (*callback_t) (unsigned int id, unsigned int len) __attribute__((no_caller_saved_registers)); callback_t callback[] = { callback0, callback1, callback2, }; unsigned int remaining; void __attribute__((no_caller_saved_registers)) handler(int uart) { while (1) { if (remaining) { callback[uart](0, 0); break; } } } int uart; void __attribute__((interrupt)) my_isr(struct interrupt_frame *frame) { handler(uart); } /* { dg-final { scan-assembler-times "\tcld" 1 } } */