linux/arch/mn10300/lib/__ashldi3.S
<<
>>
Prefs
   1/* MN10300 64-bit arithmetic left shift
   2 *
   3 * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
   4 * Written by David Howells (dhowells@redhat.com)
   5 *
   6 * This program is free software; you can redistribute it and/or
   7 * modify it under the terms of the GNU General Public Licence
   8 * as published by the Free Software Foundation; either version
   9 * 2 of the Licence, or (at your option) any later version.
  10 */
  11#include <asm/cache.h>
  12
  13        .text
  14        .balign L1_CACHE_BYTES
  15
  16###############################################################################
  17#
  18# unsigned long long __ashldi3(unsigned long long value [D1:D0],
  19#                              unsigned by [(12,SP)])
  20#
  21###############################################################################
  22        .globl  __ashldi3
  23        .type   __ashldi3,@function
  24__ashldi3:
  25        mov     (12,sp),a0
  26        and     +63,a0
  27        beq     __ashldi3_zero
  28
  29        cmp     +31,a0
  30        bhi     __ashldi3_32plus
  31
  32        # the count is in the range 1-31
  33        asl     a0,d1
  34
  35        mov     +32,a1
  36        sub     a0,a1,a1                        # a1 = 32 - count
  37        lsr     a1,d0,a1                        # get overflow from LSW -> MSW
  38
  39        or_asl  a1,d1,a0,d0                     # insert overflow into MSW and
  40                                                # shift the LSW
  41        rets
  42
  43        .balign L1_CACHE_BYTES
  44        # the count is in the range 32-63
  45__ashldi3_32plus:
  46        asl     a0,d0,d1
  47        clr     d0
  48__ashldi3_zero:
  49        rets
  50
  51        .size   __ashldi3, .-__ashldi3
  52