macromem.hh revision 6308
13021SN/A/* Copyright (c) 2007-2008 The Florida State University 23021SN/A * All rights reserved. 33021SN/A * 410036SAli.Saidi@ARM.com * Redistribution and use in source and binary forms, with or without 58835SAli.Saidi@ARM.com * modification, are permitted provided that the following conditions are 610036SAli.Saidi@ARM.com * met: redistributions of source code must retain the above copyright 77935SN/A * notice, this list of conditions and the following disclaimer; 87935SN/A * redistributions in binary form must reproduce the above copyright 97935SN/A * notice, this list of conditions and the following disclaimer in the 103021SN/A * documentation and/or other materials provided with the distribution; 113021SN/A * neither the name of the copyright holders nor the names of its 123021SN/A * contributors may be used to endorse or promote products derived from 139885Sstever@gmail.com * this software without specific prior written permission. 148835SAli.Saidi@ARM.com * 159885Sstever@gmail.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 169885Sstever@gmail.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1710036SAli.Saidi@ARM.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 188835SAli.Saidi@ARM.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 198835SAli.Saidi@ARM.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 208835SAli.Saidi@ARM.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 219481Snilay@cs.wisc.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 229481Snilay@cs.wisc.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 238540SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 248721SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 258835SAli.Saidi@ARM.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 268835SAli.Saidi@ARM.com * 277935SN/A * Authors: Stephen Hines 287935SN/A */ 297935SN/A#ifndef __ARCH_ARM_MACROMEM_HH__ 307935SN/A#define __ARCH_ARM_MACROMEM_HH__ 317935SN/A 327935SN/A#include "arch/arm/insts/pred_inst.hh" 337935SN/A 348983Snate@binkert.orgnamespace ArmISA 353021SN/A{ 369885Sstever@gmail.com 379885Sstever@gmail.comstatic inline unsigned int 389885Sstever@gmail.comnumber_of_ones(int32_t val) 3910036SAli.Saidi@ARM.com{ 409885Sstever@gmail.com uint32_t ones = 0; 419885Sstever@gmail.com for (int i = 0; i < 32; i++ ) 423021SN/A { 433021SN/A if ( val & (1<<i) ) 449481Snilay@cs.wisc.edu ones++; 455876SN/A } 469885Sstever@gmail.com return ones; 473171SN/A} 485876SN/A 498835SAli.Saidi@ARM.com/** 505876SN/A * Microops of the form IntRegA = IntRegB op Imm 515000SN/A */ 5210036SAli.Saidi@ARM.comclass MicroIntOp : public PredOp 533021SN/A{ 543021SN/A protected: 558835SAli.Saidi@ARM.com RegIndex ura, urb; 569481Snilay@cs.wisc.edu uint8_t imm; 575000SN/A 583021SN/A MicroIntOp(const char *mnem, ExtMachInst machInst, OpClass __opClass, 593021SN/A RegIndex _ura, RegIndex _urb, uint8_t _imm) 603021SN/A : PredOp(mnem, machInst, __opClass), 613021SN/A ura(_ura), urb(_urb), imm(_imm) 625575SN/A { 638835SAli.Saidi@ARM.com } 643171SN/A}; 659885Sstever@gmail.com 669481Snilay@cs.wisc.edu/** 673021SN/A * Arm Macro Memory operations like LDM/STM 684938SN/A */ 693021SN/Aclass ArmMacroMemoryOp : public PredMacroOp 703104SN/A{ 713104SN/A protected: 723021SN/A /// Memory request flags. See mem_req_base.hh. 733041SN/A unsigned memAccessFlags; 743041SN/A 759885Sstever@gmail.com uint32_t reglist; 768983Snate@binkert.org uint32_t ones; 773041SN/A uint32_t puswl, 789885Sstever@gmail.com prepost, 7910036SAli.Saidi@ARM.com up, 806123SN/A psruser, 819481Snilay@cs.wisc.edu writeback, 828241SN/A loadop; 833041SN/A 849481Snilay@cs.wisc.edu ArmMacroMemoryOp(const char *mnem, ExtMachInst _machInst, 855876SN/A OpClass __opClass) 868835SAli.Saidi@ARM.com : PredMacroOp(mnem, _machInst, __opClass), 879481Snilay@cs.wisc.edu memAccessFlags(0), 8810036SAli.Saidi@ARM.com reglist(machInst.regList), ones(0), 893041SN/A puswl(machInst.puswl), 908835SAli.Saidi@ARM.com prepost(machInst.puswl.prepost), 919885Sstever@gmail.com up(machInst.puswl.up), 929481Snilay@cs.wisc.edu psruser(machInst.puswl.psruser), 933041SN/A writeback(machInst.puswl.writeback), 943041SN/A loadop(machInst.puswl.loadOp) 953104SN/A { 968983Snate@binkert.org ones = number_of_ones(reglist); 973041SN/A numMicroops = ones + writeback + 1; 989885Sstever@gmail.com // Remember that writeback adds a uop 999885Sstever@gmail.com microOps = new StaticInstPtr[numMicroops]; 1009885Sstever@gmail.com } 1019885Sstever@gmail.com}; 1029885Sstever@gmail.com 10310036SAli.Saidi@ARM.com/** 1049885Sstever@gmail.com * Arm Macro FPA operations to fix ldfd and stfd instructions 10510036SAli.Saidi@ARM.com */ 1069885Sstever@gmail.comclass ArmMacroFPAOp : public PredMacroOp 1079885Sstever@gmail.com{ 1085000SN/A protected: 1096024SN/A uint32_t puswl, 11010036SAli.Saidi@ARM.com prepost, 1115355SN/A up, 1125000SN/A psruser, 1133041SN/A writeback, 1143041SN/A loadop; 1159885Sstever@gmail.com int32_t disp8; 1168983Snate@binkert.org 1173041SN/A ArmMacroFPAOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass) 1189885Sstever@gmail.com : PredMacroOp(mnem, _machInst, __opClass), 11910036SAli.Saidi@ARM.com puswl(machInst.puswl), 1206123SN/A prepost(machInst.puswl.prepost), 1219481Snilay@cs.wisc.edu up(machInst.puswl.up), 1228241SN/A psruser(machInst.puswl.psruser), 1233041SN/A writeback(machInst.puswl.writeback), 1249481Snilay@cs.wisc.edu loadop(machInst.puswl.loadOp), 1255876SN/A disp8(machInst.immed7_0 << 2) 1268835SAli.Saidi@ARM.com { 1279481Snilay@cs.wisc.edu numMicroops = 3 + writeback; 12810036SAli.Saidi@ARM.com microOps = new StaticInstPtr[numMicroops]; 1293041SN/A } 1308835SAli.Saidi@ARM.com}; 1319885Sstever@gmail.com 1329481Snilay@cs.wisc.edu/** 1333041SN/A * Arm Macro FM operations to fix lfm and sfm 1343041SN/A */ 1353104SN/Aclass ArmMacroFMOp : public PredMacroOp 1368983Snate@binkert.org{ 1373041SN/A protected: 1389885Sstever@gmail.com uint32_t punwl, 1399885Sstever@gmail.com prepost, 1409885Sstever@gmail.com up, 1419885Sstever@gmail.com n1bit, 1429885Sstever@gmail.com writeback, 14310036SAli.Saidi@ARM.com loadop, 1449885Sstever@gmail.com n0bit, 14510036SAli.Saidi@ARM.com count; 1469885Sstever@gmail.com int32_t disp8; 1479885Sstever@gmail.com 1488835SAli.Saidi@ARM.com ArmMacroFMOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass) 1498835SAli.Saidi@ARM.com : PredMacroOp(mnem, _machInst, __opClass), 15010036SAli.Saidi@ARM.com punwl(machInst.punwl), 1518835SAli.Saidi@ARM.com prepost(machInst.puswl.prepost), 1529481Snilay@cs.wisc.edu up(machInst.puswl.up), 1539481Snilay@cs.wisc.edu n1bit(machInst.opcode22), 15410036SAli.Saidi@ARM.com writeback(machInst.puswl.writeback), 1559481Snilay@cs.wisc.edu loadop(machInst.puswl.loadOp), 1569481Snilay@cs.wisc.edu n0bit(machInst.opcode15), 15710036SAli.Saidi@ARM.com disp8(machInst.immed7_0 << 2) 1589481Snilay@cs.wisc.edu { 1595000SN/A // Transfer 1-4 registers based on n1 and n0 bits (with 00 repr. 4) 1606024SN/A count = (n1bit << 1) | n0bit; 16110036SAli.Saidi@ARM.com if (count == 0) 1625355SN/A count = 4; 1635000SN/A numMicroops = (3*count) + writeback; 1643041SN/A microOps = new StaticInstPtr[numMicroops]; 1653041SN/A } 1669885Sstever@gmail.com}; 1678983Snate@binkert.org} 1689481Snilay@cs.wisc.edu 1699885Sstever@gmail.com#endif //__ARCH_ARM_INSTS_MACROMEM_HH__ 17010036SAli.Saidi@ARM.com