Bug 69749 - Use aligned spill/fill for vector register in interrupt handler
Summary: Use aligned spill/fill for vector register in interrupt handler
Status: UNCONFIRMED
Alias: None
Product: gcc
Classification: Unclassified
Component: target (show other bugs)
Version: 6.0
: P3 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks: 67552
  Show dependency treegraph
 
Reported: 2016-02-10 15:39 UTC by H.J. Lu
Modified: 2016-02-11 19:53 UTC (History)
0 users

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description H.J. Lu 2016-02-10 15:39:39 UTC
On hjl/interrupt/stage1 branch, I got

[hjl@gnu-6 interrupt-2]$ cat y.c
extern void bar (void);

 __attribute__((interrupt))
void
foo (void *frame)
{
  bar ();
}
[hjl@gnu-6 interrupt-2]$ make y.s
/export/build/gnu/gcc/build-x86_64-linux/gcc/xgcc -B/export/build/gnu/gcc/build-x86_64-linux/gcc/ -S -O2 y.c
[hjl@gnu-6 interrupt-2]$ cat y.s
	.file	"y.c"
	.text
	.p2align 4,,15
	.globl	foo
	.type	foo, @function
foo:
.LFB0:
	.cfi_startproc
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	pushq	%r11
	pushq	%r10
	pushq	%r9
	pushq	%r8
	pushq	%rdi
	pushq	%rsi
	pushq	%rcx
	pushq	%rdx
	pushq	%rax
	andq	$-16, %rsp
	subq	$256, %rsp
	movups	%xmm0, -328(%rbp)
	.cfi_escape 0x10,0x11,0x3,0x76,0xb8,0x7d
	.cfi_offset 11, -24
	.cfi_offset 10, -32
	.cfi_offset 9, -40
	.cfi_offset 8, -48
	.cfi_offset 5, -56
	.cfi_offset 4, -64
	.cfi_offset 2, -72
	.cfi_offset 1, -80
	.cfi_offset 0, -88
	movups	%xmm1, -312(%rbp)
	.cfi_escape 0x10,0x12,0x3,0x76,0xc8,0x7d
	movups	%xmm2, -296(%rbp)
	.cfi_escape 0x10,0x13,0x3,0x76,0xd8,0x7d
	movups	%xmm3, -280(%rbp)
	.cfi_escape 0x10,0x14,0x3,0x76,0xe8,0x7d
	movups	%xmm4, -264(%rbp)
	.cfi_escape 0x10,0x15,0x3,0x76,0xf8,0x7d
	movups	%xmm5, -248(%rbp)
	.cfi_escape 0x10,0x16,0x3,0x76,0x88,0x7e
	movups	%xmm6, -232(%rbp)
	.cfi_escape 0x10,0x17,0x3,0x76,0x98,0x7e
	movups	%xmm7, -216(%rbp)
	.cfi_escape 0x10,0x18,0x3,0x76,0xa8,0x7e
	movups	%xmm8, -200(%rbp)
	.cfi_escape 0x10,0x19,0x3,0x76,0xb8,0x7e
	movups	%xmm9, -184(%rbp)
	.cfi_escape 0x10,0x1a,0x3,0x76,0xc8,0x7e
	movups	%xmm10, -168(%rbp)
	.cfi_escape 0x10,0x1b,0x3,0x76,0xd8,0x7e
	movups	%xmm11, -152(%rbp)
	.cfi_escape 0x10,0x1c,0x3,0x76,0xe8,0x7e
	movups	%xmm12, -136(%rbp)
	.cfi_escape 0x10,0x1d,0x3,0x76,0xf8,0x7e
	movups	%xmm13, -120(%rbp)
	.cfi_escape 0x10,0x1e,0x3,0x76,0x88,0x7f
	movups	%xmm14, -104(%rbp)
	.cfi_escape 0x10,0x1f,0x3,0x76,0x98,0x7f
	movups	%xmm15, -88(%rbp)
	.cfi_escape 0x10,0x20,0x3,0x76,0xa8,0x7f
	cld
	call	bar
	movups	-328(%rbp), %xmm0
	movups	-312(%rbp), %xmm1
	movups	-296(%rbp), %xmm2
	movups	-280(%rbp), %xmm3
	movups	-264(%rbp), %xmm4
	movups	-248(%rbp), %xmm5
	movups	-232(%rbp), %xmm6
	movups	-216(%rbp), %xmm7
	movups	-200(%rbp), %xmm8
	movups	-184(%rbp), %xmm9
	movups	-168(%rbp), %xmm10
	movups	-152(%rbp), %xmm11
	movups	-136(%rbp), %xmm12
	movups	-120(%rbp), %xmm13
	movups	-104(%rbp), %xmm14
	movups	-88(%rbp), %xmm15
	leaq	-72(%rbp), %rsp
	.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
	popq	%rax
	popq	%rdx
	popq	%rcx
	popq	%rsi
	popq	%rdi
	popq	%r8
	popq	%r9
	popq	%r10
	popq	%r11
	popq	%rbp
	.cfi_def_cfa 7, 8
	iretq
	.cfi_endproc
.LFE0:
	.size	foo, .-foo
	.ident	"GCC: (GNU) 6.0.0 20160209 (experimental)"
	.section	.note.GNU-stack,"",@progbits
[hjl@gnu-6 interrupt-2]$ 

We should use aligned spill/fill for vector registers.