[Bug other/67648] New: No need to save callee-saved registers in interrupt handler
hjl.tools at gmail dot com
gcc-bugzilla@gcc.gnu.org
Sun Sep 20 14:10:00 GMT 2015
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67648
Bug ID: 67648
Summary: No need to save callee-saved registers in interrupt
handler
Product: gcc
Version: 6.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: other
Assignee: unassigned at gcc dot gnu.org
Reporter: hjl.tools at gmail dot com
CC: julia.koval at intel dot com
Blocks: 67552
Target Milestone: ---
[hjl@gnu-6 interrupt-1]$ cat call-1.i
extern void bar (void);
void
__attribute__ ((interrupt))
foo (void)
{
bar ();
}
[hjl@gnu-6 interrupt-1]$ make call-1.s
/export/build/gnu/gcc/build-x86_64-linux/gcc/xgcc
-B/export/build/gnu/gcc/build-x86_64-linux/gcc/ -O2 -S -o call-1.s call-1.i
[hjl@gnu-6 interrupt-1]$ cat call-1.s
.file "call-1.i"
.section .text.unlikely,"ax",@progbits
.LCOLDB0:
.text
.LHOTB0:
.p2align 4,,15
.globl foo
.type foo, @function
foo:
.LFB0:
.cfi_startproc
pushq %r15
.cfi_def_cfa_offset 16
.cfi_offset 15, -16
pushq %r14
.cfi_def_cfa_offset 24
.cfi_offset 14, -24
pushq %r13
.cfi_def_cfa_offset 32
.cfi_offset 13, -32
pushq %r12
.cfi_def_cfa_offset 40
.cfi_offset 12, -40
pushq %r11
.cfi_def_cfa_offset 48
.cfi_offset 11, -48
pushq %r10
.cfi_def_cfa_offset 56
.cfi_offset 10, -56
pushq %r9
.cfi_def_cfa_offset 64
.cfi_offset 9, -64
pushq %r8
.cfi_def_cfa_offset 72
.cfi_offset 8, -72
pushq %rbp
.cfi_def_cfa_offset 80
.cfi_offset 6, -80
pushq %rdi
.cfi_def_cfa_offset 88
.cfi_offset 5, -88
pushq %rsi
.cfi_def_cfa_offset 96
.cfi_offset 4, -96
pushq %rbx
.cfi_def_cfa_offset 104
.cfi_offset 3, -104
pushq %rcx
.cfi_def_cfa_offset 112
.cfi_offset 2, -112
pushq %rdx
.cfi_def_cfa_offset 120
.cfi_offset 1, -120
pushq %rax
.cfi_def_cfa_offset 128
.cfi_offset 0, -128
subq $256, %rsp
.cfi_def_cfa_offset 384
movups %xmm0, (%rsp)
movups %xmm1, 16(%rsp)
movups %xmm2, 32(%rsp)
movups %xmm3, 48(%rsp)
movups %xmm4, 64(%rsp)
movups %xmm5, 80(%rsp)
movups %xmm6, 96(%rsp)
movups %xmm7, 112(%rsp)
movups %xmm8, 128(%rsp)
movups %xmm9, 144(%rsp)
movups %xmm10, 160(%rsp)
movups %xmm11, 176(%rsp)
movups %xmm12, 192(%rsp)
movups %xmm13, 208(%rsp)
movups %xmm14, 224(%rsp)
movups %xmm15, 240(%rsp)
.cfi_offset 17, -384
.cfi_offset 18, -368
.cfi_offset 19, -352
.cfi_offset 20, -336
.cfi_offset 21, -320
.cfi_offset 22, -304
.cfi_offset 23, -288
.cfi_offset 24, -272
.cfi_offset 25, -256
.cfi_offset 26, -240
.cfi_offset 27, -224
.cfi_offset 28, -208
.cfi_offset 29, -192
.cfi_offset 30, -176
.cfi_offset 31, -160
.cfi_offset 32, -144
call bar
movups (%rsp), %xmm0
movups 16(%rsp), %xmm1
movups 32(%rsp), %xmm2
movups 48(%rsp), %xmm3
movups 64(%rsp), %xmm4
movups 80(%rsp), %xmm5
movups 96(%rsp), %xmm6
movups 112(%rsp), %xmm7
movups 128(%rsp), %xmm8
movups 144(%rsp), %xmm9
movups 160(%rsp), %xmm10
movups 176(%rsp), %xmm11
movups 192(%rsp), %xmm12
movups 208(%rsp), %xmm13
movups 224(%rsp), %xmm14
movups 240(%rsp), %xmm15
addq $256, %rsp
.cfi_restore 32
.cfi_restore 31
.cfi_restore 30
.cfi_restore 29
.cfi_restore 28
.cfi_restore 27
.cfi_restore 26
.cfi_restore 25
.cfi_restore 24
.cfi_restore 23
.cfi_restore 22
.cfi_restore 21
.cfi_restore 20
.cfi_restore 19
.cfi_restore 18
.cfi_restore 17
.cfi_def_cfa_offset 128
popq %rax
.cfi_def_cfa_offset 120
popq %rdx
.cfi_def_cfa_offset 112
popq %rcx
.cfi_def_cfa_offset 104
popq %rbx
.cfi_def_cfa_offset 96
popq %rsi
.cfi_def_cfa_offset 88
popq %rdi
.cfi_def_cfa_offset 80
popq %rbp
.cfi_def_cfa_offset 72
popq %r8
.cfi_def_cfa_offset 64
popq %r9
.cfi_def_cfa_offset 56
popq %r10
.cfi_def_cfa_offset 48
popq %r11
.cfi_def_cfa_offset 40
popq %r12
.cfi_def_cfa_offset 32
popq %r13
.cfi_def_cfa_offset 24
popq %r14
.cfi_def_cfa_offset 16
popq %r15
.cfi_def_cfa_offset 8
iret
.cfi_endproc
.LFE0:
.size foo, .-foo
.section .text.unlikely
.LCOLDE0:
.text
.LHOTE0:
.ident "GCC: (GNU) 6.0.0 20150917 (experimental)"
.section .note.GNU-stack,"",@progbits
[hjl@gnu-6 interrupt-1]$
Since RBX and R12-R15 registers are callee-saved, we don't need
to save and restore them in interrupt handler unless they are
modified.
Referenced Bugs:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67552
[Bug 67552] [meta] x86 interrupt attribute
More information about the Gcc-bugs
mailing list