stack_operations.py revision 6344
15432Sgblack@eecs.umich.edu# Copyright (c) 2007-2008 The Hewlett-Packard Development Company
25081Sgblack@eecs.umich.edu# All rights reserved.
35081Sgblack@eecs.umich.edu#
45081Sgblack@eecs.umich.edu# Redistribution and use of this software in source and binary forms,
55081Sgblack@eecs.umich.edu# with or without modification, are permitted provided that the
65081Sgblack@eecs.umich.edu# following conditions are met:
75081Sgblack@eecs.umich.edu#
85081Sgblack@eecs.umich.edu# The software must be used only for Non-Commercial Use which means any
95081Sgblack@eecs.umich.edu# use which is NOT directed to receiving any direct monetary
105081Sgblack@eecs.umich.edu# compensation for, or commercial advantage from such use.  Illustrative
115081Sgblack@eecs.umich.edu# examples of non-commercial use are academic research, personal study,
125081Sgblack@eecs.umich.edu# teaching, education and corporate research & development.
135081Sgblack@eecs.umich.edu# Illustrative examples of commercial use are distributing products for
145081Sgblack@eecs.umich.edu# commercial advantage and providing services using the software for
155081Sgblack@eecs.umich.edu# commercial advantage.
165081Sgblack@eecs.umich.edu#
175081Sgblack@eecs.umich.edu# If you wish to use this software or functionality therein that may be
185081Sgblack@eecs.umich.edu# covered by patents for commercial use, please contact:
195081Sgblack@eecs.umich.edu#     Director of Intellectual Property Licensing
205081Sgblack@eecs.umich.edu#     Office of Strategy and Technology
215081Sgblack@eecs.umich.edu#     Hewlett-Packard Company
225081Sgblack@eecs.umich.edu#     1501 Page Mill Road
235081Sgblack@eecs.umich.edu#     Palo Alto, California  94304
245081Sgblack@eecs.umich.edu#
255081Sgblack@eecs.umich.edu# Redistributions of source code must retain the above copyright notice,
265081Sgblack@eecs.umich.edu# this list of conditions and the following disclaimer.  Redistributions
275081Sgblack@eecs.umich.edu# in binary form must reproduce the above copyright notice, this list of
285081Sgblack@eecs.umich.edu# conditions and the following disclaimer in the documentation and/or
295081Sgblack@eecs.umich.edu# other materials provided with the distribution.  Neither the name of
305081Sgblack@eecs.umich.edu# the COPYRIGHT HOLDER(s), HEWLETT-PACKARD COMPANY, nor the names of its
315081Sgblack@eecs.umich.edu# contributors may be used to endorse or promote products derived from
325081Sgblack@eecs.umich.edu# this software without specific prior written permission.  No right of
335081Sgblack@eecs.umich.edu# sublicense is granted herewith.  Derivatives of the software and
345081Sgblack@eecs.umich.edu# output created using the software may be prepared, but only for
355081Sgblack@eecs.umich.edu# Non-Commercial Uses.  Derivatives of the software may be shared with
365081Sgblack@eecs.umich.edu# others provided: (i) the others agree to abide by the list of
375081Sgblack@eecs.umich.edu# conditions herein which includes the Non-Commercial Use restrictions;
385081Sgblack@eecs.umich.edu# and (ii) such Derivatives of the software include the above copyright
395081Sgblack@eecs.umich.edu# notice to acknowledge the contribution from this software where
405081Sgblack@eecs.umich.edu# applicable, this list of conditions and the disclaimer below.
415081Sgblack@eecs.umich.edu#
425081Sgblack@eecs.umich.edu# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
435081Sgblack@eecs.umich.edu# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
445081Sgblack@eecs.umich.edu# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
455081Sgblack@eecs.umich.edu# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
465081Sgblack@eecs.umich.edu# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
475081Sgblack@eecs.umich.edu# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
485081Sgblack@eecs.umich.edu# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
495081Sgblack@eecs.umich.edu# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
505081Sgblack@eecs.umich.edu# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
515081Sgblack@eecs.umich.edu# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
525081Sgblack@eecs.umich.edu# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
535081Sgblack@eecs.umich.edu#
545081Sgblack@eecs.umich.edu# Authors: Gabe Black
555081Sgblack@eecs.umich.edu
565081Sgblack@eecs.umich.edumicrocode = '''
575081Sgblack@eecs.umich.edudef macroop POP_R {
585081Sgblack@eecs.umich.edu    # Make the default data size of pops 64 bits in 64 bit mode
595081Sgblack@eecs.umich.edu    .adjust_env oszIn64Override
605081Sgblack@eecs.umich.edu
615432Sgblack@eecs.umich.edu    ld t1, ss, [1, t0, rsp], dataSize=ssz
625432Sgblack@eecs.umich.edu    addi rsp, rsp, ssz, dataSize=asz
635179Sgblack@eecs.umich.edu    mov reg, reg, t1
645081Sgblack@eecs.umich.edu};
655081Sgblack@eecs.umich.edu
665081Sgblack@eecs.umich.edudef macroop POP_M {
675081Sgblack@eecs.umich.edu    # Make the default data size of pops 64 bits in 64 bit mode
685081Sgblack@eecs.umich.edu    .adjust_env oszIn64Override
695081Sgblack@eecs.umich.edu
705432Sgblack@eecs.umich.edu    ld t1, ss, [1, t0, rsp], dataSize=ssz
715432Sgblack@eecs.umich.edu    cda seg, sib, disp, dataSize=ssz
725432Sgblack@eecs.umich.edu    addi rsp, rsp, ssz, dataSize=asz
735432Sgblack@eecs.umich.edu    st t1, seg, sib, disp, dataSize=ssz
745081Sgblack@eecs.umich.edu};
755081Sgblack@eecs.umich.edu
765081Sgblack@eecs.umich.edudef macroop POP_P {
775081Sgblack@eecs.umich.edu    # Make the default data size of pops 64 bits in 64 bit mode
785081Sgblack@eecs.umich.edu    .adjust_env oszIn64Override
795081Sgblack@eecs.umich.edu
805081Sgblack@eecs.umich.edu    rdip t7
815432Sgblack@eecs.umich.edu    ld t1, ss, [1, t0, rsp], dataSize=ssz
825432Sgblack@eecs.umich.edu    cda seg, sib, disp, dataSize=ssz
835432Sgblack@eecs.umich.edu    addi rsp, rsp, ssz, dataSize=asz
845432Sgblack@eecs.umich.edu    st t1, seg, riprel, disp, dataSize=ssz
855081Sgblack@eecs.umich.edu};
865081Sgblack@eecs.umich.edu
875081Sgblack@eecs.umich.edudef macroop PUSH_R {
885081Sgblack@eecs.umich.edu    # Make the default data size of pops 64 bits in 64 bit mode
895081Sgblack@eecs.umich.edu    .adjust_env oszIn64Override
905081Sgblack@eecs.umich.edu
915432Sgblack@eecs.umich.edu    stupd reg, ss, [1, t0, rsp], "-env.stackSize", dataSize=ssz
925081Sgblack@eecs.umich.edu};
935081Sgblack@eecs.umich.edu
945081Sgblack@eecs.umich.edudef macroop PUSH_I {
955081Sgblack@eecs.umich.edu    # Make the default data size of pops 64 bits in 64 bit mode
965081Sgblack@eecs.umich.edu    .adjust_env oszIn64Override
975081Sgblack@eecs.umich.edu
985081Sgblack@eecs.umich.edu    limm t1, imm
995432Sgblack@eecs.umich.edu    stupd t1, ss, [1, t0, rsp], "-env.stackSize", dataSize=ssz
1005081Sgblack@eecs.umich.edu};
1015081Sgblack@eecs.umich.edu
1025081Sgblack@eecs.umich.edudef macroop PUSH_M {
1035081Sgblack@eecs.umich.edu    # Make the default data size of pops 64 bits in 64 bit mode
1045081Sgblack@eecs.umich.edu    .adjust_env oszIn64Override
1055081Sgblack@eecs.umich.edu
1065432Sgblack@eecs.umich.edu    ld t1, seg, sib, disp, dataSize=ssz
1075432Sgblack@eecs.umich.edu    stupd t1, ss, [1, t0, rsp], "-env.stackSize", dataSize=ssz
1085081Sgblack@eecs.umich.edu};
1095081Sgblack@eecs.umich.edu
1105081Sgblack@eecs.umich.edudef macroop PUSH_P {
1115081Sgblack@eecs.umich.edu    # Make the default data size of pops 64 bits in 64 bit mode
1125081Sgblack@eecs.umich.edu    .adjust_env oszIn64Override
1135081Sgblack@eecs.umich.edu
1145081Sgblack@eecs.umich.edu    rdip t7
1155432Sgblack@eecs.umich.edu    ld t1, seg, riprel, disp, dataSize=ssz
1165432Sgblack@eecs.umich.edu    stupd t1, ss, [1, t0, rsp], "-env.stackSize", dataSize=ssz
1175081Sgblack@eecs.umich.edu};
1185081Sgblack@eecs.umich.edu
1195081Sgblack@eecs.umich.edudef macroop PUSHA {
1205179Sgblack@eecs.umich.edu    # Check all the stack addresses. We'll assume that if the beginning and
1215179Sgblack@eecs.umich.edu    # end are ok, then the stuff in the middle should be as well.
1225432Sgblack@eecs.umich.edu    cda ss, [1, t0, rsp], "-env.stackSize", dataSize=ssz
1235432Sgblack@eecs.umich.edu    cda ss, [1, t0, rsp], "-8 * env.stackSize", dataSize=ssz
1245432Sgblack@eecs.umich.edu    stupd rax, ss, [1, t0, rsp], "-env.stackSize", dataSize=ssz
1255432Sgblack@eecs.umich.edu    stupd rcx, ss, [1, t0, rsp], "-env.stackSize", dataSize=ssz
1265432Sgblack@eecs.umich.edu    stupd rdx, ss, [1, t0, rsp], "-env.stackSize", dataSize=ssz
1275432Sgblack@eecs.umich.edu    stupd rbx, ss, [1, t0, rsp], "-env.stackSize", dataSize=ssz
1285432Sgblack@eecs.umich.edu    stupd rsp, ss, [1, t0, rsp], "-env.stackSize", dataSize=ssz
1295432Sgblack@eecs.umich.edu    stupd rbp, ss, [1, t0, rsp], "-env.stackSize", dataSize=ssz
1305432Sgblack@eecs.umich.edu    stupd rsi, ss, [1, t0, rsp], "-env.stackSize", dataSize=ssz
1315432Sgblack@eecs.umich.edu    stupd rdi, ss, [1, t0, rsp], "-env.stackSize", dataSize=ssz
1325081Sgblack@eecs.umich.edu};
1335081Sgblack@eecs.umich.edu
1345081Sgblack@eecs.umich.edudef macroop POPA {
1355179Sgblack@eecs.umich.edu    # Check all the stack addresses. We'll assume that if the beginning and
1365179Sgblack@eecs.umich.edu    # end are ok, then the stuff in the middle should be as well.
1375432Sgblack@eecs.umich.edu    ld t1, ss, [1, t0, rsp], "0 * env.stackSize", dataSize=ssz
1385432Sgblack@eecs.umich.edu    ld t2, ss, [1, t0, rsp], "7 * env.stackSize", dataSize=ssz
1395432Sgblack@eecs.umich.edu    mov rdi, rdi, t1, dataSize=ssz
1405432Sgblack@eecs.umich.edu    ld rsi, ss, [1, t0, rsp], "1 * env.stackSize", dataSize=ssz
1415432Sgblack@eecs.umich.edu    ld rbp, ss, [1, t0, rsp], "2 * env.stackSize", dataSize=ssz
1425432Sgblack@eecs.umich.edu    ld rbx, ss, [1, t0, rsp], "4 * env.stackSize", dataSize=ssz
1435432Sgblack@eecs.umich.edu    ld rdx, ss, [1, t0, rsp], "5 * env.stackSize", dataSize=ssz
1445432Sgblack@eecs.umich.edu    ld rcx, ss, [1, t0, rsp], "6 * env.stackSize", dataSize=ssz
1455432Sgblack@eecs.umich.edu    mov rax, rax, t2, dataSize=ssz
1465432Sgblack@eecs.umich.edu    addi rsp, rsp, "8 * env.stackSize", dataSize=asz
1475081Sgblack@eecs.umich.edu};
1485081Sgblack@eecs.umich.edu
1495081Sgblack@eecs.umich.edudef macroop LEAVE {
1505081Sgblack@eecs.umich.edu    # Make the default data size of pops 64 bits in 64 bit mode
1515081Sgblack@eecs.umich.edu    .adjust_env oszIn64Override
1525081Sgblack@eecs.umich.edu
1535432Sgblack@eecs.umich.edu    mov t1, t1, rbp, dataSize=asz
1545432Sgblack@eecs.umich.edu    ld rbp, ss, [1, t0, t1], dataSize=ssz
1555432Sgblack@eecs.umich.edu    mov rsp, rsp, t1, dataSize=asz
1565432Sgblack@eecs.umich.edu    addi rsp, rsp, ssz, dataSize=asz
1575081Sgblack@eecs.umich.edu};
1585171Sgblack@eecs.umich.edu
1595171Sgblack@eecs.umich.edudef macroop ENTER_I_I {
1605171Sgblack@eecs.umich.edu    # This needs to check all the addresses it writes to before it actually
1615171Sgblack@eecs.umich.edu    # writes any values.
1625171Sgblack@eecs.umich.edu
1635171Sgblack@eecs.umich.edu    # Pull the different components out of the immediate
1645171Sgblack@eecs.umich.edu    limm t1, imm
1655927Sgblack@eecs.umich.edu    zexti t2, t1, 15, dataSize=8
1666344Sgblack@eecs.umich.edu    srli t1, t1, 16
1675927Sgblack@eecs.umich.edu    zexti t1, t1, 5, dataSize=8
1685171Sgblack@eecs.umich.edu    # t1 is now the masked nesting level, and t2 is the amount of storage.
1695171Sgblack@eecs.umich.edu
1705171Sgblack@eecs.umich.edu    # Push rbp.
1715432Sgblack@eecs.umich.edu    stupd rbp, ss, [1, t0, rsp], "-env.stackSize", dataSize=ssz
1725171Sgblack@eecs.umich.edu
1735171Sgblack@eecs.umich.edu    # Save the stack pointer for later
1745432Sgblack@eecs.umich.edu    mov t6, t6, rsp, dataSize=asz
1755171Sgblack@eecs.umich.edu
1765171Sgblack@eecs.umich.edu    # If the nesting level is zero, skip all this stuff.
1776344Sgblack@eecs.umich.edu    sub t0, t1, t0, flags=(EZF,), dataSize=2
1785661Sgblack@eecs.umich.edu    br label("skipLoop"), flags=(CEZF,)
1795171Sgblack@eecs.umich.edu
1805171Sgblack@eecs.umich.edu    # If the level was 1, only push the saved rbp
1815171Sgblack@eecs.umich.edu    subi t0, t1, 1, flags=(EZF,)
1825661Sgblack@eecs.umich.edu    br label("bottomOfLoop"), flags=(CEZF,)
1835171Sgblack@eecs.umich.edu
1845171Sgblack@eecs.umich.edu    limm t4, "ULL(-1)", dataSize=8
1855171Sgblack@eecs.umich.edutopOfLoop:
1865432Sgblack@eecs.umich.edu    ld t5, ss, [ssz, t4, rbp], dataSize=ssz
1875432Sgblack@eecs.umich.edu    stupd t5, ss, [1, t0, rsp], "-env.stackSize"
1885171Sgblack@eecs.umich.edu
1895171Sgblack@eecs.umich.edu    # If we're not done yet, loop
1905171Sgblack@eecs.umich.edu    subi t4, t4, 1, dataSize=8
1915171Sgblack@eecs.umich.edu    add t0, t4, t1, flags=(EZF,)
1925661Sgblack@eecs.umich.edu    br label("topOfLoop"), flags=(nCEZF,)
1935171Sgblack@eecs.umich.edu
1945171Sgblack@eecs.umich.edubottomOfLoop:
1955171Sgblack@eecs.umich.edu    # Push the old rbp onto the stack
1965432Sgblack@eecs.umich.edu    stupd t6, ss, [1, t0, rsp], "-env.stackSize"
1975171Sgblack@eecs.umich.edu
1985171Sgblack@eecs.umich.eduskipLoop:
1995432Sgblack@eecs.umich.edu    sub rsp, rsp, t2, dataSize=asz
2005432Sgblack@eecs.umich.edu    mov rbp, rbp, t6, dataSize=asz
2015171Sgblack@eecs.umich.edu};
2025081Sgblack@eecs.umich.edu'''
203