[M3devel] further removal of volatile

Jay K jay.krell at cornell.edu
Sat Jun 5 22:52:34 CEST 2010


Tony, Currently we still put volatile on all floating point loads and/or stores.
I removed it from all the other types.
The main problem I was having is that CopySign in m3core would fail to compile.
 It is loophoing a float as a struct with bitfields I believe.
  I didn't look at what the equivalent C tree would be, though that is probably a good idea.


With this it seems I don't need the volatile:


static void
m3_load_1 (tree v, int o, tree src_t, m3_type src_T, tree dst_t, m3_type dst_T,
           bool volatil)
{
  if (o != 0 || TREE_TYPE (v) != src_t)
  {
    if (GCC42 || (src_T != dst_T))   <<< 
    {
      /* failsafe, but inefficient */
      v = m3_build1 (ADDR_EXPR, t_addr, v);
      v = m3_build2 (PLUS_EXPR, t_addr, v, size_int (o / BITS_PER_UNIT));
      v = m3_build1 (INDIRECT_REF, src_t,
      m3_cast (m3_build_pointer_type (src_t), v));
    }
    else
    {
      v = m3_build3 (BIT_FIELD_REF, src_t, v, TYPE_SIZE (src_t),
                     bitsize_int (o));
    }
  }
 ...



static void
m3_store_1 (tree v, int o, tree src_t, m3_type src_T, tree dst_t, m3_type dst_T,
            bool volatil)
{
  tree val;
  if (o != 0 || TREE_TYPE (v) != dst_t)
  {
    if (GCC42 || (src_T != dst_T))   <<<< 
    {
      /* failsafe, but inefficient */
      v = m3_build1 (ADDR_EXPR, t_addr, v);
      v = m3_build2 (PLUS_EXPR, t_addr, v, size_int (o / BITS_PER_UNIT));
      v = m3_build1 (INDIRECT_REF, dst_t,
                     m3_cast (m3_build_pointer_type (dst_t), v));
    }
    else
    {
      v = m3_build3 (BIT_FIELD_REF, dst_t, v, TYPE_SIZE (dst_t),
                     bitsize_int (o));
    }
  }..

Previously, the code was the equivalent of saying if GCC42 there.


Good enough?


You know, this bitfield stuff has been a recurring problem.

I could probably narrow it down more.
  Like maybe if the types are the same size or both integers, still go down the old faster path.
    Though I thought I had tried if they were either float going slow and that didn't work.
     It might relate to structs as well.


However inefficient the non-bitfield ref path is, I can hope/assume it isn't as bad now without volatile.
But I could look a bit at the code.


 - Jay
 		 	   		  


More information about the M3devel mailing list