[Gc] Re: Re[6]: PATCH: Add x32 support to boehm-gc

H.J. Lu hjl.tools at gmail.com
Sun Sep 30 13:32:49 PDT 2012


On Sun, Sep 30, 2012 at 10:20 AM, Ivan Maidanski <ivmai at mail.ru> wrote:
> Hi H.J.,
>
> Could you please test this branch of libatomic_ops under x32:
> https://github.com/ivmai/libatomic_ops/tree/master-untested ?

X32 is x86-64 with 32bit pointers and long.

> This branch contain 2 commits (extra to "master" branch):
> 1) a fix for AO_compare_double_and_swap_double_full - it should use
> cmpxchg8b instead of cmpxchg16b for x32

src/atomic_ops/sysdeps/standard_ao_double_t.h has

#if (defined(__x86_64__) && __GNUC__ >= 4) || defined(_WIN64)
# include <xmmintrin.h>
  typedef __m128 double_ptr_storage;
#elif defined(_WIN32) && !defined(__GNUC__)
  typedef unsigned __int64 double_ptr_storage;
#else
  typedef unsigned long long double_ptr_storage;
#endif

# define AO_HAVE_DOUBLE_PTR_STORAGE

typedef union {
    double_ptr_storage AO_whole;
    struct {AO_t AO_v1; AO_t AO_v2;} AO_parts;
} AO_double_t;
#define AO_HAVE_double_t

This is incorrect for x32 sice AO_t is size_t, which is
32bit for x32.  X32 has native support for 64-bit integer
operations.  For x32, AO_double_t is 64bit integer and
we can use 64-bit cmpxchg.  There is no need for
x32 AO_compare_double_and_swap_double_full,
which breaks 64bit integer into 2 32-bit integers.
Can you add a 64-bit version of atomic operations?

> 2) code refactoring merging x86_64.h code into x86.h file
>
> In particular, it's unclear to me whether PIC mode for x32 is the same as
> for x86.
>

That is incorrect.  X32 PIC is identical to x86-64 PIC.


-- 
H.J.


More information about the Gc mailing list