Add Chromium-only Blender WebEngine parity work

This commit is contained in:
mes123456
2026-08-12 04:47:48 -04:00
commit 9fd26010f6
18225 changed files with 11622124 additions and 0 deletions

View File

@@ -0,0 +1,138 @@
Copyright 2001, 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU MP Library.
The GNU MP Library is free software; you can redistribute it and/or modify
it under the terms of either:
* the GNU Lesser General Public License as published by the Free
Software Foundation; either version 3 of the License, or (at your
option) any later version.
or
* the GNU General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option) any
later version.
or both in parallel, as here.
The GNU MP Library is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received copies of the GNU General Public License and the
GNU Lesser General Public License along with the GNU MP Library. If not,
see https://www.gnu.org/licenses/.
M68K MPN SUBROUTINES
This directory contains mpn functions for various m68k family chips.
CODE ORGANIZATION
m68k m68000, m68010, m68060
m68k/mc68020 m68020, m68030, m68040, and CPU32
The m5200 "coldfire", which is m68000 less a few instructions, currently has
no assembler code support.
STATUS
The code herein is old and poorly maintained. If somebody really cared, it
could be optimized substantially. For example,
* mpn_add_n and mpn_sub_n could, with more unrolling be improved from 6 to
close to 4 c/l (on m68040).
* The multiplication loops could be sped up by using the FPU.
* mpn_lshift by 31 should use the special-case mpn_rshift by 1 code, and
vice versa mpn_rshift by 31 use the special lshift by 1, when operand
overlap permits.
* On 68000, mpn_mul_1, mpn_addmul_1 and mpn_submul_1 could check for a
16-bit multiplier and use two multiplies per limb, not four.
Similarly various other _1 operations like mpn_mod_1, mpn_divrem_1,
mpn_divexact_1, mpn_modexact_1c_odd.
* On 68000, mpn_lshift and mpn_rshift could use a roll and mask instead of
lsrl and lsll. This promises to be a speedup, effectively trading a 6+2*n
shift for one or two 4 cycle masks. Suggested by Jean-Charles Meyrignac.
* config.guess detects 68000, 68010, CPU32 and 68020 by running some code,
but relies on system information for 030, 040 and 060. Can they be
identified by running some code? Currently this only makes a difference
to the compiler options selected, since we have no specific asm code for
those chips.
One novel idea for 68000 would be to use a 16-bit limb instead of 32-bits.
This would suit the native 16x16 multiply, but might make it difficult to
get full value from the native 32x32 add/sub/etc. This would be an ABI
option, and would select "__GMP_SHORT_LIMB" in gmp.h.
Naturally an entirely new set of asm subroutines would be needed for a
16-bit limb. Also there's various places in the C code assuming limb>=long,
which would need to be updated, eg. mpz_set_ui. Some of the nails changes
may have helped cover some of this.
ASM FILES
The .asm files are put through m4 for macro processing, and with the help of
configure give either MIT or Motorola syntax. The generic mpn/asm-defs.m4
is used, together with mpn/m68k/m68k-defs.m4. See comments in those files.
Not all possible syntax variations are covered. GCC config/m68k for
instance has things like $ for immediates on CRDS or reversed cmp order for
AT&T SGS. These could probably be handled if anyone really needs it.
CALLING CONVENTIONS
The SVR4 standard has an int of 32 bits, and all parameters 32-bit aligned
on the stack.
PalmOS and perhaps various embedded systems intended for 68000 however use
an int of 16 bits and parameters only 16-bit aligned on the stack. This is
generated by "gcc -mshort" (and is the default for the PalmOS gcc port, we
believe).
The asm files adapt to these two ABIs by checking sizeof(unsigned), coming
through config.m4 as SIZEOF_UNSIGNED. Only mpn_lshift and mpn_rshift are
affected, all other routines take longs and pointers, which are 32-bits in
both cases.
Strictly speaking the size of an int doesn't determine the stack padding
convention. But if int is 16 bits then we can definitely say the host
system is not SVR4, and therefore may as well assume we're in 16-bit stack
alignment.
REFERENCES
"Motorola M68000 Family Programmer's Reference Manual", available online,
http://e-www.motorola.com/brdata/PDFDB/docs/M68000PM.pdf
"System V Application Binary Interface: Motorola 68000 Processor Family
Supplement", AT&T, 1990, ISBN 0-13-877553-6. Has details of calling
conventions and ELF style PIC coding.
----------------
Local variables:
mode: text
fill-column: 76
End:

View File

