Skip to content

Commit

Permalink
[SPARC32]: Add __cmpdi2() libcall implementation ala. MIPS.
Browse files Browse the repository at this point in the history
Device mapper generates calls to this with recent versions
of gcc.

Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
David S. Miller committed Aug 27, 2007
1 parent 6c8f5b9 commit 6cc0735
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 1 deletion.
3 changes: 2 additions & 1 deletion arch/sparc/lib/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ lib-y := mul.o rem.o sdiv.o udiv.o umul.o urem.o ashrdi3.o memcpy.o memset.o \
strlen.o checksum.o blockops.o memscan.o memcmp.o strncmp.o \
strncpy_from_user.o divdi3.o udivdi3.o strlen_user.o \
copy_user.o locks.o atomic.o \
lshrdi3.o ashldi3.o rwsem.o muldi3.o bitext.o
lshrdi3.o ashldi3.o rwsem.o muldi3.o bitext.o \
cmpdi2.o

obj-y += iomap.o atomic32.o
27 changes: 27 additions & 0 deletions arch/sparc/lib/cmpdi2.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#include <linux/module.h>

#include "libgcc.h"

word_type __cmpdi2(long long a, long long b)
{
const DWunion au = {
.ll = a
};
const DWunion bu = {
.ll = b
};

if (au.s.high < bu.s.high)
return 0;
else if (au.s.high > bu.s.high)
return 2;

if ((unsigned int) au.s.low < (unsigned int) bu.s.low)
return 0;
else if ((unsigned int) au.s.low > (unsigned int) bu.s.low)
return 2;

return 1;
}

EXPORT_SYMBOL(__cmpdi2);
18 changes: 18 additions & 0 deletions arch/sparc/lib/libgcc.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#ifndef __ASM_LIBGCC_H
#define __ASM_LIBGCC_H

#include <asm/byteorder.h>

typedef int word_type __attribute__ ((mode (__word__)));

struct DWstruct {
int high, low;
};

typedef union
{
struct DWstruct s;
long long ll;
} DWunion;

#endif /* __ASM_LIBGCC_H */

0 comments on commit 6cc0735

Please sign in to comment.