112149Sashkan.tousimojarad@arm.com# Copyright (c) 2014-2017 ARM Limited
212149Sashkan.tousimojarad@arm.com# All rights reserved.
312149Sashkan.tousimojarad@arm.com#
412149Sashkan.tousimojarad@arm.com# The license below extends only to copyright in the software and shall
512149Sashkan.tousimojarad@arm.com# not be construed as granting a license to any other intellectual
612149Sashkan.tousimojarad@arm.com# property including but not limited to intellectual property relating
712149Sashkan.tousimojarad@arm.com# to a hardware implementation of the functionality of the software
812149Sashkan.tousimojarad@arm.com# licensed hereunder.  You may use the software subject to the license
912149Sashkan.tousimojarad@arm.com# terms below provided that you ensure that this notice is replicated
1012149Sashkan.tousimojarad@arm.com# unmodified and in its entirety in all distributions of the software,
1112149Sashkan.tousimojarad@arm.com# modified or unmodified, in source code or in binary form.
1212149Sashkan.tousimojarad@arm.com#
1312149Sashkan.tousimojarad@arm.com# Redistribution and use in source and binary forms, with or without
1412149Sashkan.tousimojarad@arm.com# modification, are permitted provided that the following conditions are
1512149Sashkan.tousimojarad@arm.com# met: redistributions of source code must retain the above copyright
1612149Sashkan.tousimojarad@arm.com# notice, this list of conditions and the following disclaimer;
1712149Sashkan.tousimojarad@arm.com# redistributions in binary form must reproduce the above copyright
1812149Sashkan.tousimojarad@arm.com# notice, this list of conditions and the following disclaimer in the
1912149Sashkan.tousimojarad@arm.com# documentation and/or other materials provided with the distribution;
2012149Sashkan.tousimojarad@arm.com# neither the name of the copyright holders nor the names of its
2112149Sashkan.tousimojarad@arm.com# contributors may be used to endorse or promote products derived from
2212149Sashkan.tousimojarad@arm.com# this software without specific prior written permission.
2312149Sashkan.tousimojarad@arm.com#
2412149Sashkan.tousimojarad@arm.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2512149Sashkan.tousimojarad@arm.com# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2612149Sashkan.tousimojarad@arm.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2712149Sashkan.tousimojarad@arm.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2812149Sashkan.tousimojarad@arm.com# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2912149Sashkan.tousimojarad@arm.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3012149Sashkan.tousimojarad@arm.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3112149Sashkan.tousimojarad@arm.com# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3212149Sashkan.tousimojarad@arm.com# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3312149Sashkan.tousimojarad@arm.com# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3412149Sashkan.tousimojarad@arm.com# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3512149Sashkan.tousimojarad@arm.com#
3612149Sashkan.tousimojarad@arm.com# Authors: Andrew Bardsley
3712149Sashkan.tousimojarad@arm.com#
3812149Sashkan.tousimojarad@arm.com
3912149Sashkan.tousimojarad@arm.com"""The High-Performance In-order (HPI) CPU timing model is tuned to be
4012149Sashkan.tousimojarad@arm.comrepresentative of a modern in-order ARMv8-A implementation. The HPI
4112149Sashkan.tousimojarad@arm.comcore and its supporting simulation scripts, namely starter_se.py and
4212149Sashkan.tousimojarad@arm.comstarter_fs.py (under /configs/example/arm/) are part of the ARM
4312149Sashkan.tousimojarad@arm.comResearch Starter Kit on System Modeling. More information can be found
4412149Sashkan.tousimojarad@arm.comat: http://www.arm.com/ResearchEnablement/SystemModeling
4512149Sashkan.tousimojarad@arm.com
4612149Sashkan.tousimojarad@arm.com"""
4712149Sashkan.tousimojarad@arm.com
4812564Sgabeblack@google.comfrom __future__ import print_function
4913774Sandreas.sandberg@arm.comfrom __future__ import absolute_import
5012564Sgabeblack@google.com
5112149Sashkan.tousimojarad@arm.comfrom m5.objects import *
5212149Sashkan.tousimojarad@arm.com
5312149Sashkan.tousimojarad@arm.com# Simple function to allow a string of [01x_] to be converted into a
5412149Sashkan.tousimojarad@arm.com# mask and value for use with MinorFUTiming
5512149Sashkan.tousimojarad@arm.comdef make_implicant(implicant_string):
5612149Sashkan.tousimojarad@arm.com    ret_mask = 0
5712149Sashkan.tousimojarad@arm.com    ret_match = 0
5812149Sashkan.tousimojarad@arm.com
5912149Sashkan.tousimojarad@arm.com    shift = False
6012149Sashkan.tousimojarad@arm.com    for char in implicant_string:
6112149Sashkan.tousimojarad@arm.com        char = char.lower()
6212149Sashkan.tousimojarad@arm.com        if shift:
6312149Sashkan.tousimojarad@arm.com            ret_mask <<= 1
6412149Sashkan.tousimojarad@arm.com            ret_match <<= 1
6512149Sashkan.tousimojarad@arm.com
6612149Sashkan.tousimojarad@arm.com        shift = True
6712149Sashkan.tousimojarad@arm.com        if char == '_':
6812149Sashkan.tousimojarad@arm.com            shift = False
6912149Sashkan.tousimojarad@arm.com        elif char == '0':
7012149Sashkan.tousimojarad@arm.com            ret_mask |= 1
7112149Sashkan.tousimojarad@arm.com        elif char == '1':
7212149Sashkan.tousimojarad@arm.com            ret_mask |= 1
7312149Sashkan.tousimojarad@arm.com            ret_match |= 1
7412149Sashkan.tousimojarad@arm.com        elif char == 'x':
7512149Sashkan.tousimojarad@arm.com            pass
7612149Sashkan.tousimojarad@arm.com        else:
7712564Sgabeblack@google.com            print("Can't parse implicant character", char)
7812149Sashkan.tousimojarad@arm.com
7912149Sashkan.tousimojarad@arm.com    return (ret_mask, ret_match)
8012149Sashkan.tousimojarad@arm.com
8112149Sashkan.tousimojarad@arm.com#                          ,----- 36 thumb
8212149Sashkan.tousimojarad@arm.com#                          | ,--- 35 bigThumb
8312149Sashkan.tousimojarad@arm.com#                          | |,-- 34 aarch64
8412149Sashkan.tousimojarad@arm.coma64_inst = make_implicant('0_01xx__xxxx_xxxx_xxxx_xxxx__xxxx_xxxx_xxxx_xxxx')
8512149Sashkan.tousimojarad@arm.coma32_inst = make_implicant('0_00xx__xxxx_xxxx_xxxx_xxxx__xxxx_xxxx_xxxx_xxxx')
8612149Sashkan.tousimojarad@arm.comt32_inst = make_implicant('1_10xx__xxxx_xxxx_xxxx_xxxx__xxxx_xxxx_xxxx_xxxx')
8712149Sashkan.tousimojarad@arm.comt16_inst = make_implicant('1_00xx__xxxx_xxxx_xxxx_xxxx__xxxx_xxxx_xxxx_xxxx')
8812149Sashkan.tousimojarad@arm.comany_inst = make_implicant('x_xxxx__xxxx_xxxx_xxxx_xxxx__xxxx_xxxx_xxxx_xxxx')
8912149Sashkan.tousimojarad@arm.com#                          | ||
9012149Sashkan.tousimojarad@arm.comany_a64_inst = \
9112149Sashkan.tousimojarad@arm.com           make_implicant('x_x1xx__xxxx_xxxx_xxxx_xxxx__xxxx_xxxx_xxxx_xxxx')
9212149Sashkan.tousimojarad@arm.comany_non_a64_inst = \
9312149Sashkan.tousimojarad@arm.com           make_implicant('x_x0xx__xxxx_xxxx_xxxx_xxxx__xxxx_xxxx_xxxx_xxxx')
9412149Sashkan.tousimojarad@arm.com
9512149Sashkan.tousimojarad@arm.comdef encode_opcode(pattern):
9612149Sashkan.tousimojarad@arm.com    def encode(opcode_string):
9712149Sashkan.tousimojarad@arm.com        a64_mask, a64_match = pattern
9812149Sashkan.tousimojarad@arm.com        mask, match = make_implicant(opcode_string)
9912149Sashkan.tousimojarad@arm.com        return (a64_mask | mask), (a64_match | match)
10012149Sashkan.tousimojarad@arm.com    return encode
10112149Sashkan.tousimojarad@arm.com
10212149Sashkan.tousimojarad@arm.coma64_opcode = encode_opcode(a64_inst)
10312149Sashkan.tousimojarad@arm.coma32_opcode = encode_opcode(a32_inst)
10412149Sashkan.tousimojarad@arm.comt32_opcode = encode_opcode(t32_inst)
10512149Sashkan.tousimojarad@arm.comt16_opcode = encode_opcode(t16_inst)
10612149Sashkan.tousimojarad@arm.com
10712149Sashkan.tousimojarad@arm.com# These definitions (in some form) should probably be part of TimingExpr
10812149Sashkan.tousimojarad@arm.com
10912149Sashkan.tousimojarad@arm.comdef literal(value):
11012149Sashkan.tousimojarad@arm.com    def body(env):
11112149Sashkan.tousimojarad@arm.com        ret = TimingExprLiteral()
11212149Sashkan.tousimojarad@arm.com        ret.value = value
11312149Sashkan.tousimojarad@arm.com        return ret
11412149Sashkan.tousimojarad@arm.com    return body
11512149Sashkan.tousimojarad@arm.com
11612149Sashkan.tousimojarad@arm.comdef bin(op, left, right):
11712149Sashkan.tousimojarad@arm.com    def body(env):
11812149Sashkan.tousimojarad@arm.com        ret = TimingExprBin()
11912149Sashkan.tousimojarad@arm.com        ret.op = 'timingExpr' + op
12012149Sashkan.tousimojarad@arm.com        ret.left = left(env)
12112149Sashkan.tousimojarad@arm.com        ret.right = right(env)
12212149Sashkan.tousimojarad@arm.com        return ret
12312149Sashkan.tousimojarad@arm.com    return body
12412149Sashkan.tousimojarad@arm.com
12512149Sashkan.tousimojarad@arm.comdef un(op, arg):
12612149Sashkan.tousimojarad@arm.com    def body(env):
12712149Sashkan.tousimojarad@arm.com        ret = TimingExprUn()
12812149Sashkan.tousimojarad@arm.com        ret.op = 'timingExpr' + op
12912149Sashkan.tousimojarad@arm.com        ret.arg = arg(env)
13012149Sashkan.tousimojarad@arm.com        return ret
13112149Sashkan.tousimojarad@arm.com    return body
13212149Sashkan.tousimojarad@arm.com
13312149Sashkan.tousimojarad@arm.comdef ref(name):
13412149Sashkan.tousimojarad@arm.com    def body(env):
13512149Sashkan.tousimojarad@arm.com        if name in env:
13612149Sashkan.tousimojarad@arm.com            ret = TimingExprRef()
13712149Sashkan.tousimojarad@arm.com            ret.index = env[name]
13812149Sashkan.tousimojarad@arm.com        else:
13912564Sgabeblack@google.com            print("Invalid expression name", name)
14012149Sashkan.tousimojarad@arm.com            ret = TimingExprNull()
14112149Sashkan.tousimojarad@arm.com        return ret
14212149Sashkan.tousimojarad@arm.com    return body
14312149Sashkan.tousimojarad@arm.com
14412149Sashkan.tousimojarad@arm.comdef if_expr(cond, true_expr, false_expr):
14512149Sashkan.tousimojarad@arm.com    def body(env):
14612149Sashkan.tousimojarad@arm.com        ret = TimingExprIf()
14712149Sashkan.tousimojarad@arm.com        ret.cond = cond(env)
14812149Sashkan.tousimojarad@arm.com        ret.trueExpr = true_expr(env)
14912149Sashkan.tousimojarad@arm.com        ret.falseExpr = false_expr(env)
15012149Sashkan.tousimojarad@arm.com        return ret
15112149Sashkan.tousimojarad@arm.com    return body
15212149Sashkan.tousimojarad@arm.com
15312149Sashkan.tousimojarad@arm.comdef src(index):
15412149Sashkan.tousimojarad@arm.com    def body(env):
15512149Sashkan.tousimojarad@arm.com        ret = TimingExprSrcReg()
15612149Sashkan.tousimojarad@arm.com        ret.index = index
15712149Sashkan.tousimojarad@arm.com        return ret
15812149Sashkan.tousimojarad@arm.com    return body
15912149Sashkan.tousimojarad@arm.com
16012149Sashkan.tousimojarad@arm.comdef int_reg(reg):
16112149Sashkan.tousimojarad@arm.com    def body(env):
16212149Sashkan.tousimojarad@arm.com        ret = TimingExprReadIntReg()
16312149Sashkan.tousimojarad@arm.com        ret.reg = reg(env)
16412149Sashkan.tousimojarad@arm.com        return ret
16512149Sashkan.tousimojarad@arm.com    return body
16612149Sashkan.tousimojarad@arm.com
16712149Sashkan.tousimojarad@arm.comdef let(bindings, expr):
16812149Sashkan.tousimojarad@arm.com    def body(env):
16912149Sashkan.tousimojarad@arm.com        ret = TimingExprLet()
17012149Sashkan.tousimojarad@arm.com        let_bindings = []
17112149Sashkan.tousimojarad@arm.com        new_env = {}
17212149Sashkan.tousimojarad@arm.com        i = 0
17312149Sashkan.tousimojarad@arm.com
17412149Sashkan.tousimojarad@arm.com        # Make the sub-expression as null to start with
17512149Sashkan.tousimojarad@arm.com        for name, binding in bindings:
17612149Sashkan.tousimojarad@arm.com            new_env[name] = i
17712149Sashkan.tousimojarad@arm.com            i += 1
17812149Sashkan.tousimojarad@arm.com
17912149Sashkan.tousimojarad@arm.com        defns = []
18012149Sashkan.tousimojarad@arm.com        # Then apply them to the produced new env
18113731Sandreas.sandberg@arm.com        for i in range(0, len(bindings)):
18212149Sashkan.tousimojarad@arm.com            name, binding_expr = bindings[i]
18312149Sashkan.tousimojarad@arm.com            defns.append(binding_expr(new_env))
18412149Sashkan.tousimojarad@arm.com
18512149Sashkan.tousimojarad@arm.com        ret.defns = defns
18612149Sashkan.tousimojarad@arm.com        ret.expr = expr(new_env)
18712149Sashkan.tousimojarad@arm.com
18812149Sashkan.tousimojarad@arm.com        return ret
18912149Sashkan.tousimojarad@arm.com    return body
19012149Sashkan.tousimojarad@arm.com
19112149Sashkan.tousimojarad@arm.comdef expr_top(expr):
19212149Sashkan.tousimojarad@arm.com    return expr([])
19312149Sashkan.tousimojarad@arm.com
19412149Sashkan.tousimojarad@arm.comclass HPI_DefaultInt(MinorFUTiming):
19512149Sashkan.tousimojarad@arm.com    description = 'HPI_DefaultInt'
19612149Sashkan.tousimojarad@arm.com    mask, match = any_non_a64_inst
19712149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [3, 3, 2, 2, 2, 1, 0]
19812149Sashkan.tousimojarad@arm.com
19912149Sashkan.tousimojarad@arm.comclass HPI_DefaultA64Int(MinorFUTiming):
20012149Sashkan.tousimojarad@arm.com    description = 'HPI_DefaultA64Int'
20112149Sashkan.tousimojarad@arm.com    mask, match = any_a64_inst
20212149Sashkan.tousimojarad@arm.com    # r, l, (c)
20312149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [2, 2, 2, 0]
20412149Sashkan.tousimojarad@arm.com
20512149Sashkan.tousimojarad@arm.comclass HPI_DefaultMul(MinorFUTiming):
20612149Sashkan.tousimojarad@arm.com    description = 'HPI_DefaultMul'
20712149Sashkan.tousimojarad@arm.com    mask, match = any_non_a64_inst
20812149Sashkan.tousimojarad@arm.com    # f, f, f, r, l, a?
20912149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0, 0]
21012149Sashkan.tousimojarad@arm.com
21112149Sashkan.tousimojarad@arm.comclass HPI_DefaultA64Mul(MinorFUTiming):
21212149Sashkan.tousimojarad@arm.com    description = 'HPI_DefaultA64Mul'
21312149Sashkan.tousimojarad@arm.com    mask, match = any_a64_inst
21412149Sashkan.tousimojarad@arm.com    # a (zr for mul), l, r
21512149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0]
21612149Sashkan.tousimojarad@arm.com    # extraCommitLat = 1
21712149Sashkan.tousimojarad@arm.com
21812149Sashkan.tousimojarad@arm.comclass HPI_DefaultVfp(MinorFUTiming):
21912149Sashkan.tousimojarad@arm.com    description = 'HPI_DefaultVfp'
22012149Sashkan.tousimojarad@arm.com    mask, match = any_non_a64_inst
22112149Sashkan.tousimojarad@arm.com    # cpsr, z, z, z, cpacr, fpexc, l_lo, r_lo, l_hi, r_hi (from vadd2h)
22212149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [5, 5, 5, 5, 5, 5,  2, 2, 2, 2, 2, 2, 2, 2, 0]
22312149Sashkan.tousimojarad@arm.com
22412149Sashkan.tousimojarad@arm.comclass HPI_DefaultA64Vfp(MinorFUTiming):
22512149Sashkan.tousimojarad@arm.com    description = 'HPI_DefaultA64Vfp'
22612149Sashkan.tousimojarad@arm.com    mask, match = any_a64_inst
22712149Sashkan.tousimojarad@arm.com    # cpsr, cpacr_el1, fpscr_exc, ...
22812149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [5, 5, 5, 2]
22912149Sashkan.tousimojarad@arm.com
23012149Sashkan.tousimojarad@arm.comclass HPI_FMADD_A64(MinorFUTiming):
23112149Sashkan.tousimojarad@arm.com    description = 'HPI_FMADD_A64'
23212149Sashkan.tousimojarad@arm.com    mask, match = a64_opcode('0001_1111_0x0x_xxxx__0xxx_xxxx_xxxx_xxxx')
23312149Sashkan.tousimojarad@arm.com    #                                    t
23412149Sashkan.tousimojarad@arm.com    # cpsr, cpacr_el1, fpscr_exc, 1, 1, 2, 2, 3, 3, fpscr_exc, d, d, d, d
23512149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [5, 5, 5,  0, 0,  0, 0,  1, 1,  0,  0, 0, 0, 0]
23612149Sashkan.tousimojarad@arm.com
23712149Sashkan.tousimojarad@arm.comclass HPI_FMSUB_D_A64(MinorFUTiming):
23812149Sashkan.tousimojarad@arm.com    description = 'HPI_FMSUB_D_A64'
23912149Sashkan.tousimojarad@arm.com    mask, match = a64_opcode('0001_1111_0x0x_xxxx__1xxx_xxxx_xxxx_xxxx')
24012149Sashkan.tousimojarad@arm.com    #                                    t
24112149Sashkan.tousimojarad@arm.com    # cpsr, cpacr_el1, fpscr_exc, 1, 1, 2, 2, 3, 3, fpscr_exc, d, d, d, d
24212149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [5, 5, 5,  0, 0,  0, 0,  1, 1,  0,  0, 0, 0, 0]
24312149Sashkan.tousimojarad@arm.com
24412149Sashkan.tousimojarad@arm.comclass HPI_FMOV_A64(MinorFUTiming):
24512149Sashkan.tousimojarad@arm.com    description = 'HPI_FMOV_A64'
24612149Sashkan.tousimojarad@arm.com    mask, match = a64_opcode('0001_1110_0x10_0000__0100_00xx_xxxx_xxxx')
24712149Sashkan.tousimojarad@arm.com    # cpsr, cpacr_el1, fpscr_exc, 1, 1, 2, 2, 3, 3, fpscr_exc, d, d, d, d
24812149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [5, 5, 5, 0]
24912149Sashkan.tousimojarad@arm.com
25012149Sashkan.tousimojarad@arm.comclass HPI_ADD_SUB_vector_scalar_A64(MinorFUTiming):
25112149Sashkan.tousimojarad@arm.com    description = 'HPI_ADD_SUB_vector_scalar_A64'
25212149Sashkan.tousimojarad@arm.com    mask, match = a64_opcode('01x1_1110_xx1x_xxxx__1000_01xx_xxxx_xxxx')
25312149Sashkan.tousimojarad@arm.com    # cpsr, z, z, z, cpacr, fpexc, l0, r0, l1, r1, l2, r2, l3, r3 (for vadd2h)
25412149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [5, 5, 5, 4]
25512149Sashkan.tousimojarad@arm.com
25612149Sashkan.tousimojarad@arm.com
25712149Sashkan.tousimojarad@arm.comclass HPI_ADD_SUB_vector_vector_A64(MinorFUTiming):
25812149Sashkan.tousimojarad@arm.com    description = 'HPI_ADD_SUB_vector_vector_A64'
25912149Sashkan.tousimojarad@arm.com    mask, match = a64_opcode('0xx0_1110_xx1x_xxxx__1000_01xx_xxxx_xxxx')
26012149Sashkan.tousimojarad@arm.com    # cpsr, z, z, z, cpacr, fpexc, l0, r0, l1, r1, l2, r2, l3, r3 (for vadd2h)
26112149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [5, 5, 5, 4]
26212149Sashkan.tousimojarad@arm.com
26312149Sashkan.tousimojarad@arm.comclass HPI_FDIV_scalar_32_A64(MinorFUTiming):
26412149Sashkan.tousimojarad@arm.com    description = 'HPI_FDIV_scalar_32_A64'
26512149Sashkan.tousimojarad@arm.com    mask, match = a64_opcode('0001_1110_001x_xxxx__0001_10xx_xxxx_xxxx')
26612149Sashkan.tousimojarad@arm.com    extraCommitLat = 6
26712149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 20,  4]
26812149Sashkan.tousimojarad@arm.com
26912149Sashkan.tousimojarad@arm.comclass HPI_FDIV_scalar_64_A64(MinorFUTiming):
27012149Sashkan.tousimojarad@arm.com    description = 'HPI_FDIV_scalar_64_A64'
27112149Sashkan.tousimojarad@arm.com    mask, match = a64_opcode('0001_1110_011x_xxxx__0001_10xx_xxxx_xxxx')
27212149Sashkan.tousimojarad@arm.com    extraCommitLat = 15
27312149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 20,  4]
27412149Sashkan.tousimojarad@arm.com
27512149Sashkan.tousimojarad@arm.com# CINC CINV CSEL CSET CSETM CSINC CSINC CSINV CSINV CSNEG
27612149Sashkan.tousimojarad@arm.comclass HPI_Cxxx_A64(MinorFUTiming):
27712149Sashkan.tousimojarad@arm.com    description = 'HPI_Cxxx_A64'
27812149Sashkan.tousimojarad@arm.com    mask, match = a64_opcode('xx01_1010_100x_xxxx_xxxx__0xxx_xxxx_xxxx')
27912149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [3, 3, 3, 2, 2]
28012149Sashkan.tousimojarad@arm.com
28112149Sashkan.tousimojarad@arm.comclass HPI_DefaultMem(MinorFUTiming):
28212149Sashkan.tousimojarad@arm.com    description = 'HPI_DefaultMem'
28312149Sashkan.tousimojarad@arm.com    mask, match = any_non_a64_inst
28412149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [1, 1, 1, 1, 1, 2]
28512149Sashkan.tousimojarad@arm.com    # Assume that LDR/STR take 2 cycles for resolving dependencies
28612149Sashkan.tousimojarad@arm.com    # (1 + 1 of the FU)
28712149Sashkan.tousimojarad@arm.com    extraAssumedLat = 2
28812149Sashkan.tousimojarad@arm.com
28912149Sashkan.tousimojarad@arm.comclass HPI_DefaultMem64(MinorFUTiming):
29012149Sashkan.tousimojarad@arm.com    description = 'HPI_DefaultMem64'
29112149Sashkan.tousimojarad@arm.com    mask, match = any_a64_inst
29212149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [2]
29312149Sashkan.tousimojarad@arm.com    # Assume that LDR/STR take 2 cycles for resolving dependencies
29412149Sashkan.tousimojarad@arm.com    # (1 + 1 of the FU)
29512149Sashkan.tousimojarad@arm.com    extraAssumedLat = 3
29612149Sashkan.tousimojarad@arm.com
29712149Sashkan.tousimojarad@arm.comclass HPI_DataProcessingMovShiftr(MinorFUTiming):
29812149Sashkan.tousimojarad@arm.com    description = 'HPI_DataProcessingMovShiftr'
29912149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0001_101x_xxxx__xxxx_xxxx_xxx1_xxxx')
30012149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [3, 3, 2, 2, 2, 1, 0]
30112149Sashkan.tousimojarad@arm.com
30212149Sashkan.tousimojarad@arm.comclass HPI_DataProcessingMayShift(MinorFUTiming):
30312149Sashkan.tousimojarad@arm.com    description = 'HPI_DataProcessingMayShift'
30412149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_000x_xxxx_xxxx__xxxx_xxxx_xxxx_xxxx')
30512149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [3, 3, 2, 2, 1, 1, 0]
30612149Sashkan.tousimojarad@arm.com
30712149Sashkan.tousimojarad@arm.comclass HPI_DataProcessingNoShift(MinorFUTiming):
30812149Sashkan.tousimojarad@arm.com    description = 'HPI_DataProcessingNoShift'
30912149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_000x_xxxx_xxxx__xxxx_0000_0xx0_xxxx')
31012149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [3, 3, 2, 2, 2, 1, 0]
31112149Sashkan.tousimojarad@arm.com
31212149Sashkan.tousimojarad@arm.comclass HPI_DataProcessingAllowShifti(MinorFUTiming):
31312149Sashkan.tousimojarad@arm.com    description = 'HPI_DataProcessingAllowShifti'
31412149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_000x_xxxx_xxxx__xxxx_xxxx_xxx0_xxxx')
31512149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [3, 3, 2, 2, 1, 1, 0]
31612149Sashkan.tousimojarad@arm.com
31712149Sashkan.tousimojarad@arm.comclass HPI_DataProcessingSuppressShift(MinorFUTiming):
31812149Sashkan.tousimojarad@arm.com    description = 'HPI_DataProcessingSuppressShift'
31912149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_000x_xxxx_xxxx__xxxx_xxxx_xxxx_xxxx')
32012149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = []
32112149Sashkan.tousimojarad@arm.com    suppress = True
32212149Sashkan.tousimojarad@arm.com
32312149Sashkan.tousimojarad@arm.comclass HPI_DataProcessingSuppressBranch(MinorFUTiming):
32412149Sashkan.tousimojarad@arm.com    description = 'HPI_DataProcessingSuppressBranch'
32512149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_1010_xxxx_xxxx__xxxx_xxxx_xxxx_xxxx')
32612149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = []
32712149Sashkan.tousimojarad@arm.com    suppress = True
32812149Sashkan.tousimojarad@arm.com
32912149Sashkan.tousimojarad@arm.comclass HPI_BFI_T1(MinorFUTiming):
33012149Sashkan.tousimojarad@arm.com    description = 'HPI_BFI_T1'
33112149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('1111_0x11_0110_xxxx__0xxx_xxxx_xxxx_xxxx')
33212149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 1, 1, 0]
33312149Sashkan.tousimojarad@arm.com
33412149Sashkan.tousimojarad@arm.comclass HPI_BFI_A1(MinorFUTiming):
33512149Sashkan.tousimojarad@arm.com    description = 'HPI_BFI_A1'
33612149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0111_110x_xxxx__xxxx_xxxx_x001_xxxx')
33712149Sashkan.tousimojarad@arm.com    # f, f, f, dest, src
33812149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 1, 1, 0]
33912149Sashkan.tousimojarad@arm.com
34012149Sashkan.tousimojarad@arm.comclass HPI_CLZ_T1(MinorFUTiming):
34112149Sashkan.tousimojarad@arm.com    description = 'HPI_CLZ_T1'
34212149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('1111_1010_1011_xxxx__1111_xxxx_1000_xxxx')
34312149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [3, 3, 2, 2, 2, 1, 0]
34412149Sashkan.tousimojarad@arm.com
34512149Sashkan.tousimojarad@arm.comclass HPI_CLZ_A1(MinorFUTiming):
34612149Sashkan.tousimojarad@arm.com    description = 'HPI_CLZ_A1'
34712149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0001_0110_xxxx__xxxx_xxxx_0001_xxxx')
34812149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [3, 3, 2, 2, 2, 1, 0]
34912149Sashkan.tousimojarad@arm.com
35012149Sashkan.tousimojarad@arm.comclass HPI_CMN_immediate_A1(MinorFUTiming):
35112149Sashkan.tousimojarad@arm.com    description = 'HPI_CMN_immediate_A1'
35212149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0011_0111_xxxx__xxxx_xxxx_xxxx_xxxx')
35312149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [3, 3, 3, 2, 2, 3, 3, 3, 0]
35412149Sashkan.tousimojarad@arm.com
35512149Sashkan.tousimojarad@arm.comclass HPI_CMN_register_A1(MinorFUTiming):
35612149Sashkan.tousimojarad@arm.com    description = 'HPI_CMN_register_A1'
35712149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0001_0111_xxxx__xxxx_xxxx_xxx0_xxxx')
35812149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [3, 3, 3, 2, 2, 3, 3, 3, 0]
35912149Sashkan.tousimojarad@arm.com
36012149Sashkan.tousimojarad@arm.comclass HPI_CMP_immediate_A1(MinorFUTiming):
36112149Sashkan.tousimojarad@arm.com    description = 'HPI_CMP_immediate_A1'
36212149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0011_0101_xxxx__xxxx_xxxx_xxxx_xxxx')
36312149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [3, 3, 3, 2, 2, 3, 3, 3, 0]
36412149Sashkan.tousimojarad@arm.com
36512149Sashkan.tousimojarad@arm.comclass HPI_CMP_register_A1(MinorFUTiming):
36612149Sashkan.tousimojarad@arm.com    description = 'HPI_CMP_register_A1'
36712149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0001_0101_xxxx__xxxx_xxxx_xxx0_xxxx')
36812149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [3, 3, 3, 2, 2, 3, 3, 3, 0]
36912149Sashkan.tousimojarad@arm.com
37012149Sashkan.tousimojarad@arm.comclass HPI_MLA_T1(MinorFUTiming):
37112149Sashkan.tousimojarad@arm.com    description = 'HPI_MLA_T1'
37212149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('1111_1011_0000_xxxx__xxxx_xxxx_0000_xxxx')
37312149Sashkan.tousimojarad@arm.com    # z, z, z, a, l?, r?
37412149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 2, 0]
37512149Sashkan.tousimojarad@arm.com
37612149Sashkan.tousimojarad@arm.comclass HPI_MLA_A1(MinorFUTiming):
37712149Sashkan.tousimojarad@arm.com    description = 'HPI_MLA_A1'
37812149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0000_001x_xxxx__xxxx_xxxx_1001_xxxx')
37912149Sashkan.tousimojarad@arm.com    # z, z, z, a, l?, r?
38012149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 2, 0]
38112149Sashkan.tousimojarad@arm.com
38212149Sashkan.tousimojarad@arm.comclass HPI_MADD_A64(MinorFUTiming):
38312149Sashkan.tousimojarad@arm.com    description = 'HPI_MADD_A64'
38412149Sashkan.tousimojarad@arm.com    mask, match = a64_opcode('x001_1011_000x_xxxx__0xxx_xxxx_xxxx_xxxx')
38512149Sashkan.tousimojarad@arm.com    # a, l?, r?
38612149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [1, 1, 1, 0]
38712149Sashkan.tousimojarad@arm.com    extraCommitLat = 1
38812149Sashkan.tousimojarad@arm.com
38912149Sashkan.tousimojarad@arm.comclass HPI_MLS_T1(MinorFUTiming):
39012149Sashkan.tousimojarad@arm.com    description = 'HPI_MLS_T1'
39112149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('1111_1011_0000_xxxx__xxxx_xxxx_0001_xxxx')
39212149Sashkan.tousimojarad@arm.com    # z, z, z, l?, a, r?
39312149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 2, 0, 0, 0]
39412149Sashkan.tousimojarad@arm.com
39512149Sashkan.tousimojarad@arm.comclass HPI_MLS_A1(MinorFUTiming):
39612149Sashkan.tousimojarad@arm.com    description = 'HPI_MLS_A1'
39712149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0000_0110_xxxx__xxxx_xxxx_1001_xxxx')
39812149Sashkan.tousimojarad@arm.com    # z, z, z, l?, a, r?
39912149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 2, 0, 0, 0]
40012149Sashkan.tousimojarad@arm.com
40112149Sashkan.tousimojarad@arm.comclass HPI_MOVT_A1(MinorFUTiming):
40212149Sashkan.tousimojarad@arm.com    description = 'HPI_MOVT_A1'
40312149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('xxxx_0010_0100_xxxx__xxxx_xxxx_xxxx_xxxx')
40412149Sashkan.tousimojarad@arm.com
40512149Sashkan.tousimojarad@arm.comclass HPI_MUL_T1(MinorFUTiming):
40612149Sashkan.tousimojarad@arm.com    description = 'HPI_MUL_T1'
40712149Sashkan.tousimojarad@arm.com    mask, match = t16_opcode('0100_0011_01xx_xxxx')
40812149Sashkan.tousimojarad@arm.comclass HPI_MUL_T2(MinorFUTiming):
40912149Sashkan.tousimojarad@arm.com    description = 'HPI_MUL_T2'
41012149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('1111_1011_0000_xxxx_1111_xxxx_0000_xxxx')
41112149Sashkan.tousimojarad@arm.com
41212149Sashkan.tousimojarad@arm.comclass HPI_PKH_T1(MinorFUTiming):
41312149Sashkan.tousimojarad@arm.com    description = 'HPI_PKH_T1'
41412149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('1110_1010_110x_xxxx__xxxx_xxxx_xxxx_xxxx')
41512149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 2, 1, 0]
41612149Sashkan.tousimojarad@arm.com
41712149Sashkan.tousimojarad@arm.comclass HPI_PKH_A1(MinorFUTiming):
41812149Sashkan.tousimojarad@arm.com    description = 'HPI_PKH_A1'
41912149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0110_1000_xxxx__xxxx_xxxx_xx01_xxxx')
42012149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 2, 1, 0]
42112149Sashkan.tousimojarad@arm.com
42212149Sashkan.tousimojarad@arm.comclass HPI_QADD_QSUB_T1(MinorFUTiming):
42312149Sashkan.tousimojarad@arm.com    description = 'HPI_QADD_QSUB_T1'
42412149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('1111_1010_1000_xxxx__1111_xxxx_10x0_xxxx')
42512149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 1, 1, 0]
42612149Sashkan.tousimojarad@arm.com
42712149Sashkan.tousimojarad@arm.comclass HPI_QADD_QSUB_A1(MinorFUTiming):
42812149Sashkan.tousimojarad@arm.com    description = 'HPI_QADD_QSUB_A1'
42912149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0001_00x0_xxxx__xxxx_xxxx_0101_xxxx')
43012149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 1, 1, 0]
43112149Sashkan.tousimojarad@arm.com
43212149Sashkan.tousimojarad@arm.com# T1 QADD16 QADD8 QSUB16 QSUB8 UQADD16 UQADD8 UQSUB16 UQSUB8
43312149Sashkan.tousimojarad@arm.comclass HPI_QADD_ETC_T1(MinorFUTiming):
43412149Sashkan.tousimojarad@arm.com    description = 'HPI_QADD_ETC_T1'
43512149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('1111_1010_1x0x_xxxx__1111_xxxx_0x01_xxxx')
43612149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 1, 1, 0]
43712149Sashkan.tousimojarad@arm.com
43812149Sashkan.tousimojarad@arm.com# A1 QADD16 QADD8 QSAX QSUB16 QSUB8 UQADD16 UQADD8 UQASX UQSAX UQSUB16 UQSUB8
43912149Sashkan.tousimojarad@arm.comclass HPI_QADD_ETC_A1(MinorFUTiming):
44012149Sashkan.tousimojarad@arm.com    description = 'HPI_QADD_ETC_A1'
44112149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0110_0x10_xxxx__xxxx_xxxx_xxx1_xxxx')
44212149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 1, 1, 0]
44312149Sashkan.tousimojarad@arm.com
44412149Sashkan.tousimojarad@arm.comclass HPI_QASX_QSAX_UQASX_UQSAX_T1(MinorFUTiming):
44512149Sashkan.tousimojarad@arm.com    description = 'HPI_QASX_QSAX_UQASX_UQSAX_T1'
44612149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('1111_1010_1x10_xxxx__1111_xxxx_0x01_xxxx')
44712149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 1, 1, 0]
44812149Sashkan.tousimojarad@arm.com
44912149Sashkan.tousimojarad@arm.comclass HPI_QDADD_QDSUB_T1(MinorFUTiming):
45012149Sashkan.tousimojarad@arm.com    description = 'HPI_QDADD_QDSUB_T1'
45112149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('1111_1010_1000_xxxx__1111_xxxx_10x1_xxxx')
45212149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 1, 0]
45312149Sashkan.tousimojarad@arm.com
45412149Sashkan.tousimojarad@arm.comclass HPI_QDADD_QDSUB_A1(MinorFUTiming):
45512149Sashkan.tousimojarad@arm.com    description = 'HPI_QDADD_QSUB_A1'
45612149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0001_01x0_xxxx__xxxx_xxxx_0101_xxxx')
45712149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 1, 0]
45812149Sashkan.tousimojarad@arm.com
45912149Sashkan.tousimojarad@arm.comclass HPI_RBIT_A1(MinorFUTiming):
46012149Sashkan.tousimojarad@arm.com    description = 'HPI_RBIT_A1'
46112149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0110_1111_xxxx__xxxx_xxxx_0011_xxxx')
46212149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 1, 0]
46312149Sashkan.tousimojarad@arm.com
46412149Sashkan.tousimojarad@arm.comclass HPI_REV_REV16_A1(MinorFUTiming):
46512149Sashkan.tousimojarad@arm.com    description = 'HPI_REV_REV16_A1'
46612149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0110_1011_xxxx__xxxx_xxxx_x011_xxxx')
46712149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 1, 0]
46812149Sashkan.tousimojarad@arm.com
46912149Sashkan.tousimojarad@arm.comclass HPI_REVSH_A1(MinorFUTiming):
47012149Sashkan.tousimojarad@arm.com    description = 'HPI_REVSH_A1'
47112149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0110_1111_xxxx__xxxx_xxxx_1011_xxxx')
47212149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 1, 0]
47312149Sashkan.tousimojarad@arm.com
47412149Sashkan.tousimojarad@arm.comclass HPI_ADD_ETC_A1(MinorFUTiming):
47512149Sashkan.tousimojarad@arm.com    description = 'HPI_ADD_ETC_A1'
47612149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0110_0xx1_xxxx__xxxx_xxxx_x001_xxxx')
47712149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 2, 2, 0]
47812149Sashkan.tousimojarad@arm.com
47912149Sashkan.tousimojarad@arm.comclass HPI_ADD_ETC_T1(MinorFUTiming):
48012149Sashkan.tousimojarad@arm.com    description = 'HPI_ADD_ETC_A1'
48112149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('1111_1010_100x_xxxx__1111_xxxx_0xx0_xxxx')
48212149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 2, 2, 0]
48312149Sashkan.tousimojarad@arm.com
48412149Sashkan.tousimojarad@arm.comclass HPI_SASX_SHASX_UASX_UHASX_A1(MinorFUTiming):
48512149Sashkan.tousimojarad@arm.com    description = 'HPI_SASX_SHASX_UASX_UHASX_A1'
48612149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0110_0xx1_xxxx__xxxx_xxxx_0011_xxxx')
48712149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [3, 3, 2, 2, 2, 1, 0]
48812149Sashkan.tousimojarad@arm.com
48912149Sashkan.tousimojarad@arm.comclass HPI_SBFX_UBFX_A1(MinorFUTiming):
49012149Sashkan.tousimojarad@arm.com    description = 'HPI_SBFX_UBFX_A1'
49112149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0111_1x1x_xxxx__xxxx_xxxx_x101_xxxx')
49212149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 1, 0]
49312149Sashkan.tousimojarad@arm.com
49412149Sashkan.tousimojarad@arm.com### SDIV
49512149Sashkan.tousimojarad@arm.com
49612149Sashkan.tousimojarad@arm.comsdiv_lat_expr = expr_top(let([
49712149Sashkan.tousimojarad@arm.com    ('left', un('SignExtend32To64', int_reg(src(4)))),
49812149Sashkan.tousimojarad@arm.com    ('right', un('SignExtend32To64', int_reg(src(3)))),
49912149Sashkan.tousimojarad@arm.com    ('either_signed', bin('Or',
50012149Sashkan.tousimojarad@arm.com        bin('SLessThan', ref('left'), literal(0)),
50112149Sashkan.tousimojarad@arm.com        bin('SLessThan', ref('right'), literal(0)))),
50212149Sashkan.tousimojarad@arm.com    ('left_size', un('SizeInBits', un('Abs', ref('left')))),
50312149Sashkan.tousimojarad@arm.com    ('signed_adjust', if_expr(ref('either_signed'), literal(1), literal(0))),
50412149Sashkan.tousimojarad@arm.com    ('right_size', un('SizeInBits',
50512149Sashkan.tousimojarad@arm.com        bin('UDiv', un('Abs', ref('right')),
50612149Sashkan.tousimojarad@arm.com            if_expr(ref('either_signed'), literal(4), literal(2))))),
50712149Sashkan.tousimojarad@arm.com    ('left_minus_right', if_expr(
50812149Sashkan.tousimojarad@arm.com        bin('SLessThan', ref('left_size'), ref('right_size')),
50912149Sashkan.tousimojarad@arm.com        literal(0),
51012149Sashkan.tousimojarad@arm.com        bin('Sub', ref('left_size'), ref('right_size'))))
51112149Sashkan.tousimojarad@arm.com    ],
51212149Sashkan.tousimojarad@arm.com    bin('Add',
51312149Sashkan.tousimojarad@arm.com        ref('signed_adjust'),
51412149Sashkan.tousimojarad@arm.com        if_expr(bin('Equal', ref('right'), literal(0)),
51512149Sashkan.tousimojarad@arm.com            literal(0),
51612149Sashkan.tousimojarad@arm.com            bin('UDiv', ref('left_minus_right'), literal(4))))
51712149Sashkan.tousimojarad@arm.com    ))
51812149Sashkan.tousimojarad@arm.com
51912149Sashkan.tousimojarad@arm.comsdiv_lat_expr64 = expr_top(let([
52012149Sashkan.tousimojarad@arm.com    ('left', un('SignExtend32To64', int_reg(src(0)))),
52112149Sashkan.tousimojarad@arm.com    ('right', un('SignExtend32To64', int_reg(src(1)))),
52212149Sashkan.tousimojarad@arm.com    ('either_signed', bin('Or',
52312149Sashkan.tousimojarad@arm.com        bin('SLessThan', ref('left'), literal(0)),
52412149Sashkan.tousimojarad@arm.com        bin('SLessThan', ref('right'), literal(0)))),
52512149Sashkan.tousimojarad@arm.com    ('left_size', un('SizeInBits', un('Abs', ref('left')))),
52612149Sashkan.tousimojarad@arm.com    ('signed_adjust', if_expr(ref('either_signed'), literal(1), literal(0))),
52712149Sashkan.tousimojarad@arm.com    ('right_size', un('SizeInBits',
52812149Sashkan.tousimojarad@arm.com        bin('UDiv', un('Abs', ref('right')),
52912149Sashkan.tousimojarad@arm.com            if_expr(ref('either_signed'), literal(4), literal(2))))),
53012149Sashkan.tousimojarad@arm.com    ('left_minus_right', if_expr(
53112149Sashkan.tousimojarad@arm.com        bin('SLessThan', ref('left_size'), ref('right_size')),
53212149Sashkan.tousimojarad@arm.com        literal(0),
53312149Sashkan.tousimojarad@arm.com        bin('Sub', ref('left_size'), ref('right_size'))))
53412149Sashkan.tousimojarad@arm.com    ],
53512149Sashkan.tousimojarad@arm.com    bin('Add',
53612149Sashkan.tousimojarad@arm.com        ref('signed_adjust'),
53712149Sashkan.tousimojarad@arm.com        if_expr(bin('Equal', ref('right'), literal(0)),
53812149Sashkan.tousimojarad@arm.com            literal(0),
53912149Sashkan.tousimojarad@arm.com            bin('UDiv', ref('left_minus_right'), literal(4))))
54012149Sashkan.tousimojarad@arm.com    ))
54112149Sashkan.tousimojarad@arm.com
54212149Sashkan.tousimojarad@arm.comclass HPI_SDIV_A1(MinorFUTiming):
54312149Sashkan.tousimojarad@arm.com    description = 'HPI_SDIV_A1'
54412149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0111_0001_xxxx__xxxx_xxxx_0001_xxxx')
54512149Sashkan.tousimojarad@arm.com    extraCommitLat = 0
54612149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = []
54712149Sashkan.tousimojarad@arm.com    extraCommitLatExpr = sdiv_lat_expr
54812149Sashkan.tousimojarad@arm.com
54912149Sashkan.tousimojarad@arm.comclass HPI_SDIV_A64(MinorFUTiming):
55012149Sashkan.tousimojarad@arm.com    description = 'HPI_SDIV_A64'
55112149Sashkan.tousimojarad@arm.com    mask, match = a64_opcode('x001_1010_110x_xxxx__0000_11xx_xxxx_xxxx')
55212149Sashkan.tousimojarad@arm.com    extraCommitLat = 0
55312149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = []
55412149Sashkan.tousimojarad@arm.com    extraCommitLatExpr = sdiv_lat_expr64
55512149Sashkan.tousimojarad@arm.com
55612149Sashkan.tousimojarad@arm.com### SEL
55712149Sashkan.tousimojarad@arm.com
55812149Sashkan.tousimojarad@arm.comclass HPI_SEL_A1(MinorFUTiming):
55912149Sashkan.tousimojarad@arm.com    description = 'HPI_SEL_A1'
56012149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0110_1000_xxxx__xxxx_xxxx_1011_xxxx')
56112149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 2, 2, 0]
56212149Sashkan.tousimojarad@arm.com
56312149Sashkan.tousimojarad@arm.comclass HPI_SEL_A1_Suppress(MinorFUTiming):
56412149Sashkan.tousimojarad@arm.com    description = 'HPI_SEL_A1_Suppress'
56512149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0110_1000_xxxx__xxxx_xxxx_1011_xxxx')
56612149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = []
56712149Sashkan.tousimojarad@arm.com    suppress = True
56812149Sashkan.tousimojarad@arm.com
56912149Sashkan.tousimojarad@arm.comclass HPI_SHSAX_SSAX_UHSAX_USAX_A1(MinorFUTiming):
57012149Sashkan.tousimojarad@arm.com    description = 'HPI_SHSAX_SSAX_UHSAX_USAX_A1'
57112149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0110_0xx1_xxxx__xxxx_xxxx_0101_xxxx')
57212149Sashkan.tousimojarad@arm.com    # As Default
57312149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [3, 3, 2, 2, 2, 1, 0]
57412149Sashkan.tousimojarad@arm.com
57512149Sashkan.tousimojarad@arm.comclass HPI_USUB_ETC_A1(MinorFUTiming):
57612149Sashkan.tousimojarad@arm.com    description = 'HPI_USUB_ETC_A1'
57712149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0110_0xx1_xxxx__xxxx_xxxx_x111_xxxx')
57812149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 2, 2, 0]
57912149Sashkan.tousimojarad@arm.com
58012149Sashkan.tousimojarad@arm.comclass HPI_SMLABB_T1(MinorFUTiming):
58112149Sashkan.tousimojarad@arm.com    description = 'HPI_SMLABB_T1'
58212149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('1111_1011_0001_xxxx__xxxx_xxxx_00xx_xxxx')
58312149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 2, 0]
58412149Sashkan.tousimojarad@arm.com
58512149Sashkan.tousimojarad@arm.comclass HPI_SMLABB_A1(MinorFUTiming):
58612149Sashkan.tousimojarad@arm.com    description = 'HPI_SMLABB_A1'
58712149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0001_0000_xxxx__xxxx_xxxx_1xx0_xxxx')
58812149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 2, 0]
58912149Sashkan.tousimojarad@arm.com
59012149Sashkan.tousimojarad@arm.comclass HPI_SMLAD_T1(MinorFUTiming):
59112149Sashkan.tousimojarad@arm.com    description = 'HPI_SMLAD_T1'
59212149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('1111_1011_0010_xxxx__xxxx_xxxx_000x_xxxx')
59312149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 2, 0]
59412149Sashkan.tousimojarad@arm.com
59512149Sashkan.tousimojarad@arm.comclass HPI_SMLAD_A1(MinorFUTiming):
59612149Sashkan.tousimojarad@arm.com    description = 'HPI_SMLAD_A1'
59712149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0111_0000_xxxx__xxxx_xxxx_00x1_xxxx')
59812149Sashkan.tousimojarad@arm.com    # z, z, z, l, r, a
59912149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 2, 0]
60012149Sashkan.tousimojarad@arm.com
60112149Sashkan.tousimojarad@arm.comclass HPI_SMLAL_T1(MinorFUTiming):
60212149Sashkan.tousimojarad@arm.com    description = 'HPI_SMLAL_T1'
60312149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('1111_1011_1100_xxxx__xxxx_xxxx_0000_xxxx')
60412149Sashkan.tousimojarad@arm.comclass HPI_SMLAL_A1(MinorFUTiming):
60512149Sashkan.tousimojarad@arm.com    description = 'HPI_SMLAL_A1'
60612149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0000_111x_xxxx__xxxx_xxxx_1001_xxxx')
60712149Sashkan.tousimojarad@arm.com
60812149Sashkan.tousimojarad@arm.comclass HPI_SMLALBB_T1(MinorFUTiming):
60912149Sashkan.tousimojarad@arm.com    description = 'HPI_SMLALBB_T1'
61012149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('1111_1011_1100_xxxx__xxxx_xxxx_10xx_xxxx')
61112149Sashkan.tousimojarad@arm.comclass HPI_SMLALBB_A1(MinorFUTiming):
61212149Sashkan.tousimojarad@arm.com    description = 'HPI_SMLALBB_A1'
61312149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0001_0100_xxxx__xxxx_xxxx_1xx0_xxxx')
61412149Sashkan.tousimojarad@arm.com
61512149Sashkan.tousimojarad@arm.comclass HPI_SMLALD_T1(MinorFUTiming):
61612149Sashkan.tousimojarad@arm.com    description = 'HPI_SMLALD_T1'
61712149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('1111_1011_1100_xxxx__xxxx_xxxx_110x_xxxx')
61812149Sashkan.tousimojarad@arm.comclass HPI_SMLALD_A1(MinorFUTiming):
61912149Sashkan.tousimojarad@arm.com    description = 'HPI_SMLALD_A1'
62012149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0111_0100_xxxx__xxxx_xxxx_00x1_xxxx')
62112149Sashkan.tousimojarad@arm.com
62212149Sashkan.tousimojarad@arm.comclass HPI_SMLAWB_T1(MinorFUTiming):
62312149Sashkan.tousimojarad@arm.com    description = 'HPI_SMLAWB_T1'
62412149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('1111_1011_0011_xxxx__xxxx_xxxx_000x_xxxx')
62512149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 2, 0]
62612149Sashkan.tousimojarad@arm.com
62712149Sashkan.tousimojarad@arm.comclass HPI_SMLAWB_A1(MinorFUTiming):
62812149Sashkan.tousimojarad@arm.com    description = 'HPI_SMLAWB_A1'
62912149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0001_0010_xxxx__xxxx_xxxx_1x00_xxxx')
63012149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 2, 0]
63112149Sashkan.tousimojarad@arm.com
63212149Sashkan.tousimojarad@arm.comclass HPI_SMLSD_A1(MinorFUTiming):
63312149Sashkan.tousimojarad@arm.com    description = 'HPI_SMLSD_A1'
63412149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0111_0000_xxxx__xxxx_xxxx_01x1_xxxx')
63512149Sashkan.tousimojarad@arm.com
63612149Sashkan.tousimojarad@arm.comclass HPI_SMLSLD_T1(MinorFUTiming):
63712149Sashkan.tousimojarad@arm.com    description = 'HPI_SMLSLD_T1'
63812149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('1111_1011_1101_xxxx__xxxx_xxxx_110x_xxxx')
63912149Sashkan.tousimojarad@arm.comclass HPI_SMLSLD_A1(MinorFUTiming):
64012149Sashkan.tousimojarad@arm.com    description = 'HPI_SMLSLD_A1'
64112149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0111_0100_xxxx__xxxx_xxxx_01x1_xxxx')
64212149Sashkan.tousimojarad@arm.com
64312149Sashkan.tousimojarad@arm.comclass HPI_SMMLA_T1(MinorFUTiming):
64412149Sashkan.tousimojarad@arm.com    description = 'HPI_SMMLA_T1'
64512149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('1111_1011_0101_xxxx__xxxx_xxxx_000x_xxxx')
64612149Sashkan.tousimojarad@arm.com    #                                              ^^^^ != 1111
64712149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 2, 0, 0, 0]
64812149Sashkan.tousimojarad@arm.com
64912149Sashkan.tousimojarad@arm.comclass HPI_SMMLA_A1(MinorFUTiming):
65012149Sashkan.tousimojarad@arm.com    description = 'HPI_SMMLA_A1'
65112149Sashkan.tousimojarad@arm.com    # Note that this must be after the encoding for SMMUL
65212149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0111_0101_xxxx__xxxx_xxxx_00x1_xxxx')
65312149Sashkan.tousimojarad@arm.com    #                                              ^^^^ != 1111
65412149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 2, 0, 0, 0]
65512149Sashkan.tousimojarad@arm.com
65612149Sashkan.tousimojarad@arm.comclass HPI_SMMLS_T1(MinorFUTiming):
65712149Sashkan.tousimojarad@arm.com    description = 'HPI_SMMLS_T1'
65812149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('1111_1011_0110_xxxx__xxxx_xxxx_000x_xxxx')
65912149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 2, 0, 0, 0]
66012149Sashkan.tousimojarad@arm.com
66112149Sashkan.tousimojarad@arm.comclass HPI_SMMLS_A1(MinorFUTiming):
66212149Sashkan.tousimojarad@arm.com    description = 'HPI_SMMLS_A1'
66312149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0111_0101_xxxx__xxxx_xxxx_11x1_xxxx')
66412149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 2, 0, 0, 0]
66512149Sashkan.tousimojarad@arm.com
66612149Sashkan.tousimojarad@arm.comclass HPI_SMMUL_T1(MinorFUTiming):
66712149Sashkan.tousimojarad@arm.com    description = 'HPI_SMMUL_T1'
66812149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('1111_1011_0101_xxxx__1111_xxxx_000x_xxxx')
66912149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0]
67012149Sashkan.tousimojarad@arm.com
67112149Sashkan.tousimojarad@arm.comclass HPI_SMMUL_A1(MinorFUTiming):
67212149Sashkan.tousimojarad@arm.com    description = 'HPI_SMMUL_A1'
67312149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0111_0101_xxxx__1111_xxxx_00x1_xxxx')
67412149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0]
67512149Sashkan.tousimojarad@arm.com
67612149Sashkan.tousimojarad@arm.comclass HPI_SMUAD_T1(MinorFUTiming):
67712149Sashkan.tousimojarad@arm.com    description = 'HPI_SMUAD_T1'
67812149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('1111_1011_0010_xxxx__1111_xxxx_000x_xxxx')
67912149Sashkan.tousimojarad@arm.comclass HPI_SMUAD_A1(MinorFUTiming):
68012149Sashkan.tousimojarad@arm.com    description = 'HPI_SMUAD_A1'
68112149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0111_0000_xxxx__1111_xxxx_00x1_xxxx')
68212149Sashkan.tousimojarad@arm.com
68312149Sashkan.tousimojarad@arm.comclass HPI_SMULBB_T1(MinorFUTiming):
68412149Sashkan.tousimojarad@arm.com    description = 'HPI_SMULBB_T1'
68512149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('1111_1011_0001_xxxx__1111_xxxx_00xx_xxxx')
68612149Sashkan.tousimojarad@arm.comclass HPI_SMULBB_A1(MinorFUTiming):
68712149Sashkan.tousimojarad@arm.com    description = 'HPI_SMULBB_A1'
68812149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0001_0110_xxxx__xxxx_xxxx_1xx0_xxxx')
68912149Sashkan.tousimojarad@arm.com
69012149Sashkan.tousimojarad@arm.comclass HPI_SMULL_T1(MinorFUTiming):
69112149Sashkan.tousimojarad@arm.com    description = 'HPI_SMULL_T1'
69212149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('1111_1011_1000_xxxx__xxxx_xxxx_0000_xxxx')
69312149Sashkan.tousimojarad@arm.comclass HPI_SMULL_A1(MinorFUTiming):
69412149Sashkan.tousimojarad@arm.com    description = 'HPI_SMULL_A1'
69512149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0000_110x_xxxx__xxxx_xxxx_1001_xxxx')
69612149Sashkan.tousimojarad@arm.com
69712149Sashkan.tousimojarad@arm.comclass HPI_SMULWB_T1(MinorFUTiming):
69812149Sashkan.tousimojarad@arm.com    description = 'HPI_SMULWB_T1'
69912149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('1111_1011_0011_xxxx__1111_xxxx_000x_xxxx')
70012149Sashkan.tousimojarad@arm.comclass HPI_SMULWB_A1(MinorFUTiming):
70112149Sashkan.tousimojarad@arm.com    description = 'HPI_SMULWB_A1'
70212149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0001_0010_xxxx__xxxx_xxxx_1x10_xxxx')
70312149Sashkan.tousimojarad@arm.com
70412149Sashkan.tousimojarad@arm.comclass HPI_SMUSD_T1(MinorFUTiming):
70512149Sashkan.tousimojarad@arm.com    description = 'HPI_SMUSD_T1'
70612149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('1111_1011_0100_xxxx__1111_xxxx_000x_xxxx')
70712149Sashkan.tousimojarad@arm.comclass HPI_SMUSD_A1(MinorFUTiming):
70812149Sashkan.tousimojarad@arm.com    description = 'HPI_SMUSD_A1'
70912149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0111_0000_xxxx__1111_xxxx_01x1_xxxx')
71012149Sashkan.tousimojarad@arm.com
71112149Sashkan.tousimojarad@arm.comclass HPI_SSAT_USAT_no_shift_A1(MinorFUTiming):
71212149Sashkan.tousimojarad@arm.com    description = 'HPI_SSAT_USAT_no_shift_A1'
71312149Sashkan.tousimojarad@arm.com    # Order *before* shift
71412149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0110_1x1x_xxxx__xxxx_0000_0001_xxxx')
71512149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 2, 0]
71612149Sashkan.tousimojarad@arm.com
71712149Sashkan.tousimojarad@arm.comclass HPI_SSAT_USAT_shift_A1(MinorFUTiming):
71812149Sashkan.tousimojarad@arm.com    description = 'HPI_SSAT_USAT_shift_A1'
71912149Sashkan.tousimojarad@arm.com    # Order after shift
72012149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0110_1x1x_xxxx__xxxx_xxxx_xx01_xxxx')
72112149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 1, 0]
72212149Sashkan.tousimojarad@arm.com
72312149Sashkan.tousimojarad@arm.comclass HPI_SSAT16_USAT16_A1(MinorFUTiming):
72412149Sashkan.tousimojarad@arm.com    description = 'HPI_SSAT16_USAT16_A1'
72512149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0110_1x10_xxxx__xxxx_xxxx_0011_xxxx')
72612149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 2, 0]
72712149Sashkan.tousimojarad@arm.com
72812149Sashkan.tousimojarad@arm.comclass HPI_SXTAB_T1(MinorFUTiming):
72912149Sashkan.tousimojarad@arm.com    description = 'HPI_SXTAB_T1'
73012149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('1111_1010_0100_xxxx__1111_xxxx_1xxx_xxxx')
73112149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 1, 2, 0]
73212149Sashkan.tousimojarad@arm.com
73312149Sashkan.tousimojarad@arm.comclass HPI_SXTAB_SXTAB16_SXTAH_UXTAB_UXTAB16_UXTAH_A1(MinorFUTiming):
73412149Sashkan.tousimojarad@arm.com    description = 'HPI_SXTAB_SXTAB16_SXTAH_UXTAB_UXTAB16_UXTAH_A1'
73512149Sashkan.tousimojarad@arm.com    # Place AFTER HPI_SXTB_SXTB16_SXTH_UXTB_UXTB16_UXTH_A1
73612149Sashkan.tousimojarad@arm.com    # e6[9d][^f]0070 are undefined
73712149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0110_1xxx_xxxx__xxxx_xxxx_0111_xxxx')
73812149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 1, 2, 0]
73912149Sashkan.tousimojarad@arm.com
74012149Sashkan.tousimojarad@arm.comclass HPI_SXTAB16_T1(MinorFUTiming):
74112149Sashkan.tousimojarad@arm.com    description = 'HPI_SXTAB16_T1'
74212149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('1111_1010_0010_xxxx__1111_xxxx_1xxx_xxxx')
74312149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 1, 2, 0]
74412149Sashkan.tousimojarad@arm.com
74512149Sashkan.tousimojarad@arm.comclass HPI_SXTAH_T1(MinorFUTiming):
74612149Sashkan.tousimojarad@arm.com    description = 'HPI_SXTAH_T1'
74712149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('1111_1010_0000_xxxx__1111_xxxx_1xxx_xxxx')
74812149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 1, 2, 0]
74912149Sashkan.tousimojarad@arm.com
75012149Sashkan.tousimojarad@arm.comclass HPI_SXTB_T1(MinorFUTiming):
75112149Sashkan.tousimojarad@arm.com    description = 'HPI_SXTB_T1'
75212149Sashkan.tousimojarad@arm.com    mask, match = t16_opcode('1011_0010_01xx_xxxx')
75312149Sashkan.tousimojarad@arm.comclass HPI_SXTB_T2(MinorFUTiming):
75412149Sashkan.tousimojarad@arm.com    description = 'HPI_SXTB_T2'
75512149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('1111_1010_0100_1111__1111_xxxx_1xxx_xxxx')
75612149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 1, 2, 0]
75712149Sashkan.tousimojarad@arm.com
75812149Sashkan.tousimojarad@arm.comclass HPI_SXTB_SXTB16_SXTH_UXTB_UXTB16_UXTH_A1(MinorFUTiming):
75912149Sashkan.tousimojarad@arm.com    description = 'HPI_SXTB_SXTB16_SXTH_UXTB_UXTB16_UXTH_A1'
76012149Sashkan.tousimojarad@arm.com    # e6[9d]f0070 are undefined
76112149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0110_1xxx_1111__xxxx_xxxx_0111_xxxx')
76212149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 2, 0]
76312149Sashkan.tousimojarad@arm.com
76412149Sashkan.tousimojarad@arm.comclass HPI_SXTB16_T1(MinorFUTiming):
76512149Sashkan.tousimojarad@arm.com    description = 'HPI_SXTB16_T1'
76612149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('1111_1010_0010_1111__1111_xxxx_1xxx_xxxx')
76712149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 1, 2, 0]
76812149Sashkan.tousimojarad@arm.com
76912149Sashkan.tousimojarad@arm.comclass HPI_SXTH_T1(MinorFUTiming):
77012149Sashkan.tousimojarad@arm.com    description = 'HPI_SXTH_T1'
77112149Sashkan.tousimojarad@arm.com    mask, match = t16_opcode('1011_0010_00xx_xxxx')
77212149Sashkan.tousimojarad@arm.comclass HPI_SXTH_T2(MinorFUTiming):
77312149Sashkan.tousimojarad@arm.com    description = 'HPI_SXTH_T2'
77412149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('1111_1010_0000_1111__1111_xxxx_1xxx_xxxx')
77512149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 1, 2, 0]
77612149Sashkan.tousimojarad@arm.com
77712149Sashkan.tousimojarad@arm.comclass HPI_UDIV_T1(MinorFUTiming):
77812149Sashkan.tousimojarad@arm.com    description = 'HPI_UDIV_T1'
77912149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('1111_1011_1011_xxxx__xxxx_xxxx_1111_xxxx')
78012149Sashkan.tousimojarad@arm.com
78112149Sashkan.tousimojarad@arm.comudiv_lat_expr = expr_top(let([
78212149Sashkan.tousimojarad@arm.com    ('left', int_reg(src(4))),
78312149Sashkan.tousimojarad@arm.com    ('right', int_reg(src(3))),
78412149Sashkan.tousimojarad@arm.com    ('left_size', un('SizeInBits', ref('left'))),
78512149Sashkan.tousimojarad@arm.com    ('right_size', un('SizeInBits',
78612149Sashkan.tousimojarad@arm.com        bin('UDiv', ref('right'), literal(2)))),
78712149Sashkan.tousimojarad@arm.com    ('left_minus_right', if_expr(
78812149Sashkan.tousimojarad@arm.com        bin('SLessThan', ref('left_size'), ref('right_size')),
78912149Sashkan.tousimojarad@arm.com        literal(0),
79012149Sashkan.tousimojarad@arm.com        bin('Sub', ref('left_size'), ref('right_size'))))
79112149Sashkan.tousimojarad@arm.com    ],
79212149Sashkan.tousimojarad@arm.com    if_expr(bin('Equal', ref('right'), literal(0)),
79312149Sashkan.tousimojarad@arm.com        literal(0),
79412149Sashkan.tousimojarad@arm.com        bin('UDiv', ref('left_minus_right'), literal(4)))
79512149Sashkan.tousimojarad@arm.com    ))
79612149Sashkan.tousimojarad@arm.com
79712149Sashkan.tousimojarad@arm.comclass HPI_UDIV_A1(MinorFUTiming):
79812149Sashkan.tousimojarad@arm.com    description = 'HPI_UDIV_A1'
79912149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0111_0011_xxxx__xxxx_xxxx_0001_xxxx')
80012149Sashkan.tousimojarad@arm.com    extraCommitLat = 0
80112149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = []
80212149Sashkan.tousimojarad@arm.com    extraCommitLatExpr = udiv_lat_expr
80312149Sashkan.tousimojarad@arm.com
80412149Sashkan.tousimojarad@arm.comclass HPI_UMAAL_T1(MinorFUTiming):
80512149Sashkan.tousimojarad@arm.com    description = 'HPI_UMAAL_T1'
80612149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('1111_1011_1110_xxxx__xxxx_xxxx_0110_xxxx')
80712149Sashkan.tousimojarad@arm.com    # z, z, z, dlo, dhi, l, r
80812149Sashkan.tousimojarad@arm.com    extraCommitLat = 1
80912149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0, 0, 0]
81012149Sashkan.tousimojarad@arm.com
81112149Sashkan.tousimojarad@arm.comclass HPI_UMAAL_A1(MinorFUTiming):
81212149Sashkan.tousimojarad@arm.com    description = 'HPI_UMAAL_A1'
81312149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0000_0100_xxxx__xxxx_xxxx_1001_xxxx')
81412149Sashkan.tousimojarad@arm.com    # z, z, z, dlo, dhi, l, r
81512149Sashkan.tousimojarad@arm.com    extraCommitLat = 1
81612149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0, 0, 0]
81712149Sashkan.tousimojarad@arm.com
81812149Sashkan.tousimojarad@arm.comclass HPI_UMLAL_T1(MinorFUTiming):
81912149Sashkan.tousimojarad@arm.com    description = 'HPI_UMLAL_T1'
82012149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('1111_1011_1110_xxxx__xxxx_xxxx_0000_xxxx')
82112149Sashkan.tousimojarad@arm.com
82212149Sashkan.tousimojarad@arm.comclass HPI_UMLAL_A1(MinorFUTiming):
82312149Sashkan.tousimojarad@arm.com    description = 'HPI_UMLAL_A1'
82412149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('xxxx_0000_101x_xxxx__xxxx_xxxx_1001_xxxx')
82512149Sashkan.tousimojarad@arm.com
82612149Sashkan.tousimojarad@arm.comclass HPI_UMULL_T1(MinorFUTiming):
82712149Sashkan.tousimojarad@arm.com    description = 'HPI_UMULL_T1'
82812149Sashkan.tousimojarad@arm.com    mask, match = t32_opcode('1111_1011_1010_xxxx__xxxx_xxxx_0000_xxxx')
82912149Sashkan.tousimojarad@arm.com
83012149Sashkan.tousimojarad@arm.comclass HPI_UMULL_A1(MinorFUTiming):
83112149Sashkan.tousimojarad@arm.com    description = 'HPI_UMULL_A1'
83212149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0000_100x_xxxx__xxxx_xxxx_1001_xxxx')
83312149Sashkan.tousimojarad@arm.com
83412149Sashkan.tousimojarad@arm.comclass HPI_USAD8_USADA8_A1(MinorFUTiming):
83512149Sashkan.tousimojarad@arm.com    description = 'HPI_USAD8_USADA8_A1'
83612149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0111_1000_xxxx__xxxx_xxxx_0001_xxxx')
83712149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 2, 0]
83812149Sashkan.tousimojarad@arm.com
83912149Sashkan.tousimojarad@arm.comclass HPI_USAD8_USADA8_A1_Suppress(MinorFUTiming):
84012149Sashkan.tousimojarad@arm.com    description = 'HPI_USAD8_USADA8_A1_Suppress'
84112149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_0111_1000_xxxx__xxxx_xxxx_0001_xxxx')
84212149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = []
84312149Sashkan.tousimojarad@arm.com    suppress = True
84412149Sashkan.tousimojarad@arm.com
84512149Sashkan.tousimojarad@arm.comclass HPI_VMOV_immediate_A1(MinorFUTiming):
84612149Sashkan.tousimojarad@arm.com    description = 'HPI_VMOV_register_A1'
84712149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_0010_0x10_xxxx_xxxx_0001_xxx1_xxxx')
84812149Sashkan.tousimojarad@arm.com    # cpsr, z, z, z, hcptr, nsacr, cpacr, fpexc, scr
84912149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [5, 5, 5, 5, 5, 5, 5, 5, 5, 0]
85012149Sashkan.tousimojarad@arm.com
85112149Sashkan.tousimojarad@arm.comclass HPI_VMRS_A1(MinorFUTiming):
85212149Sashkan.tousimojarad@arm.com    description = 'HPI_VMRS_A1'
85312149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_1110_1111_0001_xxxx_1010_xxx1_xxxx')
85412149Sashkan.tousimojarad@arm.com    # cpsr,z,z,z,hcptr,nsacr,cpacr,scr,r42
85512149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [5, 5, 5, 5, 5, 5, 5, 5, 5, 0]
85612149Sashkan.tousimojarad@arm.com
85712149Sashkan.tousimojarad@arm.comclass HPI_VMOV_register_A2(MinorFUTiming):
85812149Sashkan.tousimojarad@arm.com    description = 'HPI_VMOV_register_A2'
85912149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_1110_1x11_0000_xxxx_101x_01x0_xxxx')
86012149Sashkan.tousimojarad@arm.com    # cpsr, z, r39, z, hcptr, nsacr, cpacr, fpexc, scr, f4, f5, f0, f1
86112149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = \
86212149Sashkan.tousimojarad@arm.com        [5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 0]
86312149Sashkan.tousimojarad@arm.com
86412149Sashkan.tousimojarad@arm.com# VADD.I16 D/VADD.F32 D/VADD.I8 D/VADD.I32 D
86512149Sashkan.tousimojarad@arm.comclass HPI_VADD2H_A32(MinorFUTiming):
86612149Sashkan.tousimojarad@arm.com    description = 'Vadd2hALU'
86712149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_0010_0xxx_xxxx__xxxx_1000_xxx0_xxxx')
86812149Sashkan.tousimojarad@arm.com    # cpsr, z, z, z, cpacr, fpexc, l0, r0, l1, r1, l2, r2, l3, r3 (for vadd2h)
86912149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  4, 4, 4, 4, 4, 4, 4, 4, 0]
87012149Sashkan.tousimojarad@arm.com
87112149Sashkan.tousimojarad@arm.com# VAQQHN.I16 Q/VAQQHN.I32 Q/VAQQHN.I64 Q
87212149Sashkan.tousimojarad@arm.comclass HPI_VADDHN_A32(MinorFUTiming):
87312149Sashkan.tousimojarad@arm.com    description = 'VaddhnALU'
87412149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_0010_1xxx_xxxx__xxxx_0100_x0x0_xxxx')
87512149Sashkan.tousimojarad@arm.com    # cpsr, z, z, z, cpacr, fpexc, l0, l1, l2, l3, r0, r1, r2, r3
87612149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  3, 3, 3, 3, 3, 3, 3, 3, 0]
87712149Sashkan.tousimojarad@arm.com
87812149Sashkan.tousimojarad@arm.comclass HPI_VADDL_A32(MinorFUTiming):
87912149Sashkan.tousimojarad@arm.com    description = 'VaddlALU'
88012149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_001x_1xxx_xxxx__xxxx_0000_x0x0_xxxx')
88112149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  3, 3, 3, 3, 3, 3, 3, 3, 0]
88212149Sashkan.tousimojarad@arm.com
88312149Sashkan.tousimojarad@arm.comclass HPI_VADDW_A32(MinorFUTiming):
88412149Sashkan.tousimojarad@arm.com    description = 'HPI_VADDW_A32'
88512149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_001x_1xxx_xxxx__xxxx_0001_x0x0_xxxx')
88612149Sashkan.tousimojarad@arm.com    # cpsr, z, z, z, cpacr, fpexc, l0, l1, l2, l3, r0, r1
88712149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  4, 4, 4, 4, 3, 3, 0]
88812149Sashkan.tousimojarad@arm.com
88912149Sashkan.tousimojarad@arm.com# VHADD/VHSUB S8,S16,S32,U8,U16,U32 Q and D
89012149Sashkan.tousimojarad@arm.comclass HPI_VHADD_A32(MinorFUTiming):
89112149Sashkan.tousimojarad@arm.com    description = 'HPI_VHADD_A32'
89212149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_001x_0xxx_xxxx__xxxx_00x0_xxx0_xxxx')
89312149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  4, 4, 4, 4, 4, 4, 4, 4, 0]
89412149Sashkan.tousimojarad@arm.com
89512149Sashkan.tousimojarad@arm.comclass HPI_VPADAL_A32(MinorFUTiming):
89612149Sashkan.tousimojarad@arm.com    description = 'VpadalALU'
89712149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_0011_1x11_xx00__xxxx_0110_xxx0_xxxx')
89812149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  2, 2, 2, 2, 2, 2, 2, 2, 0]
89912149Sashkan.tousimojarad@arm.com
90012149Sashkan.tousimojarad@arm.com# VPADDH.I16
90112149Sashkan.tousimojarad@arm.comclass HPI_VPADDH_A32(MinorFUTiming):
90212149Sashkan.tousimojarad@arm.com    description = 'VpaddhALU'
90312149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_0010_0xxx_xxxx__xxxx_1011_xxx1_xxxx')
90412149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  3, 3, 3, 3, 3, 3, 3, 3, 0]
90512149Sashkan.tousimojarad@arm.com
90612149Sashkan.tousimojarad@arm.com# VPADDH.F32
90712149Sashkan.tousimojarad@arm.comclass HPI_VPADDS_A32(MinorFUTiming):
90812149Sashkan.tousimojarad@arm.com    description = 'VpaddsALU'
90912149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_0011_0x0x_xxxx__xxxx_1101_xxx0_xxxx')
91012149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  2, 2, 2, 2, 2, 2, 2, 2, 0]
91112149Sashkan.tousimojarad@arm.com
91212149Sashkan.tousimojarad@arm.com# VPADDL.S16
91312149Sashkan.tousimojarad@arm.comclass HPI_VPADDL_A32(MinorFUTiming):
91412149Sashkan.tousimojarad@arm.com    description = 'VpaddlALU'
91512149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_0011_1x11_xx00__xxxx_0010_xxx0_xxxx')
91612149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  3, 3, 3, 3, 3, 3, 3, 3, 0]
91712149Sashkan.tousimojarad@arm.com
91812149Sashkan.tousimojarad@arm.com# VRADDHN.I16
91912149Sashkan.tousimojarad@arm.comclass HPI_VRADDHN_A32(MinorFUTiming):
92012149Sashkan.tousimojarad@arm.com    description = 'HPI_VRADDHN_A32'
92112149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_0011_1xxx_xxxx__xxxx_0100_x0x0_xxxx')
92212149Sashkan.tousimojarad@arm.com    # cpsr, z, z, z, cpacr, fpexc, l0, l1, l2, l3, r0, r1, r2, r3
92312149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  4, 4, 4, 4, 4, 4, 4, 4, 0]
92412149Sashkan.tousimojarad@arm.com
92512149Sashkan.tousimojarad@arm.comclass HPI_VRHADD_A32(MinorFUTiming):
92612149Sashkan.tousimojarad@arm.com    description = 'VrhaddALU'
92712149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_001x_0xxx_xxxx__xxxx_0001_xxx0_xxxx')
92812149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  4, 4, 4, 4, 4, 4, 4, 4, 0]
92912149Sashkan.tousimojarad@arm.com
93012149Sashkan.tousimojarad@arm.comclass HPI_VQADD_A32(MinorFUTiming):
93112149Sashkan.tousimojarad@arm.com    description = 'VqaddALU'
93212149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_001x_0xxx_xxxx__xxxx_0000_xxx1_xxxx')
93312149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  3, 3, 3, 3, 3, 3, 3, 3, 0]
93412149Sashkan.tousimojarad@arm.com
93512149Sashkan.tousimojarad@arm.comclass HPI_VANDQ_A32(MinorFUTiming):
93612149Sashkan.tousimojarad@arm.com    description = 'VandqALU'
93712149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_0010_0x00_xxxx__xxxx_0001_xxx1_xxxx')
93812149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  5, 5, 5, 5, 5, 5, 5, 5, 0]
93912149Sashkan.tousimojarad@arm.com
94012149Sashkan.tousimojarad@arm.com# VMUL (integer)
94112149Sashkan.tousimojarad@arm.comclass HPI_VMULI_A32(MinorFUTiming):
94212149Sashkan.tousimojarad@arm.com    description = 'VmuliALU'
94312149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_001x_0xxx_xxxx__xxxx_1001_xxx1_xxxx')
94412149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  2, 2, 2, 2, 2, 2, 2, 2, 0]
94512149Sashkan.tousimojarad@arm.com
94612149Sashkan.tousimojarad@arm.com# VBIC (reg)
94712149Sashkan.tousimojarad@arm.comclass HPI_VBIC_A32(MinorFUTiming):
94812149Sashkan.tousimojarad@arm.com    description = 'VbicALU'
94912149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_0010_0x01_xxxx__xxxx_0001_xxx1_xxxx')
95012149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  5, 5, 5, 5, 5, 5, 5, 5, 0]
95112149Sashkan.tousimojarad@arm.com
95212149Sashkan.tousimojarad@arm.com# VBIF VBIT VBSL
95312149Sashkan.tousimojarad@arm.comclass HPI_VBIF_ETC_A32(MinorFUTiming):
95412149Sashkan.tousimojarad@arm.com    description = 'VbifALU'
95512149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_0011_0xxx_xxxx__xxxx_0001_xxx1_xxxx')
95612149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = \
95712149Sashkan.tousimojarad@arm.com        [0, 0, 0, 0, 0, 0,  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0]
95812149Sashkan.tousimojarad@arm.com
95912149Sashkan.tousimojarad@arm.comclass HPI_VACGE_A32(MinorFUTiming):
96012149Sashkan.tousimojarad@arm.com    description = 'VacgeALU'
96112149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_0011_0xxx_xxxx__xxxx_1110_xxx1_xxxx')
96212149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  4, 4, 4, 4, 4, 4, 4, 4, 4, 0]
96312149Sashkan.tousimojarad@arm.com
96412149Sashkan.tousimojarad@arm.com# VCEQ.F32
96512149Sashkan.tousimojarad@arm.comclass HPI_VCEQ_A32(MinorFUTiming):
96612149Sashkan.tousimojarad@arm.com    description = 'VceqALU'
96712149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_0010_0x0x_xxxx__xxxx_1110_xxx0_xxxx')
96812149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  4, 4, 4, 4, 4, 4, 4, 4, 4, 0]
96912149Sashkan.tousimojarad@arm.com
97012149Sashkan.tousimojarad@arm.com# VCEQ.[IS]... register
97112149Sashkan.tousimojarad@arm.comclass HPI_VCEQI_A32(MinorFUTiming):
97212149Sashkan.tousimojarad@arm.com    description = 'VceqiALU'
97312149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_0011_0xxx_xxxx__xxxx_1000_xxx1_xxxx')
97412149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  4, 4, 4, 4, 4, 4, 4, 4, 4, 0]
97512149Sashkan.tousimojarad@arm.com
97612149Sashkan.tousimojarad@arm.com# VCEQ.[IS]... immediate
97712149Sashkan.tousimojarad@arm.comclass HPI_VCEQII_A32(MinorFUTiming):
97812149Sashkan.tousimojarad@arm.com    description = 'HPI_VCEQII_A32'
97912149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_0011_1x11_xx01__xxxx_0x01_0xx0_xxxx')
98012149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  4, 4, 4, 4, 4, 4, 4, 4, 4, 0]
98112149Sashkan.tousimojarad@arm.com
98212149Sashkan.tousimojarad@arm.comclass HPI_VTST_A32(MinorFUTiming):
98312149Sashkan.tousimojarad@arm.com    description = 'HPI_VTST_A32'
98412149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_0010_0xxx_xxxx__xxxx_1000_xxx1_xxxx')
98512149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  3, 3, 3, 3, 3, 3, 3, 3, 3, 0]
98612149Sashkan.tousimojarad@arm.com
98712149Sashkan.tousimojarad@arm.comclass HPI_VCLZ_A32(MinorFUTiming):
98812149Sashkan.tousimojarad@arm.com    description = 'HPI_VCLZ_A32'
98912149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_0011_1x11_xx00__xxxx_0100_1xx0_xxxx')
99012149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  4, 4, 4, 4, 4, 4, 4, 4, 4, 0]
99112149Sashkan.tousimojarad@arm.com
99212149Sashkan.tousimojarad@arm.comclass HPI_VCNT_A32(MinorFUTiming):
99312149Sashkan.tousimojarad@arm.com    description = 'HPI_VCNT_A32'
99412149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_0011_1x11_xx00__xxxx_0101_0xx0_xxxx')
99512149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  4, 4, 4, 4, 4, 4, 4, 4, 4, 0]
99612149Sashkan.tousimojarad@arm.com
99712149Sashkan.tousimojarad@arm.comclass HPI_VEXT_A32(MinorFUTiming):
99812149Sashkan.tousimojarad@arm.com    description = 'HPI_VCNT_A32'
99912149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_0010_1x11_xxxx__xxxx_xxxx_xxx0_xxxx')
100012149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  4, 4, 4, 4, 4, 4, 4, 4, 4, 0]
100112149Sashkan.tousimojarad@arm.com
100212149Sashkan.tousimojarad@arm.com# VMAX VMIN integer
100312149Sashkan.tousimojarad@arm.comclass HPI_VMAXI_A32(MinorFUTiming):
100412149Sashkan.tousimojarad@arm.com    description = 'HPI_VMAXI_A32'
100512149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_001x_0xxx_xxxx__xxxx_0110_xxxx_xxxx')
100612149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  4, 4, 4, 4, 4, 4, 4, 4, 4, 0]
100712149Sashkan.tousimojarad@arm.com
100812149Sashkan.tousimojarad@arm.com# VMAX VMIN float
100912149Sashkan.tousimojarad@arm.comclass HPI_VMAXS_A32(MinorFUTiming):
101012149Sashkan.tousimojarad@arm.com    description = 'HPI_VMAXS_A32'
101112149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_0010_0xxx_xxxx__xxxx_1111_xxx0_xxxx')
101212149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  2, 2, 2, 2, 2, 2, 2, 2, 2, 0]
101312149Sashkan.tousimojarad@arm.com
101412149Sashkan.tousimojarad@arm.com# VNEG integer
101512149Sashkan.tousimojarad@arm.comclass HPI_VNEGI_A32(MinorFUTiming):
101612149Sashkan.tousimojarad@arm.com    description = 'HPI_VNEGI_A32'
101712149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_0011_1x11_xx01__xxxx_0x11_1xx0_xxxx')
101812149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  4, 4, 4, 4, 4, 4, 4, 4, 4, 0]
101912149Sashkan.tousimojarad@arm.com
102012149Sashkan.tousimojarad@arm.com# VNEG float
102112149Sashkan.tousimojarad@arm.comclass HPI_VNEGF_A32(MinorFUTiming):
102212149Sashkan.tousimojarad@arm.com    description = 'HPI_VNEGF_A32'
102312149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_1110_1x11_0001__xxxx_101x_01x0_xxxx')
102412149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  2, 2, 2, 2, 2, 2, 2, 2, 2, 0]
102512149Sashkan.tousimojarad@arm.com
102612149Sashkan.tousimojarad@arm.com# VREV16 VREV32 VREV64
102712149Sashkan.tousimojarad@arm.comclass HPI_VREVN_A32(MinorFUTiming):
102812149Sashkan.tousimojarad@arm.com    description = 'HPI_VREVN_A32'
102912149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_0011_1x11_xx00__xxxx_000x_xxx0_xxxx')
103012149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  4, 4, 4, 4, 4, 4, 4, 4, 4, 0]
103112149Sashkan.tousimojarad@arm.com
103212149Sashkan.tousimojarad@arm.comclass HPI_VQNEG_A32(MinorFUTiming):
103312149Sashkan.tousimojarad@arm.com    description = 'HPI_VQNEG_A32'
103412149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_0011_1x11_xx00__xxxx_0111_1xx0_xxxx')
103512149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  3, 3, 3, 3, 3, 3, 3, 3, 3, 0]
103612149Sashkan.tousimojarad@arm.com
103712149Sashkan.tousimojarad@arm.comclass HPI_VSWP_A32(MinorFUTiming):
103812149Sashkan.tousimojarad@arm.com    description = 'HPI_VSWP_A32'
103912149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_0011_1x11_xx10__xxxx_0000_0xx0_xxxx')
104012149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  4, 4, 4, 4, 4, 4, 4, 4, 0]
104112149Sashkan.tousimojarad@arm.com
104212149Sashkan.tousimojarad@arm.comclass HPI_VTRN_A32(MinorFUTiming):
104312149Sashkan.tousimojarad@arm.com    description = 'HPI_VTRN_A32'
104412149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_0011_1x11_xx10__xxxx_0000_1xx0_xxxx')
104512149Sashkan.tousimojarad@arm.com    # cpsr, z, z, z, cpact, fpexc, o0, d0, o1, d1, o2, d2, o3, d3
104612149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  2, 2, 2, 2, 2, 2, 2, 2, 0]
104712149Sashkan.tousimojarad@arm.com
104812149Sashkan.tousimojarad@arm.com# VQMOVN VQMOVUN
104912149Sashkan.tousimojarad@arm.comclass HPI_VQMOVN_A32(MinorFUTiming):
105012149Sashkan.tousimojarad@arm.com    description = 'HPI_VQMOVN_A32'
105112149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_0011_1x11_xx10__xxxx_0010_xxx0_xxxx')
105212149Sashkan.tousimojarad@arm.com    # cpsr, z, z, z, cpact, fpexc, o[0], o[1], o[2], o[3], fpscr
105312149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  2, 2, 2, 2,  2, 0]
105412149Sashkan.tousimojarad@arm.com
105512149Sashkan.tousimojarad@arm.com# VUZP double word
105612149Sashkan.tousimojarad@arm.comclass HPI_VUZP_A32(MinorFUTiming):
105712149Sashkan.tousimojarad@arm.com    description = 'HPI_VUZP_A32'
105812149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_0011_1x11_xx10__xxxx_0001_00x0_xxxx')
105912149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  3, 3, 3, 3, 3, 3, 3, 3, 0]
106012149Sashkan.tousimojarad@arm.com
106112149Sashkan.tousimojarad@arm.com# VDIV.F32
106212149Sashkan.tousimojarad@arm.comclass HPI_VDIV32_A32(MinorFUTiming):
106312149Sashkan.tousimojarad@arm.com    description = 'HPI_VDIV32_A32'
106412149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_1110_1x00_xxxx__xxxx_1010_x0x0_xxxx')
106512149Sashkan.tousimojarad@arm.com    # cpsr, z, z, z, cpact, fpexc, fpscr_exc, l, r
106612149Sashkan.tousimojarad@arm.com    extraCommitLat = 9
106712149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0, 20,  4, 4, 0]
106812149Sashkan.tousimojarad@arm.com
106912149Sashkan.tousimojarad@arm.com# VDIV.F64
107012149Sashkan.tousimojarad@arm.comclass HPI_VDIV64_A32(MinorFUTiming):
107112149Sashkan.tousimojarad@arm.com    description = 'HPI_VDIV64_A32'
107212149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_1110_1x00_xxxx__xxxx_1011_x0x0_xxxx')
107312149Sashkan.tousimojarad@arm.com    # cpsr, z, z, z, cpact, fpexc, fpscr_exc, l, r
107412149Sashkan.tousimojarad@arm.com    extraCommitLat = 18
107512149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0, 20,  4, 4, 0]
107612149Sashkan.tousimojarad@arm.com
107712149Sashkan.tousimojarad@arm.comclass HPI_VZIP_A32(MinorFUTiming):
107812149Sashkan.tousimojarad@arm.com    description = 'HPI_VZIP_A32'
107912149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_0011_1x11_xx10__xxxx_0001_1xx0_xxxx')
108012149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  4, 4, 4, 4, 4, 4, 4, 4, 0]
108112149Sashkan.tousimojarad@arm.com
108212149Sashkan.tousimojarad@arm.com# VPMAX integer
108312149Sashkan.tousimojarad@arm.comclass HPI_VPMAX_A32(MinorFUTiming):
108412149Sashkan.tousimojarad@arm.com    description = 'HPI_VPMAX_A32'
108512149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_001x_0xxx_xxxx__xxxx_1010_xxxx_xxxx')
108612149Sashkan.tousimojarad@arm.com    # cpsr, z, z, z, cpact, fpexc, l0, r0, l1, r1, fpscr
108712149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  4, 4, 4, 4,  4, 0]
108812149Sashkan.tousimojarad@arm.com
108912149Sashkan.tousimojarad@arm.com# VPMAX float
109012149Sashkan.tousimojarad@arm.comclass HPI_VPMAXF_A32(MinorFUTiming):
109112149Sashkan.tousimojarad@arm.com    description = 'HPI_VPMAXF_A32'
109212149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_0011_0xxx_xxxx__xxxx_1111_xxx0_xxxx')
109312149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  2, 2, 2, 2, 0]
109412149Sashkan.tousimojarad@arm.com
109512149Sashkan.tousimojarad@arm.comclass HPI_VMOVN_A32(MinorFUTiming):
109612149Sashkan.tousimojarad@arm.com    description = 'HPI_VMOVN_A32'
109712149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_0011_1x11_xx10__xxxx_0010_00x0_xxxx')
109812149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  4, 4, 4, 4, 0]
109912149Sashkan.tousimojarad@arm.com
110012149Sashkan.tousimojarad@arm.comclass HPI_VMOVL_A32(MinorFUTiming):
110112149Sashkan.tousimojarad@arm.com    description = 'HPI_VMOVL_A32'
110212149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('1111_001x_1xxx_x000__xxxx_1010_00x1_xxxx')
110312149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = [0, 0, 0, 0, 0, 0,  4, 4, 4, 4, 0]
110412149Sashkan.tousimojarad@arm.com
110512149Sashkan.tousimojarad@arm.com# VSQRT.F64
110612149Sashkan.tousimojarad@arm.comclass HPI_VSQRT64_A32(MinorFUTiming):
110712149Sashkan.tousimojarad@arm.com    description = 'HPI_VSQRT64_A32'
110812149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_1110_1x11_0001__xxxx_1011_11x0_xxxx')
110912149Sashkan.tousimojarad@arm.com    extraCommitLat = 18
111012149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = []
111112149Sashkan.tousimojarad@arm.com
111212149Sashkan.tousimojarad@arm.com# VSQRT.F32
111312149Sashkan.tousimojarad@arm.comclass HPI_VSQRT32_A32(MinorFUTiming):
111412149Sashkan.tousimojarad@arm.com    description = 'HPI_VSQRT32_A32'
111512149Sashkan.tousimojarad@arm.com    mask, match = a32_opcode('xxxx_1110_1x11_0001__xxxx_1010_11x0_xxxx')
111612149Sashkan.tousimojarad@arm.com    extraCommitLat = 9
111712149Sashkan.tousimojarad@arm.com    srcRegsRelativeLats = []
111812149Sashkan.tousimojarad@arm.com
111912149Sashkan.tousimojarad@arm.comclass HPI_FloatSimdFU(MinorFU):
112012149Sashkan.tousimojarad@arm.com    opClasses = minorMakeOpClassSet([
112112149Sashkan.tousimojarad@arm.com        'FloatAdd', 'FloatCmp', 'FloatCvt', 'FloatMult', 'FloatDiv',
112212149Sashkan.tousimojarad@arm.com        'FloatSqrt', 'FloatMisc', 'FloatMultAcc',
112312149Sashkan.tousimojarad@arm.com        'SimdAdd', 'SimdAddAcc', 'SimdAlu', 'SimdCmp', 'SimdCvt',
112412149Sashkan.tousimojarad@arm.com        'SimdMisc', 'SimdMult', 'SimdMultAcc', 'SimdShift', 'SimdShiftAcc',
112512149Sashkan.tousimojarad@arm.com        'SimdSqrt', 'SimdFloatAdd', 'SimdFloatAlu', 'SimdFloatCmp',
112612149Sashkan.tousimojarad@arm.com        'SimdFloatCvt', 'SimdFloatDiv', 'SimdFloatMisc', 'SimdFloatMult',
112712149Sashkan.tousimojarad@arm.com        'SimdFloatMultAcc', 'SimdFloatSqrt'])
112812149Sashkan.tousimojarad@arm.com
112912149Sashkan.tousimojarad@arm.com    timings = [
113012149Sashkan.tousimojarad@arm.com        # VUZP and VZIP must be before VADDW/L
113112149Sashkan.tousimojarad@arm.com        HPI_VUZP_A32(), HPI_VZIP_A32(),
113212149Sashkan.tousimojarad@arm.com        HPI_VADD2H_A32(), HPI_VADDHN_A32(),
113312149Sashkan.tousimojarad@arm.com        HPI_VADDL_A32(), HPI_VADDW_A32(),
113412149Sashkan.tousimojarad@arm.com        HPI_VHADD_A32(), HPI_VPADAL_A32(),
113512149Sashkan.tousimojarad@arm.com        HPI_VPADDH_A32(), HPI_VPADDS_A32(),
113612149Sashkan.tousimojarad@arm.com        HPI_VPADDL_A32(), HPI_VRADDHN_A32(),
113712149Sashkan.tousimojarad@arm.com        HPI_VRHADD_A32(), HPI_VQADD_A32(),
113812149Sashkan.tousimojarad@arm.com        HPI_VANDQ_A32(), HPI_VBIC_A32(),
113912149Sashkan.tousimojarad@arm.com        HPI_VBIF_ETC_A32(), HPI_VACGE_A32(),
114012149Sashkan.tousimojarad@arm.com        HPI_VCEQ_A32(), HPI_VCEQI_A32(),
114112149Sashkan.tousimojarad@arm.com        HPI_VCEQII_A32(), HPI_VTST_A32(),
114212149Sashkan.tousimojarad@arm.com        HPI_VCLZ_A32(), HPI_VCNT_A32(),
114312149Sashkan.tousimojarad@arm.com        HPI_VEXT_A32(), HPI_VMAXI_A32(),
114412149Sashkan.tousimojarad@arm.com        HPI_VMAXS_A32(), HPI_VNEGI_A32(),
114512149Sashkan.tousimojarad@arm.com        HPI_VNEGF_A32(), HPI_VREVN_A32(),
114612149Sashkan.tousimojarad@arm.com        HPI_VQNEG_A32(), HPI_VSWP_A32(),
114712149Sashkan.tousimojarad@arm.com        HPI_VTRN_A32(), HPI_VPMAX_A32(),
114812149Sashkan.tousimojarad@arm.com        HPI_VPMAXF_A32(), HPI_VMOVN_A32(),
114912149Sashkan.tousimojarad@arm.com        HPI_VMRS_A1(),
115012149Sashkan.tousimojarad@arm.com        HPI_VMOV_immediate_A1(),
115112149Sashkan.tousimojarad@arm.com        HPI_VMOV_register_A2(),
115212149Sashkan.tousimojarad@arm.com        HPI_VQMOVN_A32(), HPI_VMOVL_A32(),
115312149Sashkan.tousimojarad@arm.com        HPI_VDIV32_A32(), HPI_VDIV64_A32(),
115412149Sashkan.tousimojarad@arm.com        HPI_VSQRT32_A32(), HPI_VSQRT64_A32(),
115512149Sashkan.tousimojarad@arm.com        HPI_VMULI_A32(),
115612149Sashkan.tousimojarad@arm.com        # Add before here
115712149Sashkan.tousimojarad@arm.com        HPI_FMADD_A64(),
115812149Sashkan.tousimojarad@arm.com        HPI_FMSUB_D_A64(),
115912149Sashkan.tousimojarad@arm.com        HPI_FMOV_A64(),
116012149Sashkan.tousimojarad@arm.com        HPI_ADD_SUB_vector_scalar_A64(),
116112149Sashkan.tousimojarad@arm.com        HPI_ADD_SUB_vector_vector_A64(),
116212149Sashkan.tousimojarad@arm.com        HPI_FDIV_scalar_32_A64(), HPI_FDIV_scalar_64_A64(),
116312149Sashkan.tousimojarad@arm.com        HPI_DefaultA64Vfp(),
116412149Sashkan.tousimojarad@arm.com        HPI_DefaultVfp()]
116512149Sashkan.tousimojarad@arm.com
116612149Sashkan.tousimojarad@arm.com    opLat = 6
116712149Sashkan.tousimojarad@arm.com
116812149Sashkan.tousimojarad@arm.comclass HPI_IntFU(MinorFU):
116912149Sashkan.tousimojarad@arm.com    opClasses = minorMakeOpClassSet(['IntAlu'])
117012149Sashkan.tousimojarad@arm.com    # IMPORTANT! Keep the order below, add new entries *at the head*
117112149Sashkan.tousimojarad@arm.com    timings = [
117212149Sashkan.tousimojarad@arm.com        HPI_SSAT_USAT_no_shift_A1(),
117312149Sashkan.tousimojarad@arm.com        HPI_SSAT_USAT_shift_A1(),
117412149Sashkan.tousimojarad@arm.com        HPI_SSAT16_USAT16_A1(),
117512149Sashkan.tousimojarad@arm.com        HPI_QADD_QSUB_A1(),
117612149Sashkan.tousimojarad@arm.com        HPI_QADD_QSUB_T1(),
117712149Sashkan.tousimojarad@arm.com        HPI_QADD_ETC_A1(),
117812149Sashkan.tousimojarad@arm.com        HPI_QASX_QSAX_UQASX_UQSAX_T1(),
117912149Sashkan.tousimojarad@arm.com        HPI_QADD_ETC_T1(),
118012149Sashkan.tousimojarad@arm.com        HPI_USUB_ETC_A1(),
118112149Sashkan.tousimojarad@arm.com        HPI_ADD_ETC_A1(),
118212149Sashkan.tousimojarad@arm.com        HPI_ADD_ETC_T1(),
118312149Sashkan.tousimojarad@arm.com        HPI_QDADD_QDSUB_A1(),
118412149Sashkan.tousimojarad@arm.com        HPI_QDADD_QDSUB_T1(),
118512149Sashkan.tousimojarad@arm.com        HPI_SASX_SHASX_UASX_UHASX_A1(),
118612149Sashkan.tousimojarad@arm.com        HPI_SHSAX_SSAX_UHSAX_USAX_A1(),
118712149Sashkan.tousimojarad@arm.com        HPI_SXTB_SXTB16_SXTH_UXTB_UXTB16_UXTH_A1(),
118812149Sashkan.tousimojarad@arm.com
118912149Sashkan.tousimojarad@arm.com        # Must be after HPI_SXTB_SXTB16_SXTH_UXTB_UXTB16_UXTH_A1
119012149Sashkan.tousimojarad@arm.com        HPI_SXTAB_SXTAB16_SXTAH_UXTAB_UXTAB16_UXTAH_A1(),
119112149Sashkan.tousimojarad@arm.com
119212149Sashkan.tousimojarad@arm.com        HPI_SXTAB_T1(),
119312149Sashkan.tousimojarad@arm.com        HPI_SXTAB16_T1(),
119412149Sashkan.tousimojarad@arm.com        HPI_SXTAH_T1(),
119512149Sashkan.tousimojarad@arm.com        HPI_SXTB_T2(),
119612149Sashkan.tousimojarad@arm.com        HPI_SXTB16_T1(),
119712149Sashkan.tousimojarad@arm.com        HPI_SXTH_T2(),
119812149Sashkan.tousimojarad@arm.com
119912149Sashkan.tousimojarad@arm.com        HPI_PKH_A1(),
120012149Sashkan.tousimojarad@arm.com        HPI_PKH_T1(),
120112149Sashkan.tousimojarad@arm.com        HPI_SBFX_UBFX_A1(),
120212149Sashkan.tousimojarad@arm.com        HPI_SEL_A1(),
120312149Sashkan.tousimojarad@arm.com        HPI_RBIT_A1(),
120412149Sashkan.tousimojarad@arm.com        HPI_REV_REV16_A1(),
120512149Sashkan.tousimojarad@arm.com        HPI_REVSH_A1(),
120612149Sashkan.tousimojarad@arm.com        HPI_USAD8_USADA8_A1(),
120712149Sashkan.tousimojarad@arm.com        HPI_BFI_A1(),
120812149Sashkan.tousimojarad@arm.com        HPI_BFI_T1(),
120912149Sashkan.tousimojarad@arm.com
121012149Sashkan.tousimojarad@arm.com        HPI_CMN_register_A1(),
121112149Sashkan.tousimojarad@arm.com        HPI_CMN_immediate_A1(),
121212149Sashkan.tousimojarad@arm.com        HPI_CMP_register_A1(),
121312149Sashkan.tousimojarad@arm.com        HPI_CMP_immediate_A1(),
121412149Sashkan.tousimojarad@arm.com
121512149Sashkan.tousimojarad@arm.com        HPI_DataProcessingNoShift(),
121612149Sashkan.tousimojarad@arm.com        HPI_DataProcessingMovShiftr(),
121712149Sashkan.tousimojarad@arm.com        HPI_DataProcessingMayShift(),
121812149Sashkan.tousimojarad@arm.com
121912149Sashkan.tousimojarad@arm.com        HPI_Cxxx_A64(),
122012149Sashkan.tousimojarad@arm.com
122112149Sashkan.tousimojarad@arm.com        HPI_DefaultA64Int(),
122212149Sashkan.tousimojarad@arm.com        HPI_DefaultInt()]
122312149Sashkan.tousimojarad@arm.com    opLat = 3
122412149Sashkan.tousimojarad@arm.com
122512149Sashkan.tousimojarad@arm.comclass HPI_Int2FU(MinorFU):
122612149Sashkan.tousimojarad@arm.com    opClasses = minorMakeOpClassSet(['IntAlu'])
122712149Sashkan.tousimojarad@arm.com    # IMPORTANT! Keep the order below, add new entries *at the head*
122812149Sashkan.tousimojarad@arm.com    timings = [
122912149Sashkan.tousimojarad@arm.com        HPI_SSAT_USAT_no_shift_A1(),
123012149Sashkan.tousimojarad@arm.com        HPI_SSAT_USAT_shift_A1(),
123112149Sashkan.tousimojarad@arm.com        HPI_SSAT16_USAT16_A1(),
123212149Sashkan.tousimojarad@arm.com        HPI_QADD_QSUB_A1(),
123312149Sashkan.tousimojarad@arm.com        HPI_QADD_QSUB_T1(),
123412149Sashkan.tousimojarad@arm.com        HPI_QADD_ETC_A1(),
123512149Sashkan.tousimojarad@arm.com        HPI_QASX_QSAX_UQASX_UQSAX_T1(),
123612149Sashkan.tousimojarad@arm.com        HPI_QADD_ETC_T1(),
123712149Sashkan.tousimojarad@arm.com        HPI_USUB_ETC_A1(),
123812149Sashkan.tousimojarad@arm.com        HPI_ADD_ETC_A1(),
123912149Sashkan.tousimojarad@arm.com        HPI_ADD_ETC_T1(),
124012149Sashkan.tousimojarad@arm.com        HPI_QDADD_QDSUB_A1(),
124112149Sashkan.tousimojarad@arm.com        HPI_QDADD_QDSUB_T1(),
124212149Sashkan.tousimojarad@arm.com        HPI_SASX_SHASX_UASX_UHASX_A1(),
124312149Sashkan.tousimojarad@arm.com        HPI_SHSAX_SSAX_UHSAX_USAX_A1(),
124412149Sashkan.tousimojarad@arm.com        HPI_SXTB_SXTB16_SXTH_UXTB_UXTB16_UXTH_A1(),
124512149Sashkan.tousimojarad@arm.com
124612149Sashkan.tousimojarad@arm.com        # Must be after HPI_SXTB_SXTB16_SXTH_UXTB_UXTB16_UXTH_A1
124712149Sashkan.tousimojarad@arm.com        HPI_SXTAB_SXTAB16_SXTAH_UXTAB_UXTAB16_UXTAH_A1(),
124812149Sashkan.tousimojarad@arm.com
124912149Sashkan.tousimojarad@arm.com        HPI_SXTAB_T1(),
125012149Sashkan.tousimojarad@arm.com        HPI_SXTAB16_T1(),
125112149Sashkan.tousimojarad@arm.com        HPI_SXTAH_T1(),
125212149Sashkan.tousimojarad@arm.com        HPI_SXTB_T2(),
125312149Sashkan.tousimojarad@arm.com        HPI_SXTB16_T1(),
125412149Sashkan.tousimojarad@arm.com        HPI_SXTH_T2(),
125512149Sashkan.tousimojarad@arm.com
125612149Sashkan.tousimojarad@arm.com        HPI_PKH_A1(),
125712149Sashkan.tousimojarad@arm.com        HPI_PKH_T1(),
125812149Sashkan.tousimojarad@arm.com        HPI_SBFX_UBFX_A1(),
125912149Sashkan.tousimojarad@arm.com        HPI_SEL_A1_Suppress(),
126012149Sashkan.tousimojarad@arm.com        HPI_RBIT_A1(),
126112149Sashkan.tousimojarad@arm.com        HPI_REV_REV16_A1(),
126212149Sashkan.tousimojarad@arm.com        HPI_REVSH_A1(),
126312149Sashkan.tousimojarad@arm.com        HPI_USAD8_USADA8_A1_Suppress(),
126412149Sashkan.tousimojarad@arm.com        HPI_BFI_A1(),
126512149Sashkan.tousimojarad@arm.com        HPI_BFI_T1(),
126612149Sashkan.tousimojarad@arm.com
126712149Sashkan.tousimojarad@arm.com        HPI_CMN_register_A1(), # Need to check for shift
126812149Sashkan.tousimojarad@arm.com        HPI_CMN_immediate_A1(),
126912149Sashkan.tousimojarad@arm.com        HPI_CMP_register_A1(), # Need to check for shift
127012149Sashkan.tousimojarad@arm.com        HPI_CMP_immediate_A1(),
127112149Sashkan.tousimojarad@arm.com
127212149Sashkan.tousimojarad@arm.com        HPI_DataProcessingNoShift(),
127312149Sashkan.tousimojarad@arm.com        HPI_DataProcessingAllowShifti(),
127412149Sashkan.tousimojarad@arm.com        # HPI_DataProcessingAllowMovShiftr(),
127512149Sashkan.tousimojarad@arm.com
127612149Sashkan.tousimojarad@arm.com        # Data processing ops that match SuppressShift but are *not*
127712149Sashkan.tousimojarad@arm.com        # to be suppressed here
127812149Sashkan.tousimojarad@arm.com        HPI_CLZ_A1(),
127912149Sashkan.tousimojarad@arm.com        HPI_CLZ_T1(),
128012149Sashkan.tousimojarad@arm.com        HPI_DataProcessingSuppressShift(),
128112149Sashkan.tousimojarad@arm.com        # Can you dual issue a branch?
128212149Sashkan.tousimojarad@arm.com        # HPI_DataProcessingSuppressBranch(),
128312149Sashkan.tousimojarad@arm.com        HPI_Cxxx_A64(),
128412149Sashkan.tousimojarad@arm.com
128512149Sashkan.tousimojarad@arm.com        HPI_DefaultA64Int(),
128612149Sashkan.tousimojarad@arm.com        HPI_DefaultInt()]
128712149Sashkan.tousimojarad@arm.com    opLat = 3
128812149Sashkan.tousimojarad@arm.com
128912149Sashkan.tousimojarad@arm.comclass HPI_IntMulFU(MinorFU):
129012149Sashkan.tousimojarad@arm.com    opClasses = minorMakeOpClassSet(['IntMult'])
129112149Sashkan.tousimojarad@arm.com    timings = [
129212149Sashkan.tousimojarad@arm.com        HPI_MLA_A1(), HPI_MLA_T1(),
129312149Sashkan.tousimojarad@arm.com        HPI_MLS_A1(), HPI_MLS_T1(),
129412149Sashkan.tousimojarad@arm.com        HPI_SMLABB_A1(), HPI_SMLABB_T1(),
129512149Sashkan.tousimojarad@arm.com        HPI_SMLAWB_A1(), HPI_SMLAWB_T1(),
129612149Sashkan.tousimojarad@arm.com        HPI_SMLAD_A1(), HPI_SMLAD_T1(),
129712149Sashkan.tousimojarad@arm.com        HPI_SMMUL_A1(), HPI_SMMUL_T1(),
129812149Sashkan.tousimojarad@arm.com        # SMMUL_A1 must be before SMMLA_A1
129912149Sashkan.tousimojarad@arm.com        HPI_SMMLA_A1(), HPI_SMMLA_T1(),
130012149Sashkan.tousimojarad@arm.com        HPI_SMMLS_A1(), HPI_SMMLS_T1(),
130112149Sashkan.tousimojarad@arm.com        HPI_UMAAL_A1(), HPI_UMAAL_T1(),
130212149Sashkan.tousimojarad@arm.com
130312149Sashkan.tousimojarad@arm.com        HPI_MADD_A64(),
130412149Sashkan.tousimojarad@arm.com        HPI_DefaultA64Mul(),
130512149Sashkan.tousimojarad@arm.com        HPI_DefaultMul()]
130612149Sashkan.tousimojarad@arm.com    opLat = 3
130712149Sashkan.tousimojarad@arm.com    cantForwardFromFUIndices = [0, 1, 5] # Int1, Int2, Mem
130812149Sashkan.tousimojarad@arm.com
130912149Sashkan.tousimojarad@arm.comclass HPI_IntDivFU(MinorFU):
131012149Sashkan.tousimojarad@arm.com    opClasses = minorMakeOpClassSet(['IntDiv'])
131112149Sashkan.tousimojarad@arm.com    timings = [HPI_SDIV_A1(), HPI_UDIV_A1(),
131212149Sashkan.tousimojarad@arm.com        HPI_SDIV_A64()]
131312149Sashkan.tousimojarad@arm.com    issueLat = 3
131412149Sashkan.tousimojarad@arm.com    opLat = 3
131512149Sashkan.tousimojarad@arm.com
131612149Sashkan.tousimojarad@arm.comclass HPI_MemFU(MinorFU):
131712149Sashkan.tousimojarad@arm.com    opClasses = minorMakeOpClassSet(['MemRead', 'MemWrite', 'FloatMemRead',
131812149Sashkan.tousimojarad@arm.com                                     'FloatMemWrite'])
131912149Sashkan.tousimojarad@arm.com    timings = [HPI_DefaultMem(), HPI_DefaultMem64()]
132012149Sashkan.tousimojarad@arm.com    opLat = 1
132112149Sashkan.tousimojarad@arm.com    cantForwardFromFUIndices = [5] # Mem (this FU)
132212149Sashkan.tousimojarad@arm.com
132312149Sashkan.tousimojarad@arm.comclass HPI_MiscFU(MinorFU):
132412149Sashkan.tousimojarad@arm.com    opClasses = minorMakeOpClassSet(['IprAccess', 'InstPrefetch'])
132512149Sashkan.tousimojarad@arm.com    opLat = 1
132612149Sashkan.tousimojarad@arm.com
132712149Sashkan.tousimojarad@arm.comclass HPI_FUPool(MinorFUPool):
132812149Sashkan.tousimojarad@arm.com    funcUnits = [HPI_IntFU(), # 0
132912149Sashkan.tousimojarad@arm.com        HPI_Int2FU(), # 1
133012149Sashkan.tousimojarad@arm.com        HPI_IntMulFU(), # 2
133112149Sashkan.tousimojarad@arm.com        HPI_IntDivFU(), # 3
133212149Sashkan.tousimojarad@arm.com        HPI_FloatSimdFU(), # 4
133312149Sashkan.tousimojarad@arm.com        HPI_MemFU(), # 5
133412149Sashkan.tousimojarad@arm.com        HPI_MiscFU() # 6
133512149Sashkan.tousimojarad@arm.com        ]
133612149Sashkan.tousimojarad@arm.com
133712149Sashkan.tousimojarad@arm.comclass HPI_DTB(ArmTLB):
133812149Sashkan.tousimojarad@arm.com    size = 256
133912149Sashkan.tousimojarad@arm.com
134012149Sashkan.tousimojarad@arm.comclass HPI_ITB(ArmTLB):
134112149Sashkan.tousimojarad@arm.com    size = 256
134212149Sashkan.tousimojarad@arm.com
134312149Sashkan.tousimojarad@arm.comclass HPI_WalkCache(Cache):
134412149Sashkan.tousimojarad@arm.com    data_latency = 4
134512149Sashkan.tousimojarad@arm.com    tag_latency = 4
134612149Sashkan.tousimojarad@arm.com    response_latency = 4
134712149Sashkan.tousimojarad@arm.com    mshrs = 6
134812149Sashkan.tousimojarad@arm.com    tgts_per_mshr = 8
134912149Sashkan.tousimojarad@arm.com    size = '1kB'
135012149Sashkan.tousimojarad@arm.com    assoc = 8
135112149Sashkan.tousimojarad@arm.com    write_buffers = 16
135212149Sashkan.tousimojarad@arm.com
135312149Sashkan.tousimojarad@arm.comclass HPI_BP(TournamentBP):
135412149Sashkan.tousimojarad@arm.com    localPredictorSize = 64
135512149Sashkan.tousimojarad@arm.com    localCtrBits = 2
135612149Sashkan.tousimojarad@arm.com    localHistoryTableSize = 64
135712149Sashkan.tousimojarad@arm.com    globalPredictorSize = 1024
135812149Sashkan.tousimojarad@arm.com    globalCtrBits = 2
135912149Sashkan.tousimojarad@arm.com    choicePredictorSize = 1024
136012149Sashkan.tousimojarad@arm.com    choiceCtrBits = 2
136112149Sashkan.tousimojarad@arm.com    BTBEntries = 128
136212149Sashkan.tousimojarad@arm.com    BTBTagSize = 18
136312149Sashkan.tousimojarad@arm.com    RASSize = 8
136412149Sashkan.tousimojarad@arm.com    instShiftAmt = 2
136512149Sashkan.tousimojarad@arm.com
136612149Sashkan.tousimojarad@arm.comclass HPI_ICache(Cache):
136712149Sashkan.tousimojarad@arm.com    data_latency = 1
136812149Sashkan.tousimojarad@arm.com    tag_latency = 1
136912149Sashkan.tousimojarad@arm.com    response_latency = 1
137012149Sashkan.tousimojarad@arm.com    mshrs = 2
137112149Sashkan.tousimojarad@arm.com    tgts_per_mshr = 8
137212149Sashkan.tousimojarad@arm.com    size = '32kB'
137312149Sashkan.tousimojarad@arm.com    assoc = 2
137412149Sashkan.tousimojarad@arm.com    # No prefetcher, this is handled by the core
137512149Sashkan.tousimojarad@arm.com
137612149Sashkan.tousimojarad@arm.comclass HPI_DCache(Cache):
137712149Sashkan.tousimojarad@arm.com    data_latency = 1
137812149Sashkan.tousimojarad@arm.com    tag_latency = 1
137912149Sashkan.tousimojarad@arm.com    response_latency = 1
138012149Sashkan.tousimojarad@arm.com    mshrs = 4
138112149Sashkan.tousimojarad@arm.com    tgts_per_mshr = 8
138212149Sashkan.tousimojarad@arm.com    size = '32kB'
138312149Sashkan.tousimojarad@arm.com    assoc = 4
138412149Sashkan.tousimojarad@arm.com    write_buffers = 4
138512149Sashkan.tousimojarad@arm.com    prefetcher = StridePrefetcher(
138612149Sashkan.tousimojarad@arm.com        queue_size=4,
138712149Sashkan.tousimojarad@arm.com        degree=4)
138812149Sashkan.tousimojarad@arm.com
138912149Sashkan.tousimojarad@arm.comclass HPI_L2(Cache):
139012149Sashkan.tousimojarad@arm.com    data_latency = 13
139112149Sashkan.tousimojarad@arm.com    tag_latency = 13
139212149Sashkan.tousimojarad@arm.com    response_latency = 5
139312149Sashkan.tousimojarad@arm.com    mshrs = 4
139412149Sashkan.tousimojarad@arm.com    tgts_per_mshr = 8
139512149Sashkan.tousimojarad@arm.com    size = '1024kB'
139612149Sashkan.tousimojarad@arm.com    assoc = 16
139712149Sashkan.tousimojarad@arm.com    write_buffers = 16
139812149Sashkan.tousimojarad@arm.com    # prefetcher FIXME
139912149Sashkan.tousimojarad@arm.com
140012149Sashkan.tousimojarad@arm.comclass HPI(MinorCPU):
140112149Sashkan.tousimojarad@arm.com    # Inherit the doc string from the module to avoid repeating it
140212149Sashkan.tousimojarad@arm.com    # here.
140312149Sashkan.tousimojarad@arm.com    __doc__ = __doc__
140412149Sashkan.tousimojarad@arm.com
140512149Sashkan.tousimojarad@arm.com    fetch1LineSnapWidth = 0
140612149Sashkan.tousimojarad@arm.com    fetch1LineWidth = 0
140712149Sashkan.tousimojarad@arm.com    fetch1FetchLimit = 1
140812149Sashkan.tousimojarad@arm.com    fetch1ToFetch2ForwardDelay = 1
140912149Sashkan.tousimojarad@arm.com    fetch1ToFetch2BackwardDelay = 1
141012149Sashkan.tousimojarad@arm.com
141112149Sashkan.tousimojarad@arm.com    fetch2InputBufferSize = 2
141212149Sashkan.tousimojarad@arm.com    fetch2ToDecodeForwardDelay = 1
141312149Sashkan.tousimojarad@arm.com    fetch2CycleInput = True
141412149Sashkan.tousimojarad@arm.com
141512149Sashkan.tousimojarad@arm.com    decodeInputBufferSize = 3
141612149Sashkan.tousimojarad@arm.com    decodeToExecuteForwardDelay = 1
141712149Sashkan.tousimojarad@arm.com    decodeInputWidth = 2
141812149Sashkan.tousimojarad@arm.com    decodeCycleInput = True
141912149Sashkan.tousimojarad@arm.com
142012149Sashkan.tousimojarad@arm.com    executeInputWidth = 2
142112149Sashkan.tousimojarad@arm.com    executeCycleInput = True
142212149Sashkan.tousimojarad@arm.com    executeIssueLimit = 2
142312149Sashkan.tousimojarad@arm.com
142412149Sashkan.tousimojarad@arm.com    # Only allow one ld/st to be issued but the second ld/st FU allows
142512149Sashkan.tousimojarad@arm.com    # back-to-back loads
142612149Sashkan.tousimojarad@arm.com    executeMemoryIssueLimit = 1
142712149Sashkan.tousimojarad@arm.com
142812149Sashkan.tousimojarad@arm.com    executeCommitLimit = 2
142912149Sashkan.tousimojarad@arm.com    executeMemoryCommitLimit = 1
143012149Sashkan.tousimojarad@arm.com    executeInputBufferSize = 7
143112149Sashkan.tousimojarad@arm.com
143212149Sashkan.tousimojarad@arm.com    executeMaxAccessesInMemory = 2
143312149Sashkan.tousimojarad@arm.com
143412149Sashkan.tousimojarad@arm.com    executeLSQMaxStoreBufferStoresPerCycle = 2
143512149Sashkan.tousimojarad@arm.com    executeLSQRequestsQueueSize = 1
143612149Sashkan.tousimojarad@arm.com    executeLSQTransfersQueueSize = 2
143712149Sashkan.tousimojarad@arm.com    executeLSQStoreBufferSize = 5
143812149Sashkan.tousimojarad@arm.com    executeBranchDelay = 1
143912149Sashkan.tousimojarad@arm.com    executeFuncUnits = HPI_FUPool()
144012149Sashkan.tousimojarad@arm.com    executeSetTraceTimeOnCommit = True
144112149Sashkan.tousimojarad@arm.com    executeSetTraceTimeOnIssue = False
144212149Sashkan.tousimojarad@arm.com
144312149Sashkan.tousimojarad@arm.com    executeAllowEarlyMemoryIssue = True
144412149Sashkan.tousimojarad@arm.com
144512149Sashkan.tousimojarad@arm.com    enableIdling = True
144612149Sashkan.tousimojarad@arm.com
144713432Spau.cabre@metempsy.com    branchPred = HPI_BP()
144812149Sashkan.tousimojarad@arm.com
144912149Sashkan.tousimojarad@arm.com    itb = HPI_ITB()
145012149Sashkan.tousimojarad@arm.com    dtb = HPI_DTB()
145112149Sashkan.tousimojarad@arm.com
145212149Sashkan.tousimojarad@arm.com__all__ = [
145312149Sashkan.tousimojarad@arm.com    "HPI_BP",
145412149Sashkan.tousimojarad@arm.com    "HPI_ITB", "HPI_DTB", "HPI_WalkCache",
145512149Sashkan.tousimojarad@arm.com    "HPI_ICache", "HPI_DCache", "HPI_L2",
145612149Sashkan.tousimojarad@arm.com    "HPI",
145712149Sashkan.tousimojarad@arm.com]
1458