@@ -0,0 +1,99 @@
dnl mc68020 mpn_add_n, mpn_sub_n -- add or subtract limb vectors
dnl Copyright 1992, 1994, 1996, 1999-2003, 2005 Free Software Foundation, Inc.
dnl This file is part of the GNU MP Library.
dnl
dnl The GNU MP Library is free software; you can redistribute it and/or modify
dnl it under the terms of either:
dnl
dnl * the GNU Lesser General Public License as published by the Free
dnl Software Foundation; either version 3 of the License, or (at your
dnl option) any later version.
dnl
dnl or
dnl
dnl * the GNU General Public License as published by the Free Software
dnl Foundation; either version 2 of the License, or (at your option) any
dnl later version.
dnl
dnl or both in parallel, as here.
dnl
dnl The GNU MP Library is distributed in the hope that it will be useful, but
dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
dnl for more details.
dnl
dnl You should have received copies of the GNU General Public License and the
dnl GNU Lesser General Public License along with the GNU MP Library. If not,
dnl see https://www.gnu.org/licenses/.
include(`../config.m4')
C cycles/limb
C 68040: 6
ifdef(`OPERATION_add_n',`
define(M4_inst, addxl)
define(M4_function_n, mpn_add_n)
',`ifdef(`OPERATION_sub_n',`
define(M4_inst, subxl)
define(M4_function_n, mpn_sub_n)
',
`m4_error(`Need OPERATION_add_n or OPERATION_sub_n
')')')
MULFUNC_PROLOGUE(mpn_add_n mpn_sub_n)
C INPUT PARAMETERS
C res_ptr (sp + 4)
C s1_ptr (sp + 8)
C s2_ptr (sp + 12)
C size (sp + 16)
PROLOGUE(M4_function_n)
C Save used registers on the stack.
movel d2, M(-,sp)
movel a2, M(-,sp)
C Copy the arguments to registers. Better use movem?
movel M(sp,12), a2
movel M(sp,16), a0
movel M(sp,20), a1
movel M(sp,24), d2
eorw #1, d2
lsrl #1, d2
bcc L(L1)
subql #1, d2 C clears cy as side effect
L(Loop):
movel M(a0,+), d0
movel M(a1,+), d1
M4_inst d1, d0
movel d0, M(a2,+)
L(L1): movel M(a0,+), d0
movel M(a1,+), d1
M4_inst d1, d0
movel d0, M(a2,+)
dbf d2, L(Loop) C loop until 16 lsb of %4 == -1
subxl d0, d0 C d0 <= -cy; save cy as 0 or -1 in d0
subl #0x10000, d2
bcs L(L2)
addl d0, d0 C restore cy
bra L(Loop)
L(L2):
negl d0
C Restore used registers from stack frame.
movel M(sp,+), a2
movel M(sp,+), d2
rts
EPILOGUE(M4_function_n)

View File

@@ -0,0 +1,76 @@
/* gmp-mparam.h -- Compiler/machine parameter header file.
Copyright 2000-2004 Free Software Foundation, Inc.
This file is part of the GNU MP Library.
The GNU MP Library is free software; you can redistribute it and/or modify
it under the terms of either:
* the GNU Lesser General Public License as published by the Free
Software Foundation; either version 3 of the License, or (at your
option) any later version.
or
* the GNU General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option) any
later version.
or both in parallel, as here.
The GNU MP Library is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received copies of the GNU General Public License and the
GNU Lesser General Public License along with the GNU MP Library. If not,
see https://www.gnu.org/licenses/. */
#define GMP_LIMB_BITS 32
#define GMP_LIMB_BYTES 4
/* 25MHz 68040 */
/* Generated by tuneup.c, 2004-02-05, gcc 3.2 */
#define MUL_TOOM22_THRESHOLD 14
#define MUL_TOOM33_THRESHOLD 90
#define SQR_BASECASE_THRESHOLD 5
#define SQR_TOOM2_THRESHOLD 28
#define SQR_TOOM3_THRESHOLD 98
#define DIV_SB_PREINV_THRESHOLD MP_SIZE_T_MAX /* never */
#define DIV_DC_THRESHOLD 55
#define POWM_THRESHOLD 65
#define HGCD_THRESHOLD 116
#define GCD_ACCEL_THRESHOLD 3
#define GCD_DC_THRESHOLD 590
#define JACOBI_BASE_METHOD 2
#define DIVREM_1_NORM_THRESHOLD MP_SIZE_T_MAX /* never */
#define DIVREM_1_UNNORM_THRESHOLD MP_SIZE_T_MAX /* never */
#define MOD_1_NORM_THRESHOLD MP_SIZE_T_MAX /* never */
#define MOD_1_UNNORM_THRESHOLD MP_SIZE_T_MAX /* never */
#define USE_PREINV_DIVREM_1 0
#define USE_PREINV_MOD_1 0
#define DIVREM_2_THRESHOLD MP_SIZE_T_MAX /* never */
#define DIVEXACT_1_THRESHOLD MP_SIZE_T_MAX /* never */
#define MODEXACT_1_ODD_THRESHOLD MP_SIZE_T_MAX /* never */
#define GET_STR_DC_THRESHOLD 18
#define GET_STR_PRECOMPUTE_THRESHOLD 43
#define SET_STR_THRESHOLD 937
#define MUL_FFT_TABLE { 336, 672, 1408, 3584, 10240, 24576, 0 }
#define MUL_FFT_MODF_THRESHOLD 296
#define MUL_FFT_THRESHOLD 1728
#define SQR_FFT_TABLE { 336, 736, 1408, 3584, 10240, 24576, 0 }
#define SQR_FFT_MODF_THRESHOLD 296
#define SQR_FFT_THRESHOLD 2304

View File

@@ -0,0 +1,175 @@
dnl mc68020 mpn_lshift -- mpn left shift.
dnl Copyright 1996, 1999-2003 Free Software Foundation, Inc.
dnl This file is part of the GNU MP Library.
dnl
dnl The GNU MP Library is free software; you can redistribute it and/or modify
dnl it under the terms of either:
dnl
dnl * the GNU Lesser General Public License as published by the Free
dnl Software Foundation; either version 3 of the License, or (at your
dnl option) any later version.
dnl
dnl or
dnl
dnl * the GNU General Public License as published by the Free Software
dnl Foundation; either version 2 of the License, or (at your option) any
dnl later version.
dnl
dnl or both in parallel, as here.
dnl
dnl The GNU MP Library is distributed in the hope that it will be useful, but
dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
dnl for more details.
dnl
dnl You should have received copies of the GNU General Public License and the
dnl GNU Lesser General Public License along with the GNU MP Library. If not,
dnl see https://www.gnu.org/licenses/.
include(`../config.m4')
C cycles/limb
C shift==1 shift>1
C 68040: 5 12
C mp_limb_t mpn_lshift (mp_ptr res_ptr, mp_srcptr s_ptr, mp_size_t s_size,
C unsigned cnt);
C
C The "cnt" parameter is either 16 bits or 32 bits depending on
C SIZEOF_UNSIGNED (see ABI notes in mpn/m68k/README). The value is of
C course only 1 to 31. When loaded as 16 bits there's garbage in the upper
C half, hence the use of cmpw. The shift instructions take the their count
C modulo 64, so the upper part doesn't matter to them either.
C
C INPUT PARAMETERS
C res_ptr (sp + 4)
C s_ptr (sp + 8)
C s_size (sp + 12)
C cnt (sp + 16)
define(res_ptr, `a1')
define(s_ptr, `a0')
define(s_size, `d6')
define(cnt, `d4')
ifdef(`SIZEOF_UNSIGNED',,
`m4_error(`SIZEOF_UNSIGNED not defined, should be in config.m4
')')
PROLOGUE(mpn_lshift)
C Save used registers on the stack.
moveml d2-d6/a2, M(-,sp)
C Copy the arguments to registers.
movel M(sp,28), res_ptr
movel M(sp,32), s_ptr
movel M(sp,36), s_size
ifelse(SIZEOF_UNSIGNED,2,
` movew M(sp,40), cnt',
` movel M(sp,40), cnt')
moveql #1, d5
cmpw d5, cnt
bne L(Lnormal)
cmpl s_ptr, res_ptr
bls L(Lspecial) C jump if s_ptr >= res_ptr
ifelse(scale_available_p,1,`
lea M(s_ptr,s_size,l,4), a2
',`
movel s_size, d0
asll #2, d0
lea M(s_ptr,d0,l), a2
')
cmpl res_ptr, a2
bls L(Lspecial) C jump if res_ptr >= s_ptr + s_size
L(Lnormal):
moveql #32, d5
subl cnt, d5
ifelse(scale_available_p,1,`
lea M(s_ptr,s_size,l,4), s_ptr
lea M(res_ptr,s_size,l,4), res_ptr
',`
movel s_size, d0
asll #2, d0
addl d0, s_ptr
addl d0, res_ptr
')
movel M(-,s_ptr), d2
movel d2, d0
lsrl d5, d0 C compute carry limb
lsll cnt, d2
movel d2, d1
subql #1, s_size
beq L(Lend)
lsrl #1, s_size
bcs L(L1)
subql #1, s_size
L(Loop):
movel M(-,s_ptr), d2
movel d2, d3
lsrl d5, d3
orl d3, d1
movel d1, M(-,res_ptr)
lsll cnt, d2
L(L1):
movel M(-,s_ptr), d1
movel d1, d3
lsrl d5, d3
orl d3, d2
movel d2, M(-,res_ptr)
lsll cnt, d1
dbf s_size, L(Loop)
subl #0x10000, s_size
bcc L(Loop)
L(Lend):
movel d1, M(-,res_ptr) C store least significant limb
C Restore used registers from stack frame.
moveml M(sp,+), d2-d6/a2
rts
C We loop from least significant end of the arrays, which is only
C permissable if the source and destination don't overlap, since the
C function is documented to work for overlapping source and destination.
L(Lspecial):
clrl d0 C initialize carry
eorw #1, s_size
lsrl #1, s_size
bcc L(LL1)
subql #1, s_size
L(LLoop):
movel M(s_ptr,+), d2
addxl d2, d2
movel d2, M(res_ptr,+)
L(LL1):
movel M(s_ptr,+), d2
addxl d2, d2
movel d2, M(res_ptr,+)
dbf s_size, L(LLoop)
addxl d0, d0 C save cy in lsb
subl #0x10000, s_size
bcs L(LLend)
lsrl #1, d0 C restore cy
bra L(LLoop)
L(LLend):
C Restore used registers from stack frame.
moveml M(sp,+), d2-d6/a2
rts
EPILOGUE(mpn_lshift)

View File

@@ -0,0 +1,230 @@
divert(-1)
dnl m4 macros for 68k assembler.
dnl Copyright 2001-2003 Free Software Foundation, Inc.
dnl This file is part of the GNU MP Library.
dnl
dnl The GNU MP Library is free software; you can redistribute it and/or modify
dnl it under the terms of either:
dnl
dnl * the GNU Lesser General Public License as published by the Free
dnl Software Foundation; either version 3 of the License, or (at your
dnl option) any later version.
dnl
dnl or
dnl
dnl * the GNU General Public License as published by the Free Software
dnl Foundation; either version 2 of the License, or (at your option) any
dnl later version.
dnl
dnl or both in parallel, as here.
dnl
dnl The GNU MP Library is distributed in the hope that it will be useful, but
dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
dnl for more details.
dnl
dnl You should have received copies of the GNU General Public License and the
dnl GNU Lesser General Public License along with the GNU MP Library. If not,
dnl see https://www.gnu.org/licenses/.
dnl The default m4 `#' commenting interferes with the assembler syntax for
dnl immediates. `|' would be correct, but it interferes with "||" in
dnl eval(). Would like to disable commenting, but that's not possible (see
dnl mpn/asm-defs.m4), so use `;' which should be harmless.
changecom(;)
dnl Called: PROLOGUE_cpu(GSYM_PREFIX`'foo)
dnl
dnl Same as the standard PROLOGUE, but align to 2 bytes not 4.
define(`PROLOGUE_cpu',
m4_assert_numargs(1)
` TEXT
ALIGN(2)
GLOBL `$1' GLOBL_ATTR
TYPE(`$1',`function')
`$1'LABEL_SUFFIX')
dnl Usage: d0, etc
dnl
dnl Expand to d0 or %d0 according to the assembler's requirements.
dnl
dnl Actually d0 expands to `d0' or %`d0', the quotes protecting against
dnl further expansion. Definitions are made even if d0 is to be just `d0',
dnl so that any m4 quoting problems will show up everywhere, not just on a
dnl %d0 system.
dnl
dnl Care must be taken with quoting when using these in a definition. For
dnl instance the quotes in the following are essential or two %'s will be
dnl produced when `counter' is used.
dnl
dnl define(counter, `d7')
dnl
dnl Called: m68k_reg(r)
define(m68k_reg,
m4_assert_numargs(1)
m4_assert_defined(`WANT_REGISTER_PERCENT')
`ifelse(WANT_REGISTER_PERCENT,yes,%)`$1'')
dnl Usage: m68k_defreg(r)
define(m68k_defreg,
m4_assert_numargs(1)
`deflit($1,`m68k_reg(`$1')')')
m68k_defreg(d0)
m68k_defreg(d1)
m68k_defreg(d2)
m68k_defreg(d3)
m68k_defreg(d4)
m68k_defreg(d5)
m68k_defreg(d6)
m68k_defreg(d7)
m68k_defreg(a0)
m68k_defreg(a1)
m68k_defreg(a2)
m68k_defreg(a3)
m68k_defreg(a4)
m68k_defreg(a5)
m68k_defreg(a6)
m68k_defreg(a7)
m68k_defreg(sp)
m68k_defreg(pc)
dnl Usage: M(base)
dnl M(base,displacement)
dnl M(base,index,size)
dnl M(base,index,size,scale)
dnl M(base,+)
dnl M(-,base)
dnl
dnl `base' is an address register, `index' is a data register, `size' is w
dnl or l, and scale is 1, 2, 4 or 8.
dnl
dnl M(-,base) has it's arguments that way around to emphasise it's a
dnl pre-decrement, as opposed to M(base,+) a post-increment.
dnl
dnl Enhancement: Add the memory indirect modes, if/when they're needed.
define(M,
m4_assert_numargs_range(1,4)
m4_assert_defined(`WANT_ADDRESSING')
`ifelse(WANT_ADDRESSING,mit,
`ifelse($#,1, ``$1'@')dnl
ifelse($#,2,
`ifelse($2,+, ``$1'@+',
`ifelse($1,-, ``$2'@-',
``$1'@($2)')')')dnl
ifelse($#,3, ``$1'@(`$2':`$3')')dnl
ifelse($#,4, ``$1'@(`$2':`$3':$4)')',
dnl WANT_ADDRESSING `motorola'
`ifelse($#,1, `(`$1')')dnl
ifelse($#,2,
`ifelse($2,+, `(`$1')+',
`ifelse($1,-, `-(`$2')',
`$2(`$1')')')')dnl
ifelse($#,3, `(`$1',`$2'.$3)')dnl
ifelse($#,4, `(`$1',`$2'.$3*$4)')')')
dnl Usage: addl etc
dnl
dnl m68k instructions with special handling for the suffix, with for
dnl instance addl expanding to addl or add.l as necessary.
dnl
dnl See also t-m68k-defs.pl which verifies all mnemonics used in the asm
dnl files have entries here.
dnl Called: m68k_insn(mnemonic,suffix)
define(m68k_insn,
m4_assert_numargs(2)
m4_assert_defined(`WANT_DOT_SIZE')
`ifelse(WANT_DOT_SIZE,yes, ``$1'.``$2''',
``$1$2'')')
dnl Usage: m68k_definsn(mnemonic,suffix)
define(m68k_definsn,
m4_assert_numargs(2)
`deflit($1`'$2,`m68k_insn(`$1',`$2')')')
m68k_definsn(add, l)
m68k_definsn(addx, l)
m68k_definsn(addq, l)
m68k_definsn(asl, l)
m68k_definsn(cmp, l)
m68k_definsn(cmp, w)
m68k_definsn(clr, l)
m68k_definsn(divu, l)
m68k_definsn(eor, w)
m68k_definsn(lsl, l)
m68k_definsn(lsr, l)
m68k_definsn(move, l)
m68k_definsn(move, w)
m68k_definsn(movem,l)
m68k_definsn(moveq,l)
m68k_definsn(mulu, l)
m68k_definsn(neg, l)
m68k_definsn(or, l)
m68k_definsn(roxl, l)
m68k_definsn(roxr, l)
m68k_definsn(sub, l)
m68k_definsn(subx, l)
m68k_definsn(subq, l)
dnl Usage: bra etc
dnl
dnl Expand to `bra', `jra' or `jbra' according to what the assembler will
dnl accept. The latter two give variable-sized branches in gas.
dnl
dnl See also t-m68k-defs.pl which verifies all the bXX branches used in the
dnl asm files have entries here.
dnl Called: m68k_branch(cond)
define(m68k_branch,
m4_assert_numargs(1)
m4_assert_defined(`WANT_BRANCHES')
`ifelse(WANT_BRANCHES,jra, `j$1',
`ifelse(WANT_BRANCHES,jbra,`jb$1',
``b$1'')')')
dnl Called: m68k_defbranch(cond)
define(m68k_defbranch,
m4_assert_numargs(1)
`deflit(b$1,`m68k_branch(`$1')')')
m68k_defbranch(ra)
m68k_defbranch(cc)
m68k_defbranch(cs)
m68k_defbranch(ls)
m68k_defbranch(eq)
m68k_defbranch(ne)
dnl Usage: scale_available_p
dnl
dnl Expand to 1 if a scale factor can be used in addressing modes, or 0 if
dnl not. M(a0,d0,l,4), meaning a0+d0*4, is not available in 68000 or
dnl 68010, but is in CPU32 and in 68020 and up.
define(scale_available_p,
`m4_ifdef_anyof_p(
`HAVE_HOST_CPU_m68360'
`HAVE_HOST_CPU_m68020'
`HAVE_HOST_CPU_m68030'
`HAVE_HOST_CPU_m68040'
`HAVE_HOST_CPU_m68060')')
divert

View File

@@ -0,0 +1,101 @@
dnl mc68020 mpn_addmul_1, mpn_submul_1 -- add or subtract mpn multiple.
dnl Copyright 1992, 1994, 1996, 1999-2002, 2011 Free Software Foundation, Inc.
dnl This file is part of the GNU MP Library.
dnl
dnl The GNU MP Library is free software; you can redistribute it and/or modify
dnl it under the terms of either:
dnl
dnl * the GNU Lesser General Public License as published by the Free
dnl Software Foundation; either version 3 of the License, or (at your
dnl option) any later version.
dnl
dnl or
dnl
dnl * the GNU General Public License as published by the Free Software
dnl Foundation; either version 2 of the License, or (at your option) any
dnl later version.
dnl
dnl or both in parallel, as here.
dnl
dnl The GNU MP Library is distributed in the hope that it will be useful, but
dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
dnl for more details.
dnl
dnl You should have received copies of the GNU General Public License and the
dnl GNU Lesser General Public License along with the GNU MP Library. If not,
dnl see https://www.gnu.org/licenses/.
include(`../config.m4')
C cycles/limb
C 68040: 25
ifdef(`OPERATION_addmul_1',`
define(M4_inst, addl)
define(M4_function_1, mpn_addmul_1)
',`ifdef(`OPERATION_submul_1',`
define(M4_inst, subl)
define(M4_function_1, mpn_submul_1)
',
`m4_error(`Need OPERATION_addmul_1 or OPERATION_submul_1
')')')
C INPUT PARAMETERS
C res_ptr (sp + 4)
C s1_ptr (sp + 8)
C s1_size (sp + 12)
C s2_limb (sp + 16)
define(res_ptr, `a0')
define(s1_ptr, `a1')
define(s1_size, `d2')
define(s2_limb, `d4')
MULFUNC_PROLOGUE(mpn_addmul_1 mpn_submul_1)
PROLOGUE(M4_function_1)
C Save used registers on the stack.
moveml d2-d5, M(-,sp)
C Copy the arguments to registers. Better use movem?
movel M(sp,20), res_ptr
movel M(sp,24), s1_ptr
movel M(sp,28), s1_size
movel M(sp,32), s2_limb
eorw #1, s1_size
clrl d1
clrl d5
lsrl #1, s1_size
bcc L(L1)
subql #1, s1_size
subl d0, d0 C (d0,cy) <= (0,0)
L(Loop):
movel M(s1_ptr,+), d3
mulul s2_limb, d1:d3
addxl d0, d3
addxl d5, d1
M4_inst d3, M(res_ptr,+)
L(L1): movel M(s1_ptr,+), d3
mulul s2_limb, d0:d3
addxl d1, d3
addxl d5, d0
M4_inst d3, M(res_ptr,+)
dbf s1_size, L(Loop)
addxl d5, d0
subl #0x10000, s1_size
bcc L(Loop)
C Restore used registers from stack frame.
moveml M(sp,+), d2-d5
rts
EPILOGUE(M4_function_1)

View File

@@ -0,0 +1,96 @@
dnl mc68020 mpn_mul_1 -- mpn by limb multiply
dnl Copyright 1992, 1994, 1996, 1999-2002 Free Software Foundation, Inc.
dnl This file is part of the GNU MP Library.
dnl
dnl The GNU MP Library is free software; you can redistribute it and/or modify
dnl it under the terms of either:
dnl
dnl * the GNU Lesser General Public License as published by the Free
dnl Software Foundation; either version 3 of the License, or (at your
dnl option) any later version.
dnl
dnl or
dnl
dnl * the GNU General Public License as published by the Free Software
dnl Foundation; either version 2 of the License, or (at your option) any
dnl later version.
dnl
dnl or both in parallel, as here.
dnl
dnl The GNU MP Library is distributed in the hope that it will be useful, but
dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
dnl for more details.
dnl
dnl You should have received copies of the GNU General Public License and the
dnl GNU Lesser General Public License along with the GNU MP Library. If not,
dnl see https://www.gnu.org/licenses/.
include(`../config.m4')
C cycles/limb
C 68040: 24
C INPUT PARAMETERS
C res_ptr (sp + 4)
C s1_ptr (sp + 8)
C s1_size (sp + 12)
C s2_limb (sp + 16)
define(res_ptr, `a0')
define(s1_ptr, `a1')
define(s1_size, `d2')
define(s2_limb, `d4')
PROLOGUE(mpn_mul_1)
C Save used registers on the stack.
moveml d2-d4, M(-,sp)
C movel d2, M(-,sp)
C movel d3, M(-,sp)
C movel d4, M(-,sp)
C Copy the arguments to registers. Better use movem?
movel M(sp,16), res_ptr
movel M(sp,20), s1_ptr
movel M(sp,24), s1_size
movel M(sp,28), s2_limb
eorw #1, s1_size
clrl d1
lsrl #1, s1_size
bcc L(L1)
subql #1, s1_size
subl d0, d0 C (d0,cy) <= (0,0)
L(Loop):
movel M(s1_ptr,+), d3
mulul s2_limb, d1:d3
addxl d0, d3
movel d3, M(res_ptr,+)
L(L1): movel M(s1_ptr,+), d3
mulul s2_limb, d0:d3
addxl d1, d3
movel d3, M(res_ptr,+)
dbf s1_size, L(Loop)
clrl d3
addxl d3, d0
subl #0x10000, s1_size
bcc L(Loop)
C Restore used registers from stack frame.
moveml M(sp,+), d2-d4
C movel M(sp,+),d4
C movel M(sp,+),d3
C movel M(sp,+),d2
rts
EPILOGUE(mpn_mul_1)

View File

@@ -0,0 +1,45 @@
dnl mc68020 mpn_udiv_qrnnd -- 2x1 limb division
dnl Copyright 1999-2001 Free Software Foundation, Inc.
dnl This file is part of the GNU MP Library.
dnl
dnl The GNU MP Library is free software; you can redistribute it and/or modify
dnl it under the terms of either:
dnl
dnl * the GNU Lesser General Public License as published by the Free
dnl Software Foundation; either version 3 of the License, or (at your
dnl option) any later version.
dnl
dnl or
dnl
dnl * the GNU General Public License as published by the Free Software
dnl Foundation; either version 2 of the License, or (at your option) any
dnl later version.
dnl
dnl or both in parallel, as here.
dnl
dnl The GNU MP Library is distributed in the hope that it will be useful, but
dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
dnl for more details.
dnl
dnl You should have received copies of the GNU General Public License and the
dnl GNU Lesser General Public License along with the GNU MP Library. If not,
dnl see https://www.gnu.org/licenses/.
include(`../config.m4')
C mp_limb_t mpn_udiv_qrnnd (mp_limb_t *rp,
C mp_limb_t nh, mp_limb_t nl, mp_limb_t d);
C
PROLOGUE(mpn_udiv_qrnnd)
movel M(sp,4), a0 C rp
movel M(sp,8), d1 C nh
movel M(sp,12), d0 C nl
divul M(sp,16), d1:d0
movel d1, M(a0) C r
rts
EPILOGUE(mpn_udiv_qrnnd)

View File

@@ -0,0 +1,44 @@
dnl mc68020 mpn_umul_ppmm -- limb by limb multiplication
dnl Copyright 1999-2001 Free Software Foundation, Inc.
dnl This file is part of the GNU MP Library.
dnl
dnl The GNU MP Library is free software; you can redistribute it and/or modify
dnl it under the terms of either:
dnl
dnl * the GNU Lesser General Public License as published by the Free
dnl Software Foundation; either version 3 of the License, or (at your
dnl option) any later version.
dnl
dnl or
dnl
dnl * the GNU General Public License as published by the Free Software
dnl Foundation; either version 2 of the License, or (at your option) any
dnl later version.
dnl
dnl or both in parallel, as here.
dnl
dnl The GNU MP Library is distributed in the hope that it will be useful, but
dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
dnl for more details.
dnl
dnl You should have received copies of the GNU General Public License and the
dnl GNU Lesser General Public License along with the GNU MP Library. If not,
dnl see https://www.gnu.org/licenses/.
include(`../config.m4')
C mp_limb_t mpn_umul_ppmm (mp_limb_t *lp, mp_limb_t x, mp_limb_t y);
C
PROLOGUE(mpn_umul_ppmm)
movel M(sp,4), a0 C lp
movel M(sp,8), d1 C x
movel M(sp,12), d0 C y
mulul d0, d0:d1
movel d1, M(a0) C low
rts
EPILOGUE(mpn_umul_ppmm)

View File

@@ -0,0 +1,175 @@
dnl mc68020 mpn_rshift -- mpn right shift.
dnl Copyright 1996, 1999-2003 Free Software Foundation, Inc.
dnl This file is part of the GNU MP Library.
dnl
dnl The GNU MP Library is free software; you can redistribute it and/or modify
dnl it under the terms of either:
dnl
dnl * the GNU Lesser General Public License as published by the Free
dnl Software Foundation; either version 3 of the License, or (at your
dnl option) any later version.
dnl
dnl or
dnl
dnl * the GNU General Public License as published by the Free Software
dnl Foundation; either version 2 of the License, or (at your option) any
dnl later version.
dnl
dnl or both in parallel, as here.
dnl
dnl The GNU MP Library is distributed in the hope that it will be useful, but
dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
dnl for more details.
dnl
dnl You should have received copies of the GNU General Public License and the
dnl GNU Lesser General Public License along with the GNU MP Library. If not,
dnl see https://www.gnu.org/licenses/.
include(`../config.m4')
C cycles/limb
C shift==1 shift>1
C 68040: 9 12
C mp_limb_t mpn_rshift (mp_ptr res_ptr, mp_srcptr s_ptr, mp_size_t s_size,
C unsigned cnt);
C
C The "cnt" parameter is either 16 bits or 32 bits depending on
C SIZEOF_UNSIGNED (see ABI notes in mpn/m68k/README). The value is of
C course only 1 to 31. When loaded as 16 bits there's garbage in the upper
C half, hence the use of cmpw. The shift instructions take the their count
C modulo 64, so the upper part doesn't matter to them either.
C
C INPUT PARAMETERS
C res_ptr (sp + 4)
C s_ptr (sp + 8)
C s_size (sp + 12)
C cnt (sp + 16)
define(res_ptr, `a1')
define(s_ptr, `a0')
define(s_size, `d6')
define(cnt, `d4')
ifdef(`SIZEOF_UNSIGNED',,
`m4_error(`SIZEOF_UNSIGNED not defined, should be in config.m4
')')
PROLOGUE(mpn_rshift)
C Save used registers on the stack.
moveml d2-d6/a2, M(-,sp)
C Copy the arguments to registers.
movel M(sp,28), res_ptr
movel M(sp,32), s_ptr
movel M(sp,36), s_size
ifelse(SIZEOF_UNSIGNED,2,
` movew M(sp,40), cnt',
` movel M(sp,40), cnt')
moveql #1, d5
cmpw d5, cnt
bne L(Lnormal)
cmpl res_ptr, s_ptr
bls L(Lspecial) C jump if res_ptr >= s_ptr
ifelse(scale_available_p,1,`
lea M(res_ptr,s_size,l,4), a2
',`
movel s_size, d0
asll #2, d0
lea M(res_ptr,d0,l), a2
')
cmpl s_ptr, a2
bls L(Lspecial) C jump if s_ptr >= res_ptr + s_size
L(Lnormal):
moveql #32, d5
subl cnt, d5
movel M(s_ptr,+), d2
movel d2, d0
lsll d5, d0 C compute carry limb
lsrl cnt, d2
movel d2, d1
subql #1, s_size
beq L(Lend)
lsrl #1, s_size
bcs L(L1)
subql #1, s_size
L(Loop):
movel M(s_ptr,+), d2
movel d2, d3
lsll d5, d3
orl d3, d1
movel d1, M(res_ptr,+)
lsrl cnt, d2
L(L1):
movel M(s_ptr,+), d1
movel d1, d3
lsll d5, d3
orl d3, d2
movel d2, M(res_ptr,+)
lsrl cnt, d1
dbf s_size, L(Loop)
subl #0x10000, s_size
bcc L(Loop)
L(Lend):
movel d1, M(res_ptr) C store most significant limb
C Restore used registers from stack frame.
moveml M(sp,+), d2-d6/a2
rts
C We loop from most significant end of the arrays, which is only permissable
C if the source and destination don't overlap, since the function is
C documented to work for overlapping source and destination.
L(Lspecial):
ifelse(scale_available_p,1,`
lea M(s_ptr,s_size,l,4), s_ptr
lea M(res_ptr,s_size,l,4), res_ptr
',`
movel s_size, d0
asll #2, d0
addl d0, s_ptr
addl d0, res_ptr
')
clrl d0 C initialize carry
eorw #1, s_size
lsrl #1, s_size
bcc L(LL1)
subql #1, s_size
L(LLoop):
movel M(-,s_ptr), d2
roxrl #1, d2
movel d2, M(-,res_ptr)
L(LL1):
movel M(-,s_ptr), d2
roxrl #1, d2
movel d2, M(-,res_ptr)
dbf s_size, L(LLoop)
roxrl #1, d0 C save cy in msb
subl #0x10000, s_size
bcs L(LLend)
addl d0, d0 C restore cy
bra L(LLoop)
L(LLend):
C Restore used registers from stack frame.
moveml M(sp,+), d2-d6/a2
rts
EPILOGUE(mpn_rshift)

View File

@@ -0,0 +1,91 @@
#! /usr/bin/perl -w
# Copyright 2001, 2003 Free Software Foundation, Inc.
#
# This file is part of the GNU MP Library.
#
# The GNU MP Library is free software; you can redistribute it and/or modify
# it under the terms of either:
#
# * the GNU Lesser General Public License as published by the Free
# Software Foundation; either version 3 of the License, or (at your
# option) any later version.
#
# or
#
# * the GNU General Public License as published by the Free Software
# Foundation; either version 2 of the License, or (at your option) any
# later version.
#
# or both in parallel, as here.
#
# The GNU MP Library is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# for more details.
#
# You should have received copies of the GNU General Public License and the
# GNU Lesser General Public License along with the GNU MP Library. If not,
# see https://www.gnu.org/licenses/.
# Usage: perl t-m68k-defs.pl [-t]
#
# Run this in the mpn/m68k source directory to check that m68k-defs.m4 has
# m68k_defbranch()s or m68k_definsn()s for each instruction used in *.asm
# and */*.asm. Print nothing if everything is ok. The -t option prints
# some diagnostic traces.
use strict;
use Getopt::Std;
my %opt;
getopts('t', \%opt);
my %branch;
my %insn;
open(FD, "<m68k-defs.m4")
or die "Cannot open m68k-defs.m4: $!\nIs this the mpn/m68k source directory?\n";
my ($srcdir, $top_srcdir);
while (<FD>) {
if (/^m68k_defbranch\(\s*(.*)\)/) { $branch{"b".$1} = 1; }
if (/^m68k_definsn\(\s*(.*),\s*(.*)\)/) { $insn{$1.$2} = 1; }
}
close(FD);
print "branches: ", join(" ",keys(%branch)), "\n" if $opt{'t'};
print "insns: ", join(" ",keys(%insn)), "\n" if $opt{'t'};
foreach my $file (glob("*.asm"), glob("*/*.asm")) {
print "file $file\n" if $opt{'t'};
open(FD, "<$file") or die "Cannot open $file: $!";
while (<FD>) {
if (/^[ \t]*C/) { next; };
if (/^\t([a-z0-9]+)/) {
my $opcode = $1;
print "opcode $1\n" if $opt{'t'};
# instructions with an l, w or b suffix should have a definsn
# (unless they're already a defbranch)
if ($opcode =~ /[lwb]$/
&& ! defined $insn{$opcode}
&& ! defined $branch{$opcode})
{
print "$file: $.: missing m68k_definsn: $opcode\n";
}
# instructions bXX should have a defbranch (unless they're
# already a definsn)
if ($opcode =~ /^b/
&& ! defined $insn{$opcode}
&& ! defined $branch{$opcode})
{
print "$file: $.: missing m68k_defbranch: $opcode\n";
}
}
}
close(FD);
}