162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#include <linux/kernel.h> 362306a36Sopenharmony_ci#include <linux/sched.h> 462306a36Sopenharmony_ci#include <linux/types.h> 562306a36Sopenharmony_ci#include <asm/byteorder.h> 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ 862306a36Sopenharmony_ci __asm__ ("addcc %r4,%5,%1\n\t" \ 962306a36Sopenharmony_ci "addx %r2,%3,%0\n" \ 1062306a36Sopenharmony_ci : "=r" (sh), \ 1162306a36Sopenharmony_ci "=&r" (sl) \ 1262306a36Sopenharmony_ci : "%rJ" ((USItype)(ah)), \ 1362306a36Sopenharmony_ci "rI" ((USItype)(bh)), \ 1462306a36Sopenharmony_ci "%rJ" ((USItype)(al)), \ 1562306a36Sopenharmony_ci "rI" ((USItype)(bl)) \ 1662306a36Sopenharmony_ci : "cc") 1762306a36Sopenharmony_ci#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ 1862306a36Sopenharmony_ci __asm__ ("subcc %r4,%5,%1\n\t" \ 1962306a36Sopenharmony_ci "subx %r2,%3,%0\n" \ 2062306a36Sopenharmony_ci : "=r" (sh), \ 2162306a36Sopenharmony_ci "=&r" (sl) \ 2262306a36Sopenharmony_ci : "rJ" ((USItype)(ah)), \ 2362306a36Sopenharmony_ci "rI" ((USItype)(bh)), \ 2462306a36Sopenharmony_ci "rJ" ((USItype)(al)), \ 2562306a36Sopenharmony_ci "rI" ((USItype)(bl)) \ 2662306a36Sopenharmony_ci : "cc") 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci#define umul_ppmm(w1, w0, u, v) \ 2962306a36Sopenharmony_ci __asm__ ("! Inlined umul_ppmm\n\t" \ 3062306a36Sopenharmony_ci "wr %%g0,%2,%%y ! SPARC has 0-3 delay insn after a wr\n\t" \ 3162306a36Sopenharmony_ci "sra %3,31,%%g2 ! Don't move this insn\n\t" \ 3262306a36Sopenharmony_ci "and %2,%%g2,%%g2 ! Don't move this insn\n\t" \ 3362306a36Sopenharmony_ci "andcc %%g0,0,%%g1 ! Don't move this insn\n\t" \ 3462306a36Sopenharmony_ci "mulscc %%g1,%3,%%g1\n\t" \ 3562306a36Sopenharmony_ci "mulscc %%g1,%3,%%g1\n\t" \ 3662306a36Sopenharmony_ci "mulscc %%g1,%3,%%g1\n\t" \ 3762306a36Sopenharmony_ci "mulscc %%g1,%3,%%g1\n\t" \ 3862306a36Sopenharmony_ci "mulscc %%g1,%3,%%g1\n\t" \ 3962306a36Sopenharmony_ci "mulscc %%g1,%3,%%g1\n\t" \ 4062306a36Sopenharmony_ci "mulscc %%g1,%3,%%g1\n\t" \ 4162306a36Sopenharmony_ci "mulscc %%g1,%3,%%g1\n\t" \ 4262306a36Sopenharmony_ci "mulscc %%g1,%3,%%g1\n\t" \ 4362306a36Sopenharmony_ci "mulscc %%g1,%3,%%g1\n\t" \ 4462306a36Sopenharmony_ci "mulscc %%g1,%3,%%g1\n\t" \ 4562306a36Sopenharmony_ci "mulscc %%g1,%3,%%g1\n\t" \ 4662306a36Sopenharmony_ci "mulscc %%g1,%3,%%g1\n\t" \ 4762306a36Sopenharmony_ci "mulscc %%g1,%3,%%g1\n\t" \ 4862306a36Sopenharmony_ci "mulscc %%g1,%3,%%g1\n\t" \ 4962306a36Sopenharmony_ci "mulscc %%g1,%3,%%g1\n\t" \ 5062306a36Sopenharmony_ci "mulscc %%g1,%3,%%g1\n\t" \ 5162306a36Sopenharmony_ci "mulscc %%g1,%3,%%g1\n\t" \ 5262306a36Sopenharmony_ci "mulscc %%g1,%3,%%g1\n\t" \ 5362306a36Sopenharmony_ci "mulscc %%g1,%3,%%g1\n\t" \ 5462306a36Sopenharmony_ci "mulscc %%g1,%3,%%g1\n\t" \ 5562306a36Sopenharmony_ci "mulscc %%g1,%3,%%g1\n\t" \ 5662306a36Sopenharmony_ci "mulscc %%g1,%3,%%g1\n\t" \ 5762306a36Sopenharmony_ci "mulscc %%g1,%3,%%g1\n\t" \ 5862306a36Sopenharmony_ci "mulscc %%g1,%3,%%g1\n\t" \ 5962306a36Sopenharmony_ci "mulscc %%g1,%3,%%g1\n\t" \ 6062306a36Sopenharmony_ci "mulscc %%g1,%3,%%g1\n\t" \ 6162306a36Sopenharmony_ci "mulscc %%g1,%3,%%g1\n\t" \ 6262306a36Sopenharmony_ci "mulscc %%g1,%3,%%g1\n\t" \ 6362306a36Sopenharmony_ci "mulscc %%g1,%3,%%g1\n\t" \ 6462306a36Sopenharmony_ci "mulscc %%g1,%3,%%g1\n\t" \ 6562306a36Sopenharmony_ci "mulscc %%g1,%3,%%g1\n\t" \ 6662306a36Sopenharmony_ci "mulscc %%g1,0,%%g1\n\t" \ 6762306a36Sopenharmony_ci "add %%g1,%%g2,%0\n\t" \ 6862306a36Sopenharmony_ci "rd %%y,%1\n" \ 6962306a36Sopenharmony_ci : "=r" (w1), \ 7062306a36Sopenharmony_ci "=r" (w0) \ 7162306a36Sopenharmony_ci : "%rI" ((USItype)(u)), \ 7262306a36Sopenharmony_ci "r" ((USItype)(v)) \ 7362306a36Sopenharmony_ci : "%g1", "%g2", "cc") 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci/* It's quite necessary to add this much assembler for the sparc. 7662306a36Sopenharmony_ci The default udiv_qrnnd (in C) is more than 10 times slower! */ 7762306a36Sopenharmony_ci#define udiv_qrnnd(q, r, n1, n0, d) \ 7862306a36Sopenharmony_ci __asm__ ("! Inlined udiv_qrnnd\n\t" \ 7962306a36Sopenharmony_ci "mov 32,%%g1\n\t" \ 8062306a36Sopenharmony_ci "subcc %1,%2,%%g0\n\t" \ 8162306a36Sopenharmony_ci "1: bcs 5f\n\t" \ 8262306a36Sopenharmony_ci "addxcc %0,%0,%0 ! shift n1n0 and a q-bit in lsb\n\t" \ 8362306a36Sopenharmony_ci "sub %1,%2,%1 ! this kills msb of n\n\t" \ 8462306a36Sopenharmony_ci "addx %1,%1,%1 ! so this can't give carry\n\t" \ 8562306a36Sopenharmony_ci "subcc %%g1,1,%%g1\n\t" \ 8662306a36Sopenharmony_ci "2: bne 1b\n\t" \ 8762306a36Sopenharmony_ci "subcc %1,%2,%%g0\n\t" \ 8862306a36Sopenharmony_ci "bcs 3f\n\t" \ 8962306a36Sopenharmony_ci "addxcc %0,%0,%0 ! shift n1n0 and a q-bit in lsb\n\t" \ 9062306a36Sopenharmony_ci "b 3f\n\t" \ 9162306a36Sopenharmony_ci "sub %1,%2,%1 ! this kills msb of n\n\t" \ 9262306a36Sopenharmony_ci "4: sub %1,%2,%1\n\t" \ 9362306a36Sopenharmony_ci "5: addxcc %1,%1,%1\n\t" \ 9462306a36Sopenharmony_ci "bcc 2b\n\t" \ 9562306a36Sopenharmony_ci "subcc %%g1,1,%%g1\n\t" \ 9662306a36Sopenharmony_ci "! Got carry from n. Subtract next step to cancel this carry.\n\t" \ 9762306a36Sopenharmony_ci "bne 4b\n\t" \ 9862306a36Sopenharmony_ci "addcc %0,%0,%0 ! shift n1n0 and a 0-bit in lsb\n\t" \ 9962306a36Sopenharmony_ci "sub %1,%2,%1\n\t" \ 10062306a36Sopenharmony_ci "3: xnor %0,0,%0\n\t" \ 10162306a36Sopenharmony_ci "! End of inline udiv_qrnnd\n" \ 10262306a36Sopenharmony_ci : "=&r" (q), \ 10362306a36Sopenharmony_ci "=&r" (r) \ 10462306a36Sopenharmony_ci : "r" ((USItype)(d)), \ 10562306a36Sopenharmony_ci "1" ((USItype)(n1)), \ 10662306a36Sopenharmony_ci "0" ((USItype)(n0)) : "%g1", "cc") 10762306a36Sopenharmony_ci#define UDIV_NEEDS_NORMALIZATION 0 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci#define abort() \ 11062306a36Sopenharmony_ci return 0 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci#ifdef __BIG_ENDIAN 11362306a36Sopenharmony_ci#define __BYTE_ORDER __BIG_ENDIAN 11462306a36Sopenharmony_ci#else 11562306a36Sopenharmony_ci#define __BYTE_ORDER __LITTLE_ENDIAN 11662306a36Sopenharmony_ci#endif 117