powerpc: setcontext.S uses power6 mtfsf when not supported [BZ #18116]
The attached patch fixes a glibc build failure with gcc 5 on powerpc64le caused by a recent change in gcc where the compiler defines the _ARCH_PWR6 macro when processing assembly files but doesn't invoke the assembler in the corresponding machine mode (unless it has been explicitly configured to target POWER 6 or later). A bug had been filed with gcc for this (65341) but was closed as won't fix. Glibc relies on the _ARCH_PWR6 macro in a few .S files to make use of Power ISA 2.5 instructions (specifically, the four-argument form of the mtfsf insn). A similar problem had occurred in the past (bug 10118) but the fix that was committed for it didn't anticipate this new problem.
This commit is contained in:
parent
0cd2828695
commit
db8fed87d9
@ -1,3 +1,12 @@
|
|||||||
|
2015-03-11 Martin Sebor <msebor@redhat.com>
|
||||||
|
|
||||||
|
[BZ #18116]
|
||||||
|
* sysdeps/unix/sysv/linux/powerpc/powerpc64/setcontext.S
|
||||||
|
(__setcontext): Use extended four-operand version of mtsf whenever
|
||||||
|
possible.
|
||||||
|
* sysdeps/unix/sysv/linux/powerpc/powerpc64/swapcontext.S
|
||||||
|
(__novec_swapcontext): Likewise.
|
||||||
|
|
||||||
2015-06-01 Siddhesh Poyarekar <siddhesh@redhat.com>
|
2015-06-01 Siddhesh Poyarekar <siddhesh@redhat.com>
|
||||||
|
|
||||||
* benchtests/scripts/compare_bench.py: New file.
|
* benchtests/scripts/compare_bench.py: New file.
|
||||||
|
@ -81,22 +81,31 @@ ENTRY(__novec_setcontext)
|
|||||||
|
|
||||||
# ifdef _ARCH_PWR6
|
# ifdef _ARCH_PWR6
|
||||||
/* Use the extended four-operand version of the mtfsf insn. */
|
/* Use the extended four-operand version of the mtfsf insn. */
|
||||||
mtfsf 0xff,fp0,1,0
|
|
||||||
# else
|
|
||||||
.machine push
|
.machine push
|
||||||
.machine "power6"
|
.machine "power6"
|
||||||
|
|
||||||
|
mtfsf 0xff,fp0,1,0
|
||||||
|
|
||||||
|
.machine pop
|
||||||
|
# else
|
||||||
/* Availability of DFP indicates a 64-bit FPSCR. */
|
/* Availability of DFP indicates a 64-bit FPSCR. */
|
||||||
andi. r6,r5,PPC_FEATURE_HAS_DFP
|
andi. r6,r5,PPC_FEATURE_HAS_DFP
|
||||||
beq 5f
|
beq 5f
|
||||||
/* Use the extended four-operand version of the mtfsf insn. */
|
/* Use the extended four-operand version of the mtfsf insn. */
|
||||||
|
.machine push
|
||||||
|
.machine "power6"
|
||||||
|
|
||||||
mtfsf 0xff,fp0,1,0
|
mtfsf 0xff,fp0,1,0
|
||||||
|
|
||||||
|
.machine pop
|
||||||
|
|
||||||
b 6f
|
b 6f
|
||||||
/* Continue to operate on the FPSCR as if it were 32-bits. */
|
/* Continue to operate on the FPSCR as if it were 32-bits. */
|
||||||
5:
|
5:
|
||||||
mtfsf 0xff,fp0
|
mtfsf 0xff,fp0
|
||||||
6:
|
6:
|
||||||
.machine pop
|
|
||||||
# endif /* _ARCH_PWR6 */
|
# endif /* _ARCH_PWR6 */
|
||||||
|
|
||||||
lfd fp29,(SIGCONTEXT_FP_REGS+(PT_R29*8))(r31)
|
lfd fp29,(SIGCONTEXT_FP_REGS+(PT_R29*8))(r31)
|
||||||
lfd fp28,(SIGCONTEXT_FP_REGS+(PT_R28*8))(r31)
|
lfd fp28,(SIGCONTEXT_FP_REGS+(PT_R28*8))(r31)
|
||||||
lfd fp27,(SIGCONTEXT_FP_REGS+(PT_R27*8))(r31)
|
lfd fp27,(SIGCONTEXT_FP_REGS+(PT_R27*8))(r31)
|
||||||
@ -364,22 +373,31 @@ L(has_no_vec):
|
|||||||
|
|
||||||
# ifdef _ARCH_PWR6
|
# ifdef _ARCH_PWR6
|
||||||
/* Use the extended four-operand version of the mtfsf insn. */
|
/* Use the extended four-operand version of the mtfsf insn. */
|
||||||
mtfsf 0xff,fp0,1,0
|
|
||||||
# else
|
|
||||||
.machine push
|
.machine push
|
||||||
.machine "power6"
|
.machine "power6"
|
||||||
|
|
||||||
|
mtfsf 0xff,fp0,1,0
|
||||||
|
|
||||||
|
.machine pop
|
||||||
|
# else
|
||||||
/* Availability of DFP indicates a 64-bit FPSCR. */
|
/* Availability of DFP indicates a 64-bit FPSCR. */
|
||||||
andi. r6,r5,PPC_FEATURE_HAS_DFP
|
andi. r6,r5,PPC_FEATURE_HAS_DFP
|
||||||
beq 7f
|
beq 7f
|
||||||
/* Use the extended four-operand version of the mtfsf insn. */
|
/* Use the extended four-operand version of the mtfsf insn. */
|
||||||
|
.machine push
|
||||||
|
.machine "power6"
|
||||||
|
|
||||||
mtfsf 0xff,fp0,1,0
|
mtfsf 0xff,fp0,1,0
|
||||||
|
|
||||||
|
.machine pop
|
||||||
|
|
||||||
b 8f
|
b 8f
|
||||||
/* Continue to operate on the FPSCR as if it were 32-bits. */
|
/* Continue to operate on the FPSCR as if it were 32-bits. */
|
||||||
7:
|
7:
|
||||||
mtfsf 0xff,fp0
|
mtfsf 0xff,fp0
|
||||||
8:
|
8:
|
||||||
.machine pop
|
|
||||||
# endif /* _ARCH_PWR6 */
|
# endif /* _ARCH_PWR6 */
|
||||||
|
|
||||||
lfd fp29,(SIGCONTEXT_FP_REGS+(PT_R29*8))(r31)
|
lfd fp29,(SIGCONTEXT_FP_REGS+(PT_R29*8))(r31)
|
||||||
lfd fp28,(SIGCONTEXT_FP_REGS+(PT_R28*8))(r31)
|
lfd fp28,(SIGCONTEXT_FP_REGS+(PT_R28*8))(r31)
|
||||||
lfd fp27,(SIGCONTEXT_FP_REGS+(PT_R27*8))(r31)
|
lfd fp27,(SIGCONTEXT_FP_REGS+(PT_R27*8))(r31)
|
||||||
|
@ -173,24 +173,34 @@ ENTRY(__novec_swapcontext)
|
|||||||
lfd fp0,(SIGCONTEXT_FP_REGS+(32*8))(r31)
|
lfd fp0,(SIGCONTEXT_FP_REGS+(32*8))(r31)
|
||||||
lfd fp31,(SIGCONTEXT_FP_REGS+(PT_R31*8))(r31)
|
lfd fp31,(SIGCONTEXT_FP_REGS+(PT_R31*8))(r31)
|
||||||
lfd fp30,(SIGCONTEXT_FP_REGS+(PT_R30*8))(r31)
|
lfd fp30,(SIGCONTEXT_FP_REGS+(PT_R30*8))(r31)
|
||||||
|
|
||||||
# ifdef _ARCH_PWR6
|
# ifdef _ARCH_PWR6
|
||||||
/* Use the extended four-operand version of the mtfsf insn. */
|
/* Use the extended four-operand version of the mtfsf insn. */
|
||||||
mtfsf 0xff,fp0,1,0
|
|
||||||
# else
|
|
||||||
.machine push
|
.machine push
|
||||||
.machine "power6"
|
.machine "power6"
|
||||||
|
|
||||||
|
mtfsf 0xff,fp0,1,0
|
||||||
|
|
||||||
|
.machine pop
|
||||||
|
# else
|
||||||
/* Availability of DFP indicates a 64-bit FPSCR. */
|
/* Availability of DFP indicates a 64-bit FPSCR. */
|
||||||
andi. r6,r8,PPC_FEATURE_HAS_DFP
|
andi. r6,r8,PPC_FEATURE_HAS_DFP
|
||||||
beq 5f
|
beq 5f
|
||||||
/* Use the extended four-operand version of the mtfsf insn. */
|
|
||||||
|
.machine push
|
||||||
|
.machine "power6"
|
||||||
|
|
||||||
mtfsf 0xff,fp0,1,0
|
mtfsf 0xff,fp0,1,0
|
||||||
|
|
||||||
|
.machine pop
|
||||||
|
|
||||||
b 6f
|
b 6f
|
||||||
/* Continue to operate on the FPSCR as if it were 32-bits. */
|
/* Continue to operate on the FPSCR as if it were 32-bits. */
|
||||||
5:
|
5:
|
||||||
mtfsf 0xff,fp0
|
mtfsf 0xff,fp0
|
||||||
6:
|
6:
|
||||||
.machine pop
|
|
||||||
#endif /* _ARCH_PWR6 */
|
#endif /* _ARCH_PWR6 */
|
||||||
|
|
||||||
lfd fp29,(SIGCONTEXT_FP_REGS+(PT_R29*8))(r31)
|
lfd fp29,(SIGCONTEXT_FP_REGS+(PT_R29*8))(r31)
|
||||||
lfd fp28,(SIGCONTEXT_FP_REGS+(PT_R28*8))(r31)
|
lfd fp28,(SIGCONTEXT_FP_REGS+(PT_R28*8))(r31)
|
||||||
lfd fp27,(SIGCONTEXT_FP_REGS+(PT_R27*8))(r31)
|
lfd fp27,(SIGCONTEXT_FP_REGS+(PT_R27*8))(r31)
|
||||||
@ -652,24 +662,34 @@ L(has_no_vec2):
|
|||||||
lfd fp0,(SIGCONTEXT_FP_REGS+(32*8))(r31)
|
lfd fp0,(SIGCONTEXT_FP_REGS+(32*8))(r31)
|
||||||
lfd fp31,(SIGCONTEXT_FP_REGS+(PT_R31*8))(r31)
|
lfd fp31,(SIGCONTEXT_FP_REGS+(PT_R31*8))(r31)
|
||||||
lfd fp30,(SIGCONTEXT_FP_REGS+(PT_R30*8))(r31)
|
lfd fp30,(SIGCONTEXT_FP_REGS+(PT_R30*8))(r31)
|
||||||
|
|
||||||
# ifdef _ARCH_PWR6
|
# ifdef _ARCH_PWR6
|
||||||
/* Use the extended four-operand version of the mtfsf insn. */
|
/* Use the extended four-operand version of the mtfsf insn. */
|
||||||
mtfsf 0xff,fp0,1,0
|
|
||||||
# else
|
|
||||||
.machine push
|
.machine push
|
||||||
.machine "power6"
|
.machine "power6"
|
||||||
|
|
||||||
|
mtfsf 0xff,fp0,1,0
|
||||||
|
|
||||||
|
.machine pop
|
||||||
|
# else
|
||||||
/* Availability of DFP indicates a 64-bit FPSCR. */
|
/* Availability of DFP indicates a 64-bit FPSCR. */
|
||||||
andi. r6,r8,PPC_FEATURE_HAS_DFP
|
andi. r6,r8,PPC_FEATURE_HAS_DFP
|
||||||
beq 7f
|
beq 7f
|
||||||
/* Use the extended four-operand version of the mtfsf insn. */
|
|
||||||
|
.machine push
|
||||||
|
.machine "power6"
|
||||||
|
|
||||||
mtfsf 0xff,fp0,1,0
|
mtfsf 0xff,fp0,1,0
|
||||||
|
|
||||||
|
.machine pop
|
||||||
|
|
||||||
b 8f
|
b 8f
|
||||||
/* Continue to operate on the FPSCR as if it were 32-bits. */
|
/* Continue to operate on the FPSCR as if it were 32-bits. */
|
||||||
7:
|
7:
|
||||||
mtfsf 0xff,fp0
|
mtfsf 0xff,fp0
|
||||||
8:
|
8:
|
||||||
.machine pop
|
|
||||||
#endif /* _ARCH_PWR6 */
|
#endif /* _ARCH_PWR6 */
|
||||||
|
|
||||||
lfd fp29,(SIGCONTEXT_FP_REGS+(PT_R29*8))(r31)
|
lfd fp29,(SIGCONTEXT_FP_REGS+(PT_R29*8))(r31)
|
||||||
lfd fp28,(SIGCONTEXT_FP_REGS+(PT_R28*8))(r31)
|
lfd fp28,(SIGCONTEXT_FP_REGS+(PT_R28*8))(r31)
|
||||||
lfd fp27,(SIGCONTEXT_FP_REGS+(PT_R27*8))(r31)
|
lfd fp27,(SIGCONTEXT_FP_REGS+(PT_R27*8))(r31)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user