port to Sun Studio 12u1 Sun C++ 5.10 SunOS_i386 128229-02 2009/09/21

change makefile to compile for both i386 and x86_64 on Darwin/Mac OS X
pull/2/head
weidai 2010-07-05 01:15:14 +00:00
parent 954fed3d5d
commit 1315a7bc9a
7 changed files with 49 additions and 22 deletions

View File

@ -31,7 +31,9 @@ GAS217_OR_LATER = $(shell echo "" | $(AS) -v 2>&1 | $(EGREP) -c "GNU assembler v
ISMINGW = $(shell $(CXX) --version 2>&1 | $(EGREP) -c "mingw") ISMINGW = $(shell $(CXX) --version 2>&1 | $(EGREP) -c "mingw")
ifneq ($(GCC42_OR_LATER),0) ifneq ($(GCC42_OR_LATER),0)
ifneq ($(UNAME),Darwin) ifeq ($(UNAME),Darwin)
CXXFLAGS += -arch x86_64 -arch i386
else
CXXFLAGS += -march=native -mtune=native CXXFLAGS += -march=native -mtune=native
endif endif
endif endif
@ -86,6 +88,9 @@ LDLIBS += -lnsl -lsocket
ifeq ($(CXX),CC) # override flags for CC (Solaris native C++ compiler) ifeq ($(CXX),CC) # override flags for CC (Solaris native C++ compiler)
CXXFLAGS = -DNDEBUG -O -g0 -native -template=no%extdef -m$(shell isainfo -b) CXXFLAGS = -DNDEBUG -O -g0 -native -template=no%extdef -m$(shell isainfo -b)
LDFLAGS = LDFLAGS =
AR = CC
ARFLAGS = -xar -o
RANLIB = true
ifeq ($(ISX86),1) ifeq ($(ISX86),1)
# SSE2 intrinsics should work in Sun Studio 12, but we're not using SSE2 intrinsics anymore # SSE2 intrinsics should work in Sun Studio 12, but we're not using SSE2 intrinsics anymore
# CXXFLAGS += -xarch=sse2 -D__SSE2__ # CXXFLAGS += -xarch=sse2 -D__SSE2__

View File

@ -129,7 +129,7 @@ static inline IDEA::Word AddInv(IDEA::Word x)
void IDEA::Base::DeKey() void IDEA::Base::DeKey()
{ {
FixedSizeSecBlock<IDEA::Word, 6*ROUNDS+4> tempkey; FixedSizeSecBlock<IDEA::Word, 6*ROUNDS+4> tempkey;
unsigned int i; size_t i;
for (i=0; i<ROUNDS; i++) for (i=0; i<ROUNDS; i++)
{ {

View File

@ -115,7 +115,7 @@ static word AtomicInverseModPower2(word A)
#elif defined(__DECCXX) #elif defined(__DECCXX)
#define MultiplyWordsLoHi(p0, p1, a, b) p0 = a*b; p1 = asm("umulh %a0, %a1, %v0", a, b); #define MultiplyWordsLoHi(p0, p1, a, b) p0 = a*b; p1 = asm("umulh %a0, %a1, %v0", a, b);
#elif defined(__x86_64__) #elif defined(__x86_64__)
#ifdef __SUNPRO_CC #if defined(__SUNPRO_CC) && __SUNPRO_CC < 0x5100
// Sun Studio's gcc-style inline assembly is heavily bugged as of version 5.9 Patch 124864-09 2008/12/16, but this one works // Sun Studio's gcc-style inline assembly is heavily bugged as of version 5.9 Patch 124864-09 2008/12/16, but this one works
#define MultiplyWordsLoHi(p0, p1, a, b) asm ("mulq %3" : "=a"(p0), "=d"(p1) : "a"(a), "r"(b) : "cc"); #define MultiplyWordsLoHi(p0, p1, a, b) asm ("mulq %3" : "=a"(p0), "=d"(p1) : "a"(a), "r"(b) : "cc");
#else #else

View File

@ -14,6 +14,11 @@
#include <map> #include <map>
#include <vector> #include <vector>
#ifdef __SUNPRO_CC
// workaround needed on Sun Studio 12u1 Sun C++ 5.10 SunOS_i386 128229-02 2009/09/21
#include <vector.cc>
#endif
// for alloca // for alloca
#ifdef __sun #ifdef __sun
#include <alloca.h> #include <alloca.h>

12
tea.cpp
View File

@ -62,8 +62,14 @@ void XTEA::Enc::ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, by
word32 y, z; word32 y, z;
Block::Get(inBlock)(y)(z); Block::Get(inBlock)(y)(z);
#ifdef __SUNPRO_CC
// workaround needed on Sun Studio 12u1 Sun C++ 5.10 SunOS_i386 128229-02 2009/09/21
size_t sum = 0;
while ((sum&0xffffffff) != m_limit)
#else
word32 sum = 0; word32 sum = 0;
while (sum != m_limit) while (sum != m_limit)
#endif
{ {
y += (z<<4 ^ z>>5) + z ^ sum + m_k[sum&3]; y += (z<<4 ^ z>>5) + z ^ sum + m_k[sum&3];
sum += DELTA; sum += DELTA;
@ -78,8 +84,14 @@ void XTEA::Dec::ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, by
word32 y, z; word32 y, z;
Block::Get(inBlock)(y)(z); Block::Get(inBlock)(y)(z);
#ifdef __SUNPRO_CC
// workaround needed on Sun Studio 12u1 Sun C++ 5.10 SunOS_i386 128229-02 2009/09/21
size_t sum = m_limit;
while ((sum&0xffffffff) != 0)
#else
word32 sum = m_limit; word32 sum = m_limit;
while (sum != 0) while (sum != 0)
#endif
{ {
z -= (y<<4 ^ y>>5) + y ^ sum + m_k[sum>>11 & 3]; z -= (y<<4 ^ y>>5) + y ^ sum + m_k[sum>>11 & 3];
sum -= DELTA; sum -= DELTA;

View File

@ -130,7 +130,10 @@ bool TestSettings()
cout << "\nTesting Settings...\n\n"; cout << "\nTesting Settings...\n\n";
if (*(word32 *)"\x01\x02\x03\x04" == 0x04030201L) word32 w;
memcpy_s(&w, sizeof(w), "\x01\x02\x03\x04", 4);
if (w == 0x04030201L)
{ {
#ifdef IS_LITTLE_ENDIAN #ifdef IS_LITTLE_ENDIAN
cout << "passed: "; cout << "passed: ";
@ -140,7 +143,7 @@ bool TestSettings()
#endif #endif
cout << "Your machine is little endian.\n"; cout << "Your machine is little endian.\n";
} }
else if (*(word32 *)"\x01\x02\x03\x04" == 0x01020304L) else if (w == 0x01020304L)
{ {
#ifndef IS_LITTLE_ENDIAN #ifndef IS_LITTLE_ENDIAN
cout << "passed: "; cout << "passed: ";

View File

@ -16,22 +16,24 @@ void WAKE_TestInstantiations()
inline word32 WAKE_Base::M(word32 x, word32 y) inline word32 WAKE_Base::M(word32 x, word32 y)
{ {
word32 w = x+y; word32 w = x+y;
return (w>>8) ^ t[(byte)w]; return (w>>8) ^ t[w & 0xff];
} }
void WAKE_Base::GenKey(word32 k0, word32 k1, word32 k2, word32 k3) void WAKE_Base::GenKey(word32 k0, word32 k1, word32 k2, word32 k3)
{ {
long x, z; // this code is mostly copied from David Wheeler's paper "A Bulk Data Encryption Algorithm"
int p ; signed int x, z, p;
static long tt[10]= { // x and z were declared as "long" in Wheeler's paper, which is a signed type. I don't know if that was intentional, but it's too late to change it now. -- Wei 7/4/2010
0x726a8f3bL, // table CRYPTOPP_COMPILE_ASSERT(sizeof(x) == 4);
0xe69a3b5cL, static int tt[10]= {
0xd3c71fe5L, 0x726a8f3b, // table
0xab3c73d2L, 0xe69a3b5c,
0x4d3a8eb3L, 0xd3c71fe5,
0x0396d6e8L, 0xab3c73d2,
0x3d4c2f7aL, 0x4d3a8eb3,
0x9ee27cf3L, } ; 0x0396d6e8,
0x3d4c2f7a,
0x9ee27cf3, } ;
t[0] = k0; t[0] = k0;
t[1] = k1; t[1] = k1;
t[2] = k2; t[2] = k2;
@ -39,16 +41,16 @@ void WAKE_Base::GenKey(word32 k0, word32 k1, word32 k2, word32 k3)
for (p=4 ; p<256 ; p++) for (p=4 ; p<256 ; p++)
{ {
x=t[p-4]+t[p-1] ; // fill t x=t[p-4]+t[p-1] ; // fill t
t[p]= (x>>3) ^ tt[byte(x&7)] ; t[p]= (x>>3) ^ tt[x&7] ;
} }
for (p=0 ; p<23 ; p++) for (p=0 ; p<23 ; p++)
t[p]+=t[p+89] ; // mix first entries t[p]+=t[p+89] ; // mix first entries
x=t[33] ; z=t[59] | 0x01000001L ; x=t[33] ; z=t[59] | 0x01000001 ;
z=z&0xff7fffffL ; z=z&0xff7fffff ;
for (p=0 ; p<256 ; p++) { //change top byte to for (p=0 ; p<256 ; p++) { //change top byte to
x=(x&0xff7fffffL)+z ; // a permutation etc x=(x&0xff7fffff)+z ; // a permutation etc
t[p]=(t[p] & 0x00ffffffL) ^ x ; } t[p]=(t[p] & 0x00ffffff) ^ x ; }
t[256]=t[0] ; t[256]=t[0] ;
byte y=byte(x); byte y=byte(x);