stack_operations.py revision 11829
15432Sgblack@eecs.umich.edu# Copyright (c) 2007-2008 The Hewlett-Packard Development Company 25081Sgblack@eecs.umich.edu# All rights reserved. 35081Sgblack@eecs.umich.edu# 47087Snate@binkert.org# The license below extends only to copyright in the software and shall 57087Snate@binkert.org# not be construed as granting a license to any other intellectual 67087Snate@binkert.org# property including but not limited to intellectual property relating 77087Snate@binkert.org# to a hardware implementation of the functionality of the software 87087Snate@binkert.org# licensed hereunder. You may use the software subject to the license 97087Snate@binkert.org# terms below provided that you ensure that this notice is replicated 107087Snate@binkert.org# unmodified and in its entirety in all distributions of the software, 117087Snate@binkert.org# modified or unmodified, in source code or in binary form. 125081Sgblack@eecs.umich.edu# 137087Snate@binkert.org# Redistribution and use in source and binary forms, with or without 147087Snate@binkert.org# modification, are permitted provided that the following conditions are 157087Snate@binkert.org# met: redistributions of source code must retain the above copyright 167087Snate@binkert.org# notice, this list of conditions and the following disclaimer; 177087Snate@binkert.org# redistributions in binary form must reproduce the above copyright 187087Snate@binkert.org# notice, this list of conditions and the following disclaimer in the 197087Snate@binkert.org# documentation and/or other materials provided with the distribution; 207087Snate@binkert.org# neither the name of the copyright holders nor the names of its 215081Sgblack@eecs.umich.edu# contributors may be used to endorse or promote products derived from 227087Snate@binkert.org# this software without specific prior written permission. 235081Sgblack@eecs.umich.edu# 245081Sgblack@eecs.umich.edu# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 255081Sgblack@eecs.umich.edu# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 265081Sgblack@eecs.umich.edu# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 275081Sgblack@eecs.umich.edu# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 285081Sgblack@eecs.umich.edu# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 295081Sgblack@eecs.umich.edu# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 305081Sgblack@eecs.umich.edu# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 315081Sgblack@eecs.umich.edu# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 325081Sgblack@eecs.umich.edu# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 335081Sgblack@eecs.umich.edu# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 345081Sgblack@eecs.umich.edu# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 355081Sgblack@eecs.umich.edu# 365081Sgblack@eecs.umich.edu# Authors: Gabe Black 375081Sgblack@eecs.umich.edu 385081Sgblack@eecs.umich.edumicrocode = ''' 395081Sgblack@eecs.umich.edudef macroop POP_R { 405081Sgblack@eecs.umich.edu # Make the default data size of pops 64 bits in 64 bit mode 415081Sgblack@eecs.umich.edu .adjust_env oszIn64Override 425081Sgblack@eecs.umich.edu 4311829Sjason@lowepower.com ldis t1, ss, [1, t0, rsp], dataSize=ssz 445432Sgblack@eecs.umich.edu addi rsp, rsp, ssz, dataSize=asz 455179Sgblack@eecs.umich.edu mov reg, reg, t1 465081Sgblack@eecs.umich.edu}; 475081Sgblack@eecs.umich.edu 485081Sgblack@eecs.umich.edudef macroop POP_M { 495081Sgblack@eecs.umich.edu # Make the default data size of pops 64 bits in 64 bit mode 505081Sgblack@eecs.umich.edu .adjust_env oszIn64Override 515081Sgblack@eecs.umich.edu 5211829Sjason@lowepower.com ldis t1, ss, [1, t0, rsp], dataSize=ssz 535432Sgblack@eecs.umich.edu cda seg, sib, disp, dataSize=ssz 545432Sgblack@eecs.umich.edu addi rsp, rsp, ssz, dataSize=asz 555432Sgblack@eecs.umich.edu st t1, seg, sib, disp, dataSize=ssz 565081Sgblack@eecs.umich.edu}; 575081Sgblack@eecs.umich.edu 585081Sgblack@eecs.umich.edudef macroop POP_P { 595081Sgblack@eecs.umich.edu # Make the default data size of pops 64 bits in 64 bit mode 605081Sgblack@eecs.umich.edu .adjust_env oszIn64Override 615081Sgblack@eecs.umich.edu 625081Sgblack@eecs.umich.edu rdip t7 635432Sgblack@eecs.umich.edu ld t1, ss, [1, t0, rsp], dataSize=ssz 645432Sgblack@eecs.umich.edu cda seg, sib, disp, dataSize=ssz 655432Sgblack@eecs.umich.edu addi rsp, rsp, ssz, dataSize=asz 665432Sgblack@eecs.umich.edu st t1, seg, riprel, disp, dataSize=ssz 675081Sgblack@eecs.umich.edu}; 685081Sgblack@eecs.umich.edu 695081Sgblack@eecs.umich.edudef macroop PUSH_R { 705081Sgblack@eecs.umich.edu # Make the default data size of pops 64 bits in 64 bit mode 715081Sgblack@eecs.umich.edu .adjust_env oszIn64Override 725081Sgblack@eecs.umich.edu 7311829Sjason@lowepower.com stis reg, ss, [1, t0, rsp], "-env.stackSize", dataSize=ssz 747872Sgblack@eecs.umich.edu subi rsp, rsp, ssz 755081Sgblack@eecs.umich.edu}; 765081Sgblack@eecs.umich.edu 775081Sgblack@eecs.umich.edudef macroop PUSH_I { 785081Sgblack@eecs.umich.edu # Make the default data size of pops 64 bits in 64 bit mode 795081Sgblack@eecs.umich.edu .adjust_env oszIn64Override 805081Sgblack@eecs.umich.edu 815081Sgblack@eecs.umich.edu limm t1, imm 8211829Sjason@lowepower.com stis t1, ss, [1, t0, rsp], "-env.stackSize", dataSize=ssz 837872Sgblack@eecs.umich.edu subi rsp, rsp, ssz 845081Sgblack@eecs.umich.edu}; 855081Sgblack@eecs.umich.edu 865081Sgblack@eecs.umich.edudef macroop PUSH_M { 875081Sgblack@eecs.umich.edu # Make the default data size of pops 64 bits in 64 bit mode 885081Sgblack@eecs.umich.edu .adjust_env oszIn64Override 895081Sgblack@eecs.umich.edu 905432Sgblack@eecs.umich.edu ld t1, seg, sib, disp, dataSize=ssz 917872Sgblack@eecs.umich.edu st t1, ss, [1, t0, rsp], "-env.stackSize", dataSize=ssz 927872Sgblack@eecs.umich.edu subi rsp, rsp, ssz 935081Sgblack@eecs.umich.edu}; 945081Sgblack@eecs.umich.edu 955081Sgblack@eecs.umich.edudef macroop PUSH_P { 965081Sgblack@eecs.umich.edu # Make the default data size of pops 64 bits in 64 bit mode 975081Sgblack@eecs.umich.edu .adjust_env oszIn64Override 985081Sgblack@eecs.umich.edu 995081Sgblack@eecs.umich.edu rdip t7 1005432Sgblack@eecs.umich.edu ld t1, seg, riprel, disp, dataSize=ssz 1017872Sgblack@eecs.umich.edu st t1, ss, [1, t0, rsp], "-env.stackSize", dataSize=ssz 1027872Sgblack@eecs.umich.edu subi rsp, rsp, ssz 1035081Sgblack@eecs.umich.edu}; 1045081Sgblack@eecs.umich.edu 1055081Sgblack@eecs.umich.edudef macroop PUSHA { 1065179Sgblack@eecs.umich.edu # Check all the stack addresses. We'll assume that if the beginning and 1075179Sgblack@eecs.umich.edu # end are ok, then the stuff in the middle should be as well. 1085432Sgblack@eecs.umich.edu cda ss, [1, t0, rsp], "-env.stackSize", dataSize=ssz 1095432Sgblack@eecs.umich.edu cda ss, [1, t0, rsp], "-8 * env.stackSize", dataSize=ssz 1107872Sgblack@eecs.umich.edu st rax, ss, [1, t0, rsp], "1 * -env.stackSize", dataSize=ssz 1117872Sgblack@eecs.umich.edu st rcx, ss, [1, t0, rsp], "2 * -env.stackSize", dataSize=ssz 1127872Sgblack@eecs.umich.edu st rdx, ss, [1, t0, rsp], "3 * -env.stackSize", dataSize=ssz 1137872Sgblack@eecs.umich.edu st rbx, ss, [1, t0, rsp], "4 * -env.stackSize", dataSize=ssz 1147872Sgblack@eecs.umich.edu st rsp, ss, [1, t0, rsp], "5 * -env.stackSize", dataSize=ssz 1157872Sgblack@eecs.umich.edu st rbp, ss, [1, t0, rsp], "6 * -env.stackSize", dataSize=ssz 1167872Sgblack@eecs.umich.edu st rsi, ss, [1, t0, rsp], "7 * -env.stackSize", dataSize=ssz 1177872Sgblack@eecs.umich.edu st rdi, ss, [1, t0, rsp], "8 * -env.stackSize", dataSize=ssz 1187872Sgblack@eecs.umich.edu subi rsp, rsp, "8 * env.stackSize" 1195081Sgblack@eecs.umich.edu}; 1205081Sgblack@eecs.umich.edu 1215081Sgblack@eecs.umich.edudef macroop POPA { 1225179Sgblack@eecs.umich.edu # Check all the stack addresses. We'll assume that if the beginning and 1235179Sgblack@eecs.umich.edu # end are ok, then the stuff in the middle should be as well. 1245432Sgblack@eecs.umich.edu ld t1, ss, [1, t0, rsp], "0 * env.stackSize", dataSize=ssz 1255432Sgblack@eecs.umich.edu ld t2, ss, [1, t0, rsp], "7 * env.stackSize", dataSize=ssz 1265432Sgblack@eecs.umich.edu mov rdi, rdi, t1, dataSize=ssz 1275432Sgblack@eecs.umich.edu ld rsi, ss, [1, t0, rsp], "1 * env.stackSize", dataSize=ssz 1285432Sgblack@eecs.umich.edu ld rbp, ss, [1, t0, rsp], "2 * env.stackSize", dataSize=ssz 1295432Sgblack@eecs.umich.edu ld rbx, ss, [1, t0, rsp], "4 * env.stackSize", dataSize=ssz 1305432Sgblack@eecs.umich.edu ld rdx, ss, [1, t0, rsp], "5 * env.stackSize", dataSize=ssz 1315432Sgblack@eecs.umich.edu ld rcx, ss, [1, t0, rsp], "6 * env.stackSize", dataSize=ssz 1325432Sgblack@eecs.umich.edu mov rax, rax, t2, dataSize=ssz 1335432Sgblack@eecs.umich.edu addi rsp, rsp, "8 * env.stackSize", dataSize=asz 1345081Sgblack@eecs.umich.edu}; 1355081Sgblack@eecs.umich.edu 1365081Sgblack@eecs.umich.edudef macroop LEAVE { 1375081Sgblack@eecs.umich.edu # Make the default data size of pops 64 bits in 64 bit mode 1385081Sgblack@eecs.umich.edu .adjust_env oszIn64Override 1395081Sgblack@eecs.umich.edu 1406475Sgblack@eecs.umich.edu mov t1, t1, rbp, dataSize=ssz 14111829Sjason@lowepower.com ldis rbp, ss, [1, t0, t1], dataSize=ssz 1426475Sgblack@eecs.umich.edu mov rsp, rsp, t1, dataSize=ssz 1436475Sgblack@eecs.umich.edu addi rsp, rsp, ssz, dataSize=ssz 1445081Sgblack@eecs.umich.edu}; 1455171Sgblack@eecs.umich.edu 1465171Sgblack@eecs.umich.edudef macroop ENTER_I_I { 1476475Sgblack@eecs.umich.edu .adjust_env oszIn64Override 1485171Sgblack@eecs.umich.edu # This needs to check all the addresses it writes to before it actually 1495171Sgblack@eecs.umich.edu # writes any values. 1505171Sgblack@eecs.umich.edu 1515171Sgblack@eecs.umich.edu # Pull the different components out of the immediate 1526476Sgblack@eecs.umich.edu limm t1, imm, dataSize=8 1535927Sgblack@eecs.umich.edu zexti t2, t1, 15, dataSize=8 1546476Sgblack@eecs.umich.edu srli t1, t1, 16, dataSize=8 1555927Sgblack@eecs.umich.edu zexti t1, t1, 5, dataSize=8 1565171Sgblack@eecs.umich.edu # t1 is now the masked nesting level, and t2 is the amount of storage. 1575171Sgblack@eecs.umich.edu 1585171Sgblack@eecs.umich.edu # Push rbp. 15911829Sjason@lowepower.com stis rbp, ss, [1, t0, rsp], "-env.dataSize" 1607872Sgblack@eecs.umich.edu subi rsp, rsp, ssz 1615171Sgblack@eecs.umich.edu 1625171Sgblack@eecs.umich.edu # Save the stack pointer for later 1636475Sgblack@eecs.umich.edu mov t6, t6, rsp 1645171Sgblack@eecs.umich.edu 1655171Sgblack@eecs.umich.edu # If the nesting level is zero, skip all this stuff. 1666344Sgblack@eecs.umich.edu sub t0, t1, t0, flags=(EZF,), dataSize=2 1675661Sgblack@eecs.umich.edu br label("skipLoop"), flags=(CEZF,) 1685171Sgblack@eecs.umich.edu 1695171Sgblack@eecs.umich.edu # If the level was 1, only push the saved rbp 1705171Sgblack@eecs.umich.edu subi t0, t1, 1, flags=(EZF,) 1715661Sgblack@eecs.umich.edu br label("bottomOfLoop"), flags=(CEZF,) 1725171Sgblack@eecs.umich.edu 1735171Sgblack@eecs.umich.edu limm t4, "ULL(-1)", dataSize=8 1745171Sgblack@eecs.umich.edutopOfLoop: 17511829Sjason@lowepower.com ldis t5, ss, [dsz, t4, rbp] 17611829Sjason@lowepower.com stis t5, ss, [1, t0, rsp], "-env.dataSize" 1777872Sgblack@eecs.umich.edu subi rsp, rsp, ssz 1785171Sgblack@eecs.umich.edu 1795171Sgblack@eecs.umich.edu # If we're not done yet, loop 1805171Sgblack@eecs.umich.edu subi t4, t4, 1, dataSize=8 1815171Sgblack@eecs.umich.edu add t0, t4, t1, flags=(EZF,) 1825661Sgblack@eecs.umich.edu br label("topOfLoop"), flags=(nCEZF,) 1835171Sgblack@eecs.umich.edu 1845171Sgblack@eecs.umich.edubottomOfLoop: 1855171Sgblack@eecs.umich.edu # Push the old rbp onto the stack 18611829Sjason@lowepower.com stis t6, ss, [1, t0, rsp], "-env.dataSize" 1877872Sgblack@eecs.umich.edu subi rsp, rsp, ssz 1885171Sgblack@eecs.umich.edu 1895171Sgblack@eecs.umich.eduskipLoop: 1906475Sgblack@eecs.umich.edu sub rsp, rsp, t2, dataSize=ssz 1916475Sgblack@eecs.umich.edu mov rbp, rbp, t6 1925171Sgblack@eecs.umich.edu}; 1935081Sgblack@eecs.umich.edu''' 194