root/arch/c6x/lib/remu.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 
  26         .text
  27 
  28 ENTRY(__c6xabi_remu)
  29         ;; The ABI seems designed to prevent these functions calling each other,
  30         ;; so we duplicate most of the divsi3 code here.
  31          mv     .s2x    A4, B1
  32          lmbd   .l2     1, B4, B1
  33 || [!B1] b      .s2     B3      ; RETURN A
  34 || [!B1] mvk    .d2     1, B4
  35 
  36          mv     .l1x    B1, A7
  37 ||       shl    .s2     B4, B1, B4
  38 
  39          cmpltu .l1x    A4, B4, A1
  40    [!A1] sub    .l1x    A4, B4, A4
  41          shru   .s2     B4, 1, B4
  42 
  43 _remu_loop:
  44          cmpgt  .l2     B1, 7, B0
  45 || [B1]  subc   .l1x    A4,B4,A4
  46 || [B1]  add    .s2     -1, B1, B1
  47         ;; RETURN A may happen here (note: must happen before the next branch)
  48    [B1]  subc   .l1x    A4,B4,A4
  49 || [B1]  add    .s2     -1, B1, B1
  50 || [B0]  b      .s1     _remu_loop
  51    [B1]  subc   .l1x    A4,B4,A4
  52 || [B1]  add    .s2     -1, B1, B1
  53    [B1]  subc   .l1x    A4,B4,A4
  54 || [B1]  add    .s2     -1, B1, B1
  55    [B1]  subc   .l1x    A4,B4,A4
  56 || [B1]  add    .s2     -1, B1, B1
  57    [B1]  subc   .l1x    A4,B4,A4
  58 || [B1]  add    .s2     -1, B1, B1
  59    [B1]  subc   .l1x    A4,B4,A4
  60 || [B1]  add    .s2     -1, B1, B1
  61         ;; loop backwards branch happens here
  62 
  63          ret    .s2     B3
  64    [B1]  subc   .l1x    A4,B4,A4
  65 || [B1]  add    .s2     -1, B1, B1
  66    [B1]  subc   .l1x    A4,B4,A4
  67 
  68          extu   .s1     A4, A7, A4
  69          nop    2
  70 ENDPROC(__c6xabi_remu)

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