root/arch/c6x/lib/divi.S

/* [<][>][^][v][top][bottom][index][help] */
   1 ;; SPDX-License-Identifier: GPL-2.0-or-later
   2 ;;  Copyright 2010  Free Software Foundation, Inc.
   3 ;;  Contributed by Bernd Schmidt <bernds@codesourcery.com>.
   4 ;;
   5 
   6 #include <linux/linkage.h>
   7 
   8         ;; ABI considerations for the divide functions
   9         ;; The following registers are call-used:
  10         ;; __c6xabi_divi A0,A1,A2,A4,A6,B0,B1,B2,B4,B5
  11         ;; __c6xabi_divu A0,A1,A2,A4,A6,B0,B1,B2,B4
  12         ;; __c6xabi_remi A1,A2,A4,A5,A6,B0,B1,B2,B4
  13         ;; __c6xabi_remu A1,A4,A5,A7,B0,B1,B2,B4
  14         ;;
  15         ;; In our implementation, divu and remu are leaf functions,
  16         ;; while both divi and remi call into divu.
  17         ;; A0 is not clobbered by any of the functions.
  18         ;; divu does not clobber B2 either, which is taken advantage of
  19         ;; in remi.
  20         ;; divi uses B5 to hold the original return address during
  21         ;; the call to divu.
  22         ;; remi uses B2 and A5 to hold the input values during the
  23         ;; call to divu.  It stores B3 in on the stack.
  24 
  25         .text
  26 ENTRY(__c6xabi_divi)
  27         call    .s2     __c6xabi_divu
  28 ||      mv      .d2     B3, B5
  29 ||      cmpgt   .l1     0, A4, A1
  30 ||      cmpgt   .l2     0, B4, B1
  31 
  32    [A1] neg     .l1     A4, A4
  33 || [B1] neg     .l2     B4, B4
  34 ||      xor     .s1x    A1, B1, A1
  35    [A1] addkpc  .s2     _divu_ret, B3, 4
  36 _divu_ret:
  37         neg     .l1     A4, A4
  38 ||      mv      .l2     B3,B5
  39 ||      ret     .s2     B5
  40         nop             5
  41 ENDPROC(__c6xabi_divi)

/* [<][>][^][v][top][bottom][index][help] */