Re: postgreSQL-8.0.1 compilation with icc-8.1 on Itanium-2 - Mailing list pgsql-hackers

From Bruce Momjian
Subject Re: postgreSQL-8.0.1 compilation with icc-8.1 on Itanium-2
Date
Msg-id 200503090429.j294TlG10498@candle.pha.pa.us
Whole thread Raw
In response to Re: postgreSQL-8.0.1 compilation with icc-8.1 on Itanium-2 gives "error: asm statements not supported"  (Vikram Kalsi <vikramkalsi@gmail.com>)
List pgsql-hackers
Does the Intel compiler not support inline assembler? 
_InterlockedExchange() is a function call and we prefer to have asm()
code if we can get it.

---------------------------------------------------------------------------

Vikram Kalsi wrote:
> Just an update, the __INTEL_COMPILER is true on Itanium if icc is
> being used. So, the following worked for me-
> 
> ---------------------------BEGIN OLD
> s_lock.h-------------------------------------------------
> #if defined(__ia64__) || defined(__ia64)  /* __ia64 used by ICC compiler? */
> #define HAS_TEST_AND_SET
> typedef unsigned int slock_t;
> #define TAS(lock) tas(lock)
> 
> static __inline__ int
> tas(volatile slock_t *lock)
> {
>        long int        ret;
> 
>        __asm__ __volatile__(
>                "       xchg4   %0=%1,%2        \n"
> :               "=r"(ret), "+m"(*lock)
> :               "r"(1)
> :               "memory");
>        return (int) ret;
> }
> #endif   /* __ia64__ || __ia64 */
> -----------------------------END OLD
> s_lock.h-------------------------------------------------
> 
> ---------------------------BEGIN NEW
> s_lock.h-------------------------------------------------
> #if defined(__ia64__) || defined(__ia64)  /* __ia64 used by ICC compiler? */
> /* Intel Itanium */
> #define HAS_TEST_AND_SET
> 
> typedef unsigned int slock_t;
> 
> #define TAS(lock) tas(lock)
> 
> #if defined(__INTEL_COMPILER)
> 
> static __inline__ int
> tas(volatile slock_t *lock)
> {
>         int     ret;
> 
>         ret = _InterlockedExchange(lock,1);
> 
>         return ret;
> }
> 
> #else    /* __INTEL_COMPILER */
> 
> static __inline__ int
> tas(volatile slock_t *lock)
> {
>         long int        ret;
> 
>         __asm__ __volatile__(
>                 "       xchg4   %0=%1,%2        \n"
> :               "=r"(ret), "+m"(*lock)
> :               "r"(1)
> :               "memory");
>         return (int) ret;
> }
> 
> #endif   /* __INTEL_COMPILER */
> 
> #endif   /* __ia64__ || __ia64 */
> -----------------------------END NEW
> s_lock.h-------------------------------------------------
> 
> Thanks and Regards,
> 
> 
> On Fri, 4 Mar 2005 00:57:15 -0500, Vikram Kalsi <vikramkalsi@gmail.com> wrote:
> > Tom, Peter,
> > 
> > I have been able to compile and sucessfully run pgSQL after replacing
> > the asm statement in postgresql-8.0.1/src/include/storage/s_lock.h
> > with an equivalent intrinsic for the Itanium platform-
> > 
> > -------------------------------------BEGIN OLD s_lock.h----------------------------------------
> > #if defined(__ia64__) || defined(__ia64)  /* __ia64 used by ICC compiler? */
> > #define HAS_TEST_AND_SET
> > typedef unsigned int slock_t;
> > #define TAS(lock) tas(lock)
> > 
> > static __inline__ int
> > tas(volatile slock_t *lock)
> > {
> >         long int        ret;
> > 
> >         __asm__ __volatile__(
> >                 "       xchg4   %0=%1,%2        \n"
> > :               "=r"(ret), "+m"(*lock)
> > :               "r"(1)
> > :               "memory");
> >         return (int) ret;
> > }
> > #endif   /* __ia64__ || __ia64 */
> > ---------------------------------------END OLD s_lock.h----------------------------------------
> > 
> > -------------------------------------BEGIN NEW s_lock.h--------------------------------------
> > #if defined(__ia64__) || defined(__ia64)  /* __ia64 used by ICC compiler? */
> > #define HAS_TEST_AND_SET
> > typedef unsigned int slock_t;
> > #define TAS(lock) tas(lock)
> > 
> > static __inline__ int
> > tas(volatile slock_t *lock)
> > {
> >         int     ret;
> > 
> >         ret = _InterlockedExchange(lock,1);
> > 
> >         return ret;
> > }
> > #endif   /* __ia64__ || __ia64 */
> > ---------------------------------------END NEW s_lock.h--------------------------------------
> > 
> > The binary appears to be stable and the tpc-H benchmark executed
> > successfully against it as well. I also ran the regression test but
> > the following tests failed, the reasons for which I haven't
> > investigated yet
> > (http://www.cse.psu.edu/~kalsi/files/regression.diffs)-
> > 
> > test create_function_1    ... FAILED
> > test create_type          ... FAILED
> > test create_table         ... FAILED
> > test create_function_2    ... FAILED
> > test triggers             ... FAILED
> > test create_operator      ... FAILED
> > test create_view          ... FAILED
> > test transactions         ... FAILED
> > test misc                 ... FAILED
> > test select_views         ... FAILED
> > test rules                ... FAILED
> > test plpgsql              ... failed (ignored)
> > test copy2                ... FAILED
> > test rangefuncs           ... FAILED
> > test conversion           ... FAILED
> > test stats                ... FAILED
> > 
> > The _InterlockedExchange() function is defined in ia64intrin.h header file
> > 
> > int _InterlockedExchange(volatile int *Target, long value)
> > Do an exchange operation atomically. Maps to the xchg4 instruction.
> > 
> > More information is available at
> > http://www.intel.com/software/products/compilers/clin/docs/ug_cpp/lin1072.htm
> > 
> > Also, some other points to note, _ICC wasn't defined on my
> > installation when I was using icc by setting env var CC=icc. So, when
> > I tried to put a "#if defined" for using asm() for gcc and
> > _InterlockedExchange(), it didn't work. So, after this change gcc
> > compilation fails.
> > 
> > As of now, I am trying to test the binary further to see if it is
> > stable. Would you be knowing some good way to test this change?
> > 
> > I am not aware of the procedure of building patches but if this
> > resolves this issue and you would like me to make some sort of a
> > patch, then please let me know.
> > 
> > Thanks,
> > -Vikram
> > 
> > 
> > On Thu, 3 Mar 2005 09:55:18 +0100, Peter Eisentraut <peter_e@gmx.net> wrote:
> > > Tom Lane wrote:
> > > > #if defined(__GNUC__) || defined(__ICC)
> > > >
> > > > Can anyone say a reason why the above #if is not wrong ... ie,
> > > > are there any platforms where icc does handle gcc asm syntax,
> > > > and if so exactly which ones are they?
> > >
> > > I believe I added that a few releases ago.  The platform is IA32.
> > > Evidently, the GCC compatibility on IA64 is not quite as far yet.
> > >
> > > --
> > > Peter Eisentraut
> > > http://developer.postgresql.org/~petere/
> > >
> >
> 
> ---------------------------(end of broadcast)---------------------------
> TIP 9: the planner will ignore your desire to choose an index scan if your
>       joining column's datatypes do not match
> 

--  Bruce Momjian                        |  http://candle.pha.pa.us pgman@candle.pha.pa.us               |  (610)
359-1001+  If your life is a hard drive,     |  13 Roberts Road +  Christ can be your backup.        |  Newtown Square,
Pennsylvania19073
 


pgsql-hackers by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: postgreSQL-8.0.1 configure --enable-thread-safety with
Next
From: Bruce Momjian
Date:
Subject: Re: postgreSQL-8.0.1 compilation with icc-8.1 on Itanium-2