macromem.isa (6725:c469a9365a4a) | macromem.isa (6726:a5322e816a2a) |
---|---|
1// -*- mode:c++ -*- 2 3// Copyright (c) 2007-2008 The Florida State University 4// All rights reserved. 5// 6// Redistribution and use in source and binary forms, with or without 7// modification, are permitted provided that the following conditions are 8// met: redistributions of source code must retain the above copyright --- 166 unchanged lines hidden (view full) --- 175 176def template MacroStoreConstructor {{ 177inline %(class_name)s::%(class_name)s(ExtMachInst machInst) 178 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s) 179{ 180 %(constructor)s; 181 uint32_t regs = reglist; 182 uint32_t addr = 0; | 1// -*- mode:c++ -*- 2 3// Copyright (c) 2007-2008 The Florida State University 4// All rights reserved. 5// 6// Redistribution and use in source and binary forms, with or without 7// modification, are permitted provided that the following conditions are 8// met: redistributions of source code must retain the above copyright --- 166 unchanged lines hidden (view full) --- 175 176def template MacroStoreConstructor {{ 177inline %(class_name)s::%(class_name)s(ExtMachInst machInst) 178 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s) 179{ 180 %(constructor)s; 181 uint32_t regs = reglist; 182 uint32_t addr = 0; |
183 bool up = machInst.puswl.up; |
|
183 184 if (!up) 185 addr = (ones << 2) - 4; 186 | 184 185 if (!up) 186 addr = (ones << 2) - 4; 187 |
187 if (prepost) | 188 if (machInst.puswl.prepost) |
188 addr += 4; 189 190 // Add 0 to Rn and stick it in ureg0. 191 // This is equivalent to a move. 192 microOps[0] = new MicroAddiUop(machInst, INTREG_UREG0, RN, 0); 193 194 unsigned reg = 0; 195 for (int i = 1; i < ones + 1; i++) { 196 // Find the next register. 197 while (!bits(regs, reg)) 198 reg++; 199 replaceBits(regs, reg, 0); 200 | 189 addr += 4; 190 191 // Add 0 to Rn and stick it in ureg0. 192 // This is equivalent to a move. 193 microOps[0] = new MicroAddiUop(machInst, INTREG_UREG0, RN, 0); 194 195 unsigned reg = 0; 196 for (int i = 1; i < ones + 1; i++) { 197 // Find the next register. 198 while (!bits(regs, reg)) 199 reg++; 200 replaceBits(regs, reg, 0); 201 |
201 if (loadop) 202 microOps[i] = new MicroLdrUop(machInst, reg, INTREG_UREG0, addr); 203 else 204 microOps[i] = new MicroStrUop(machInst, reg, INTREG_UREG0, addr); | 202 unsigned regIdx = reg; 203 if (machInst.puswl.psruser) { 204 regIdx = intRegForceUser(regIdx); 205 } |
205 | 206 |
207 if (machInst.puswl.loadOp) { 208 microOps[i] = 209 new MicroLdrUop(machInst, regIdx, INTREG_UREG0, addr); 210 } else { 211 microOps[i] = 212 new MicroStrUop(machInst, regIdx, INTREG_UREG0, addr); 213 } 214 |
|
206 if (up) 207 addr += 4; 208 else 209 addr -= 4; 210 } 211 212 StaticInstPtr &lastUop = microOps[numMicroops - 1]; | 215 if (up) 216 addr += 4; 217 else 218 addr -= 4; 219 } 220 221 StaticInstPtr &lastUop = microOps[numMicroops - 1]; |
213 if (writeback) { | 222 if (machInst.puswl.writeback) { |
214 if (up) { 215 lastUop = new MicroAddiUop(machInst, RN, RN, ones * 4); 216 } else { 217 lastUop = new MicroSubiUop(machInst, RN, RN, ones * 4); 218 } 219 } 220 lastUop->setLastMicroop(); 221} --- 111 unchanged lines hidden --- | 223 if (up) { 224 lastUop = new MicroAddiUop(machInst, RN, RN, ones * 4); 225 } else { 226 lastUop = new MicroSubiUop(machInst, RN, RN, ones * 4); 227 } 228 } 229 lastUop->setLastMicroop(); 230} --- 111 unchanged lines hidden --- |