arguments.hh revision 3535
110447Snilay@cs.wisc.edu/*
210447Snilay@cs.wisc.edu * Copyright (c) 2003-2005 The Regents of The University of Michigan
310447Snilay@cs.wisc.edu * All rights reserved.
410447Snilay@cs.wisc.edu *
510447Snilay@cs.wisc.edu * Redistribution and use in source and binary forms, with or without
610447Snilay@cs.wisc.edu * modification, are permitted provided that the following conditions are
710447Snilay@cs.wisc.edu * met: redistributions of source code must retain the above copyright
810447Snilay@cs.wisc.edu * notice, this list of conditions and the following disclaimer;
910447Snilay@cs.wisc.edu * redistributions in binary form must reproduce the above copyright
1010447Snilay@cs.wisc.edu * notice, this list of conditions and the following disclaimer in the
1110447Snilay@cs.wisc.edu * documentation and/or other materials provided with the distribution;
1210447Snilay@cs.wisc.edu * neither the name of the copyright holders nor the names of its
1310447Snilay@cs.wisc.edu * contributors may be used to endorse or promote products derived from
1410447Snilay@cs.wisc.edu * this software without specific prior written permission.
1510447Snilay@cs.wisc.edu *
1610447Snilay@cs.wisc.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1710447Snilay@cs.wisc.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1810447Snilay@cs.wisc.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1910447Snilay@cs.wisc.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2010447Snilay@cs.wisc.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2110447Snilay@cs.wisc.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2210447Snilay@cs.wisc.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2310447Snilay@cs.wisc.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2410447Snilay@cs.wisc.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2510447Snilay@cs.wisc.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2610447Snilay@cs.wisc.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2710447Snilay@cs.wisc.edu *
2810447Snilay@cs.wisc.edu * Authors: Nathan Binkert
2910447Snilay@cs.wisc.edu */
3010447Snilay@cs.wisc.edu
3110447Snilay@cs.wisc.edu#ifndef __ARCH_ALPHA_ARGUMENTS_HH__
3210447Snilay@cs.wisc.edu#define __ARCH_ALPHA_ARGUMENTS_HH__
3310447Snilay@cs.wisc.edu
3410447Snilay@cs.wisc.edu#include <assert.h>
3510447Snilay@cs.wisc.edu
3610447Snilay@cs.wisc.edu#include "arch/alpha/vtophys.hh"
3710447Snilay@cs.wisc.edu#include "base/refcnt.hh"
3810447Snilay@cs.wisc.edu#include "sim/host.hh"
3910447Snilay@cs.wisc.edu
4010447Snilay@cs.wisc.educlass ThreadContext;
4110447Snilay@cs.wisc.edu
4210447Snilay@cs.wisc.edunamespace AlphaISA {
4310447Snilay@cs.wisc.edu
4410447Snilay@cs.wisc.educlass Arguments
4510447Snilay@cs.wisc.edu{
4610447Snilay@cs.wisc.edu  protected:
4710447Snilay@cs.wisc.edu    ThreadContext *tc;
4810447Snilay@cs.wisc.edu    int number;
4910447Snilay@cs.wisc.edu    uint64_t getArg(bool fp = false);
5010447Snilay@cs.wisc.edu
5110447Snilay@cs.wisc.edu  protected:
5210447Snilay@cs.wisc.edu    class Data : public RefCounted
5310447Snilay@cs.wisc.edu    {
5410447Snilay@cs.wisc.edu      public:
5510447Snilay@cs.wisc.edu        Data(){}
5610447Snilay@cs.wisc.edu        ~Data();
5710447Snilay@cs.wisc.edu
5810447Snilay@cs.wisc.edu      private:
5910447Snilay@cs.wisc.edu        std::list<char *> data;
6010447Snilay@cs.wisc.edu
6110447Snilay@cs.wisc.edu      public:
6210447Snilay@cs.wisc.edu        char *alloc(size_t size);
6310447Snilay@cs.wisc.edu    };
6410447Snilay@cs.wisc.edu
6510447Snilay@cs.wisc.edu    RefCountingPtr<Data> data;
6610447Snilay@cs.wisc.edu
6710447Snilay@cs.wisc.edu  public:
6810447Snilay@cs.wisc.edu    Arguments(ThreadContext *ctx, int n = 0)
6910447Snilay@cs.wisc.edu        : tc(ctx), number(n), data(NULL)
7010447Snilay@cs.wisc.edu        { assert(number >= 0); data = new Data;}
7110447Snilay@cs.wisc.edu    Arguments(const Arguments &args)
7210447Snilay@cs.wisc.edu        : tc(args.tc), number(args.number), data(args.data) {}
7310447Snilay@cs.wisc.edu    ~Arguments() {}
7410447Snilay@cs.wisc.edu
7510447Snilay@cs.wisc.edu    ThreadContext *getThreadContext() const { return tc; }
7610447Snilay@cs.wisc.edu
7710447Snilay@cs.wisc.edu    const Arguments &operator=(const Arguments &args) {
7810447Snilay@cs.wisc.edu        tc = args.tc;
7910447Snilay@cs.wisc.edu        number = args.number;
8010447Snilay@cs.wisc.edu        data = args.data;
8110447Snilay@cs.wisc.edu        return *this;
8210447Snilay@cs.wisc.edu    }
8310447Snilay@cs.wisc.edu
8410447Snilay@cs.wisc.edu    Arguments &operator++() {
8510447Snilay@cs.wisc.edu        ++number;
8610447Snilay@cs.wisc.edu        assert(number >= 0);
8710447Snilay@cs.wisc.edu        return *this;
8810447Snilay@cs.wisc.edu    }
8910447Snilay@cs.wisc.edu
9010447Snilay@cs.wisc.edu    Arguments operator++(int) {
9110447Snilay@cs.wisc.edu        Arguments args = *this;
9210447Snilay@cs.wisc.edu        ++number;
9310447Snilay@cs.wisc.edu        assert(number >= 0);
9410447Snilay@cs.wisc.edu        return args;
9510447Snilay@cs.wisc.edu    }
9610447Snilay@cs.wisc.edu
9710447Snilay@cs.wisc.edu    Arguments &operator--() {
9810447Snilay@cs.wisc.edu        --number;
9910447Snilay@cs.wisc.edu        assert(number >= 0);
10010447Snilay@cs.wisc.edu        return *this;
10110447Snilay@cs.wisc.edu    }
10210447Snilay@cs.wisc.edu
10310447Snilay@cs.wisc.edu    Arguments operator--(int) {
10410447Snilay@cs.wisc.edu        Arguments args = *this;
10510447Snilay@cs.wisc.edu        --number;
10610447Snilay@cs.wisc.edu        assert(number >= 0);
10710447Snilay@cs.wisc.edu        return args;
10810447Snilay@cs.wisc.edu    }
10910447Snilay@cs.wisc.edu
11010447Snilay@cs.wisc.edu    const Arguments &operator+=(int index) {
11110447Snilay@cs.wisc.edu        number += index;
11210447Snilay@cs.wisc.edu        assert(number >= 0);
11310447Snilay@cs.wisc.edu        return *this;
11410447Snilay@cs.wisc.edu    }
11510447Snilay@cs.wisc.edu
11610447Snilay@cs.wisc.edu    const Arguments &operator-=(int index) {
11710447Snilay@cs.wisc.edu        number -= index;
11810447Snilay@cs.wisc.edu        assert(number >= 0);
11910447Snilay@cs.wisc.edu        return *this;
12010447Snilay@cs.wisc.edu    }
12110447Snilay@cs.wisc.edu
12210447Snilay@cs.wisc.edu    Arguments operator[](int index) {
12310447Snilay@cs.wisc.edu        return Arguments(tc, index);
12410447Snilay@cs.wisc.edu    }
12510447Snilay@cs.wisc.edu
12610447Snilay@cs.wisc.edu    template <class T>
12710447Snilay@cs.wisc.edu    operator T() {
12810447Snilay@cs.wisc.edu        assert(sizeof(T) <= sizeof(uint64_t));
12910447Snilay@cs.wisc.edu        T data = static_cast<T>(getArg());
13010447Snilay@cs.wisc.edu        return data;
13110447Snilay@cs.wisc.edu    }
13210447Snilay@cs.wisc.edu
13310447Snilay@cs.wisc.edu    template <class T>
13410447Snilay@cs.wisc.edu    operator T *() {
13510447Snilay@cs.wisc.edu        T *buf = (T *)data->alloc(sizeof(T));
13610447Snilay@cs.wisc.edu        CopyData(tc, buf, getArg(), sizeof(T));
13710447Snilay@cs.wisc.edu        return buf;
13810447Snilay@cs.wisc.edu    }
13910447Snilay@cs.wisc.edu
14010447Snilay@cs.wisc.edu    operator char *() {
14110447Snilay@cs.wisc.edu        char *buf = data->alloc(2048);
14210447Snilay@cs.wisc.edu        CopyStringOut(tc, buf, getArg(), 2048);
14310447Snilay@cs.wisc.edu        return buf;
14410447Snilay@cs.wisc.edu    }
14510447Snilay@cs.wisc.edu};
14610447Snilay@cs.wisc.edu
14710447Snilay@cs.wisc.edu}; // namespace AlphaISA
14810447Snilay@cs.wisc.edu
14910447Snilay@cs.wisc.edu#endif // __ARCH_ALPHA_ARGUMENTS_HH__
15010447Snilay@cs.wisc.edu