Re: postgreSQL-8.0.1 compilation with icc-8.1 on Itanium-2

From: Bruce Momjian <pgman(at)candle(dot)pha(dot)pa(dot)us>
To: Vikram Kalsi <vikramkalsi(at)gmail(dot)com>
Cc: pgsql-hackers(at)postgresql(dot)org
Subject: Re: postgreSQL-8.0.1 compilation with icc-8.1 on Itanium-2
Date: 2005-03-09 04:29:47
Message-ID: 200503090429.j294TlG10498@candle.pha.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: 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(at)gmail(dot)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(at)gmx(dot)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(at)candle(dot)pha(dot)pa(dot)us | (610) 359-1001
+ If your life is a hard drive, | 13 Roberts Road
+ Christ can be your backup. | Newtown Square, Pennsylvania 19073

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Bruce Momjian 2005-03-09 04:30:54 Re: postgreSQL-8.0.1 compilation with icc-8.1 on Itanium-2
Previous Message Bruce Momjian 2005-03-09 04:28:20 Re: postgreSQL-8.0.1 configure --enable-thread-safety with