Ignore:
Timestamp:
Mar 28, 2013, 1:50:16 PM (11 years ago)
Author:
joannou
Message:

In generic_cache_tsar, added new read function that returns 2 32bits words and the cache line state

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/lib/generic_cache_tsar/include/generic_cache.h

    r303 r337  
    399399    }
    400400
     401    ////////////////////////////////////////////////////////////////////
     402    // Read one or two 32 bits word.
     403    // Both data and directory are accessed.
     404    // returns the access status in the state argument:
     405    // - VALID : (matching tag) and (state == VALID)
     406    // - ZOMBI : (matching tag) and (state == ZOMBI)
     407    // - MISS  : no matching tag or EMPTY state
     408    // If VALID or ZOMBI, the data, the way, set and word index are
     409    // returned in the other arguments.
     410    ////////////////////////////////////////////////////////////////////
     411    inline void read( addr_t    ad,
     412                      data_t*   dt,
     413                      data_t*   dt_next,
     414                      size_t*   selway,
     415                      size_t*   selset,
     416                      size_t*   selword,
     417                      int*      state )
     418    {
     419        const tag_t       tag  = m_z[ad];
     420        const size_t      set  = m_y[ad];
     421        const size_t      word = m_x[ad];
     422
     423        // default return values
     424        *state   = CACHE_SLOT_STATE_EMPTY;
     425        *selway  = 0;
     426        *selset  = 0;
     427        *selword = 0;
     428        *dt      = 0;
     429
     430        for ( size_t way = 0; way < m_ways; way++ )
     431        {
     432            if ( tag == cache_tag(way, set) )  // matching tag
     433            {
     434
     435                if ( cache_state(way, set) == CACHE_SLOT_STATE_VALID )
     436                {
     437                    *state   = CACHE_SLOT_STATE_VALID;
     438                    *selway  = way;
     439                    *selset  = set;
     440                    *selword = word;
     441                    *dt      = cache_data(way, set, word);
     442                    if ( word+1 < m_words)
     443                    {
     444                        *dt_next = cache_data(way, set, word+1);
     445                    }
     446                    cache_set_lru(way, set);
     447                }
     448                else if ( cache_state(way, set) == CACHE_SLOT_STATE_ZOMBI )
     449                {
     450                    *state   = CACHE_SLOT_STATE_ZOMBI;
     451                    *selway  = way;
     452                    *selset  = set;
     453                    *selword = word;
     454                }
     455            }
     456        }
     457    }
     458
    401459    ///////////////////////////////////////////////////////////////////////////////
    402460    // Checks the cache state for a given address.
Note: See TracChangeset for help on using the changeset viewer.