1 /* Copyright (c) 2015 Regents of the University of California
3 * Author: Brian Demsky <bdemsky@uci.edu>
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * version 2 as published by the Free Software Foundation.
10 #include "storeloadset.h"
12 #include "valuerecord.h"
15 StoreLoadSet::StoreLoadSet() :
20 StoreLoadSet::~StoreLoadSet() {
21 if (addrencodings!=NULL) {
25 addrvars.resetandfree();
26 valvars.resetandfree();
27 valrmwrvars.resetandfree();
30 void StoreLoadSet::add(EPRecord *op) {
32 IntIterator * it=op->getSet(VC_ADDRINDEX)->iterator();
34 addresses.add(it->next());
37 if (op->getType()==STORE ||
39 it=op->getStoreSet()->iterator();
41 values.add(it->next());
46 void StoreLoadSet::genEncoding() {
47 addrencodings=new ValueRecord(&addresses);
48 valencodings=new ValueRecord(&values);
51 const void * StoreLoadSet::getAddressEncoding(ConstGen *cg, EPRecord *op, bool *sat) {
52 Constraint **vars=getAddrVars(cg, op);
53 return (const void *) addrencodings->getValue(vars, sat);
56 uint64_t StoreLoadSet::getValueEncoding(ConstGen *cg, EPRecord *op, bool *sat) {
57 Constraint **vars=getValVars(cg, op);
58 return valencodings->getValue(vars, sat);
61 uint64_t StoreLoadSet::getRMWRValueEncoding(ConstGen *cg, EPRecord *op, bool *sat) {
62 Constraint **vars=getRMWRValVars(cg, op);
63 return valencodings->getValue(vars, sat);
66 Constraint * StoreLoadSet::getAddressEncoding(ConstGen *cg, EPRecord *op, const void * addr) {
67 if (addrencodings==NULL)
69 Constraint **vars=getAddrVars(cg, op);
70 return addrencodings->getValueEncoding(vars, (uint64_t) addr);
73 Constraint * StoreLoadSet::getValueEncoding(ConstGen *cg, EPRecord *op, uint64_t val) {
74 if (valencodings==NULL)
76 Constraint **vars=getValVars(cg, op);
77 return valencodings->getValueEncoding(vars, val);
80 Constraint * StoreLoadSet::getRMWRValueEncoding(ConstGen *cg, EPRecord *op, uint64_t val) {
81 if (valencodings==NULL)
83 Constraint **vars=getRMWRValVars(cg, op);
84 return valencodings->getValueEncoding(vars, val);
87 Constraint ** StoreLoadSet::getAddrVars(ConstGen *cg, EPRecord * op) {
88 Constraint **vars=addrvars.get(op);
90 int numvars=addrencodings->getNumVars();
91 vars=(Constraint **)model_malloc(numvars*sizeof(Constraint *));
92 cg->getArrayNewVars(numvars, vars);
93 addrvars.put(op, vars);
98 Constraint ** StoreLoadSet::getValVars(ConstGen *cg, EPRecord * op) {
99 Constraint **vars=valvars.get(op);
101 int numvars=valencodings->getNumVars();
102 vars=(Constraint **)model_malloc(numvars*sizeof(Constraint *));
103 cg->getArrayNewVars(numvars, vars);
104 valvars.put(op, vars);
109 Constraint ** StoreLoadSet::getRMWRValVars(ConstGen *cg, EPRecord * op) {
110 Constraint **vars=valrmwrvars.get(op);
112 int numvars=valencodings->getNumVars();
113 vars=(Constraint **)model_malloc(numvars*sizeof(Constraint *));
114 cg->getArrayNewVars(numvars, vars);
115 valrmwrvars.put(op, vars);
120 uint StoreLoadSet::getNumValVars() {
121 if (valencodings==NULL)
123 return valencodings->getNumVars();
126 uint StoreLoadSet::getNumAddrVars() {
127 if (addrencodings==NULL)
129 return addrencodings->getNumVars();