https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70885

            Bug ID: 70885
           Summary: [SH] Use MSB pointer-tagging for pointer-to-member
                    representation
           Product: gcc
           Version: 6.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: olegendo at gcc dot gnu.org
  Target Milestone: ---

Currently there are two available pointer-to-member representation options:
  ptrmemfunc_vbit_in_pfn,
  ptrmemfunc_vbit_in_delta

where ptrmemfunc_vbit_in_pfn stores the "is a virtual function" pointer tag in
the LSB of the pointer (assuming 16-bit aligned functions).

When using the tagged pointer to make the function call, the tag needs to be
tested and the pointer converted into a valid address.  On SH this currently
looks like this:

struct test_class
{
  int x;

  void func (void);
};

void test (test_class* c, void (test_class::*f)(void) )
{
  (c->*f) ();
}

compiled with -O2:
        mov     r5,r0      // r5 = r0 = __pfn field
        tst     #1,r0      // test LSB
        add     r6,r4
        bt      .L17       // if LSB not set, goto L17

        mov.l   @r4,r5     // when here, LSB is set
        add     r5,r0
        add     #-1,r0     // subtract 1 to clear LSB
        mov.l   @r0,r0
.L17:
        jmp     @r0
        nop


At least on SH, it's better to do store pointer tags in the MSB.  So that the
tagged pointer value becomes:

   tagged_ptr_val = (ptr_val >> 1) | (tag_bit << 31)

This allows for more efficient tag test and pointer value restoration, the code
could look like:

        mov     r5,r0
        shll    r5         // __pfn << 1, MSB -> T bit
        add     r6,r4
        bf      .L17       // if MSB not set, goto L17

        mov.l   @r4,r5
        add     r5,r0
        mov.l   @r0,r0
.L17:
        jmp     @r0
        nop

... which saves one instruction.
To enable that, there should be another option "ptrmemfunc_vbit_in_pfn_msb"
along with some target specific m-option to enable this as well as a configure
option to control the default setting.

Reply via email to