[PATCH 09/12] x86/aors_n.asm: Add X86_ENDBR to indirect jump targets
H.J. Lu
hjl.tools at gmail.com
Thu Jan 30 14:08:34 UTC 2020
x86/aors_n.asm uses a trick to implment jump tables with LEA. We can't
use conditional branches nor normal jump tables since jump table entries
use EFLAGS set by jump table index. This patch adds X86_ENDBR to indirect
jump targets and adjust destination for X86_ENDBR.
* mpn/x86/aors_n.asm: Save and restore %ebx if X86_ENDBR is
endbr32. Add X86_ENDBR to indirect jump targets and adjust
jump destination for X86_ENDBR.
---
mpn/x86/aors_n.asm | 32 ++++++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/mpn/x86/aors_n.asm b/mpn/x86/aors_n.asm
index 95d006a5a..94fa16ed8 100644
--- a/mpn/x86/aors_n.asm
+++ b/mpn/x86/aors_n.asm
@@ -80,6 +80,9 @@ deflit(`FRAME',0)
movl PARAM_SRC2,%edx
movl PARAM_SIZE,%ecx
+ifelse(X86_ENDBR,`endbr32',
+` pushl %ebx FRAME_pushl()')
+
movl %ecx,%eax
shrl $3,%ecx C compute count for unrolled loop
negl %eax
@@ -92,6 +95,10 @@ deflit(`FRAME',0)
subl %eax,%edx C ... enter the loop
shrl $2,%eax C restore previous value
+ C Count for 4-byte endbr32.
+ifelse(X86_ENDBR,`endbr32',
+` leal -4(,%eax,4),%ebx')
+
ifdef(`PIC',`
C Calculate start address in loop for PIC. Due to limitations in
C old gas, LF(M4_function_n,oop)-L(0a)-3 cannot be put into the leal
@@ -105,6 +112,10 @@ L(0a): leal (%eax,%eax,8),%eax
leal L(oop)-3(%eax,%eax,8),%eax
')
+ C Adjust for endbr32
+ifelse(X86_ENDBR,`endbr32',
+` addl %ebx,%eax')
+
C These lines initialize carry from the 5th parameter. Should be
C possible to simplify.
pushl %ebp FRAME_pushl()
@@ -129,6 +140,9 @@ deflit(`FRAME',0)
movl PARAM_SRC2,%edx
movl PARAM_SIZE,%ecx
+ifelse(X86_ENDBR,`endbr32',
+` pushl %ebx FRAME_pushl()')
+
movl %ecx,%eax
shrl $3,%ecx C compute count for unrolled loop
negl %eax
@@ -141,6 +155,10 @@ deflit(`FRAME',0)
subl %eax,%edx C ... enter the loop
shrl $2,%eax C restore previous value
+ C Count for 4-byte endbr32.
+ifelse(X86_ENDBR,`endbr32',
+` leal -4(,%eax,4),%ebx')
+
ifdef(`PIC',`
C Calculate start address in loop for PIC. Due to limitations in
C some assemblers, L(oop)-L(0b)-3 cannot be put into the leal
@@ -153,6 +171,10 @@ L(0b): leal (%eax,%eax,8),%eax
C Calculate start address in loop for non-PIC.
leal L(oop)-3(%eax,%eax,8),%eax
')
+ C Adjust for endbr32
+ifelse(X86_ENDBR,`endbr32',
+` addl %ebx,%eax')
+
jmp *%eax C jump into loop
L(oopgo):
@@ -165,24 +187,31 @@ L(oopgo):
L(oop): movl (%esi),%eax
M4_inst (%edx),%eax
movl %eax,(%edi)
+ X86_ENDBR
movl 4(%esi),%eax
M4_inst 4(%edx),%eax
movl %eax,4(%edi)
+ X86_ENDBR
movl 8(%esi),%eax
M4_inst 8(%edx),%eax
movl %eax,8(%edi)
+ X86_ENDBR
movl 12(%esi),%eax
M4_inst 12(%edx),%eax
movl %eax,12(%edi)
+ X86_ENDBR
movl 16(%esi),%eax
M4_inst 16(%edx),%eax
movl %eax,16(%edi)
+ X86_ENDBR
movl 20(%esi),%eax
M4_inst 20(%edx),%eax
movl %eax,20(%edi)
+ X86_ENDBR
movl 24(%esi),%eax
M4_inst 24(%edx),%eax
movl %eax,24(%edi)
+ X86_ENDBR
movl 28(%esi),%eax
M4_inst 28(%edx),%eax
movl %eax,28(%edi)
@@ -195,6 +224,9 @@ L(oop): movl (%esi),%eax
sbbl %eax,%eax
negl %eax
+ifelse(X86_ENDBR,`endbr32',
+` popl %ebx')
+
popl %esi
popl %edi
ret
--
2.24.1
More information about the gmp-devel
mailing list