#BEGIN_LEGAL
#
#Copyright (c) 2023 Intel Corporation
#
#  Licensed under the Apache License, Version 2.0 (the "License");
#  you may not use this file except in compliance with the License.
#  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.
#  
#END_LEGAL
#The "MEM" suffix on tuples means NO BROADCAST ALLOWED

# SET THE ELEMENT SIZE DURING DECODE -- using spreadsheet InputSize field
# FIXME: fix and use 'otherwise' instead of REX=0!
ESIZE_128_BITS()::
REX=0 | ELEMENT_SIZE=128
ESIZE_64_BITS()::
REX=0 | ELEMENT_SIZE=64
ESIZE_32_BITS()::
REX=0 | ELEMENT_SIZE=32
ESIZE_16_BITS()::
REX=0 | ELEMENT_SIZE=16
ESIZE_8_BITS()::
REX=0 | ELEMENT_SIZE=8
ESIZE_4_BITS()::
REX=0 | ELEMENT_SIZE=4
ESIZE_2_BITS()::
REX=0 | ELEMENT_SIZE=2
ESIZE_1_BITS()::
REX=0 | ELEMENT_SIZE=1

# eightmem is a 8B reference
# quartermem is a 16B reference
# halfmem is a 32B reference
# fullmem is a 64B reference

# legacy movddup references 64b when doing a 128b VL
# but acts like fullmem for 256/512.
NELEM_MOVDDUP()::
ELEMENT_SIZE=64  VL128  | NELEM=1
ELEMENT_SIZE=64  VL256  | NELEM=4
ELEMENT_SIZE=64  VL512  | NELEM=8

# element size is in bits...
NELEM_FULLMEM():: # updated 2011-02-18 
ELEMENT_SIZE=1     VL512  | NELEM=512
ELEMENT_SIZE=2     VL512  | NELEM=256
ELEMENT_SIZE=4     VL512  | NELEM=128
ELEMENT_SIZE=8     VL512  | NELEM=64
ELEMENT_SIZE=16  VL512  | NELEM=32
ELEMENT_SIZE=32  VL512  | NELEM=16
ELEMENT_SIZE=64  VL512  | NELEM=8
ELEMENT_SIZE=128 VL512  | NELEM=4
ELEMENT_SIZE=256 VL512  | NELEM=2
ELEMENT_SIZE=512 VL512  | NELEM=1

ELEMENT_SIZE=1     VL256  | NELEM=256
ELEMENT_SIZE=2     VL256  | NELEM=128
ELEMENT_SIZE=4     VL256  | NELEM=64 
ELEMENT_SIZE=8     VL256  | NELEM=32 
ELEMENT_SIZE=16  VL256  | NELEM=16 
ELEMENT_SIZE=32  VL256  | NELEM=8    
ELEMENT_SIZE=64  VL256  | NELEM=4    
ELEMENT_SIZE=128 VL256  | NELEM=2    
ELEMENT_SIZE=256 VL256  | NELEM=1    
ELEMENT_SIZE=512 VL256  | error

ELEMENT_SIZE=1     VL128  | NELEM=128 
ELEMENT_SIZE=2     VL128  | NELEM=64  
ELEMENT_SIZE=4     VL128  | NELEM=32  
ELEMENT_SIZE=8     VL128  | NELEM=16  
ELEMENT_SIZE=16  VL128  | NELEM=8     
ELEMENT_SIZE=32  VL128  | NELEM=4     
ELEMENT_SIZE=64  VL128  | NELEM=2
ELEMENT_SIZE=128 VL128  | NELEM=1
ELEMENT_SIZE=256 VL128  | error
ELEMENT_SIZE=512 VL128  | error

NELEM_HALFMEM():: # 32B/256b reference updated 2011-02-18
ELEMENT_SIZE=1     VL512 | NELEM=256
ELEMENT_SIZE=2     VL512 | NELEM=128
ELEMENT_SIZE=4     VL512 | NELEM=64
ELEMENT_SIZE=8     VL512 | NELEM=32
ELEMENT_SIZE=16  VL512 | NELEM=16
ELEMENT_SIZE=32  VL512 | NELEM=8
ELEMENT_SIZE=64  VL512 | NELEM=4
ELEMENT_SIZE=128 VL512 | NELEM=2
ELEMENT_SIZE=256 VL512 | NELEM=1
ELEMENT_SIZE=512 VL512 | error

ELEMENT_SIZE=1     VL256 | NELEM=128
ELEMENT_SIZE=2     VL256 | NELEM=64
ELEMENT_SIZE=4     VL256 | NELEM=32
ELEMENT_SIZE=8     VL256 | NELEM=16
ELEMENT_SIZE=16  VL256 | NELEM=8
ELEMENT_SIZE=32  VL256 | NELEM=4
ELEMENT_SIZE=64  VL256 | NELEM=2
ELEMENT_SIZE=128 VL256 | NELEM=1
ELEMENT_SIZE=256 VL256 | error
ELEMENT_SIZE=512 VL256 | error

ELEMENT_SIZE=1     VL128 | NELEM=64
ELEMENT_SIZE=2     VL128 | NELEM=32
ELEMENT_SIZE=4     VL128 | NELEM=16
ELEMENT_SIZE=8     VL128 | NELEM=8
ELEMENT_SIZE=16  VL128 | NELEM=4
ELEMENT_SIZE=32  VL128 | NELEM=2
ELEMENT_SIZE=64  VL128 | NELEM=1
ELEMENT_SIZE=128 VL128 | error
ELEMENT_SIZE=256 VL128 | error
ELEMENT_SIZE=512 VL128 | error


NELEM_QUARTERMEM():: # 16B/128b reference updated 2011-02-18
ELEMENT_SIZE=1     VL512 | NELEM=128
ELEMENT_SIZE=2     VL512 | NELEM=64
ELEMENT_SIZE=4     VL512 | NELEM=32
ELEMENT_SIZE=8     VL512 | NELEM=16
ELEMENT_SIZE=16  VL512 | NELEM=8
ELEMENT_SIZE=32  VL512 | NELEM=4
ELEMENT_SIZE=64  VL512 | NELEM=2
ELEMENT_SIZE=128 VL512 | NELEM=1
ELEMENT_SIZE=256 VL512 | error
ELEMENT_SIZE=512 VL512 | error

ELEMENT_SIZE=1     VL256 | NELEM=64
ELEMENT_SIZE=2     VL256 | NELEM=32
ELEMENT_SIZE=4     VL256 | NELEM=16
ELEMENT_SIZE=8     VL256 | NELEM=8
ELEMENT_SIZE=16  VL256 | NELEM=4
ELEMENT_SIZE=32  VL256 | NELEM=2
ELEMENT_SIZE=64  VL256 | NELEM=1
ELEMENT_SIZE=128 VL256 | error
ELEMENT_SIZE=256 VL256 | error
ELEMENT_SIZE=512 VL256 | error

ELEMENT_SIZE=1     VL128 | NELEM=32
ELEMENT_SIZE=2     VL128 | NELEM=16
ELEMENT_SIZE=4     VL128 | NELEM=8
ELEMENT_SIZE=8     VL128 | NELEM=4
ELEMENT_SIZE=16  VL128 | NELEM=2
ELEMENT_SIZE=32  VL128 | NELEM=1
ELEMENT_SIZE=64  VL128 | error
ELEMENT_SIZE=128 VL128 | error
ELEMENT_SIZE=256 VL128 | error
ELEMENT_SIZE=512 VL128 | error


NELEM_EIGHTHMEM():: # 8B/64b reference updated 2011-02-18
ELEMENT_SIZE=1     VL512 | NELEM=64
ELEMENT_SIZE=2     VL512 | NELEM=32
ELEMENT_SIZE=4     VL512 | NELEM=16
ELEMENT_SIZE=8     VL512 | NELEM=8
ELEMENT_SIZE=16  VL512 | NELEM=4
ELEMENT_SIZE=32  VL512 | NELEM=2
ELEMENT_SIZE=64  VL512 | NELEM=1
ELEMENT_SIZE=128 VL512 | error
ELEMENT_SIZE=256 VL512 | error
ELEMENT_SIZE=512 VL512 | error

ELEMENT_SIZE=1     VL256 | NELEM=32
ELEMENT_SIZE=2     VL256 | NELEM=16
ELEMENT_SIZE=4     VL256 | NELEM=8
ELEMENT_SIZE=8     VL256 | NELEM=4
ELEMENT_SIZE=16  VL256 | NELEM=2
ELEMENT_SIZE=32  VL256 | NELEM=1
ELEMENT_SIZE=64  VL256 | error
ELEMENT_SIZE=128 VL256 | error
ELEMENT_SIZE=256 VL256 | error
ELEMENT_SIZE=512 VL256 | error

ELEMENT_SIZE=1     VL128 | NELEM=16
ELEMENT_SIZE=2     VL128 | NELEM=8
ELEMENT_SIZE=4     VL128 | NELEM=4
ELEMENT_SIZE=8     VL128 | NELEM=2
ELEMENT_SIZE=16  VL128 | NELEM=1
ELEMENT_SIZE=32  VL128 | error
ELEMENT_SIZE=64  VL128 | error
ELEMENT_SIZE=128 VL128 | error
ELEMENT_SIZE=256 VL128 | error
ELEMENT_SIZE=512 VL128 | error

NELEM_GPR_READER_BYTE()::
VL128  | NELEM=1 
VL256  | NELEM=1 
VL512  | NELEM=1 
NELEM_GPR_READER_WORD()::
VL128  | NELEM=1 
VL256  | NELEM=1 
VL512  | NELEM=1 
NELEM_GPR_WRITER_LDOP_D()::
VL128  | NELEM=1 
VL256  | NELEM=1 
VL512  | NELEM=1 
NELEM_GPR_WRITER_LDOP_Q()::
VL128  | NELEM=1 
VL256  | NELEM=1 
VL512  | NELEM=1 
NELEM_GPR_WRITER_STORE_BYTE()::
VL128  | NELEM=1 
VL256  | NELEM=1 
VL512  | NELEM=1 
NELEM_GPR_WRITER_STORE_WORD()::
VL128  | NELEM=1 
VL256  | NELEM=1 
VL512  | NELEM=1 
NELEM_TUPLE1_BYTE()::
VL128  | NELEM=1 
VL256  | NELEM=1 
VL512  | NELEM=1 
NELEM_TUPLE1_WORD()::
VL128  | NELEM=1 
VL256  | NELEM=1 
VL512  | NELEM=1 

NELEM_SCALAR():: # same as tuple1 updated 2011-02-18
VL128  | NELEM=1 
VL256  | NELEM=1 
VL512  | NELEM=1 
NELEM_TUPLE1_SUBDWORD():: 
VL128  | NELEM=1 
VL256  | NELEM=1 
VL512  | NELEM=1 
NELEM_GPR_READER():: 
VL128  | NELEM=1 
VL256  | NELEM=1 
VL512  | NELEM=1 
NELEM_GPR_READER_SUBDWORD():: 
VL128  | NELEM=1 
VL256  | NELEM=1 
VL512  | NELEM=1 
NELEM_GPR_WRITER_LDOP():: 
VL128  | NELEM=1 
VL256  | NELEM=1 
VL512  | NELEM=1 
NELEM_GPR_WRITER_STORE():: 
VL128  | NELEM=1 
VL256  | NELEM=1 
VL512  | NELEM=1 
NELEM_GPR_WRITER_STORE_SUBDWORD():: 
VL128  | NELEM=1 
VL256  | NELEM=1 
VL512  | NELEM=1 


# TUPLE1,2,4,8, FULL and HALF

NELEM_TUPLE1():: #updated 2011-02-18
VL128  | NELEM=1 
VL256  | NELEM=1 
VL512  | NELEM=1 
NELEM_GSCAT():: 
VL128  | NELEM=1 
VL256  | NELEM=1 
VL512  | NELEM=1 


NELEM_TUPLE2():: #updated 2011-02-18
VL128  | NELEM=2
VL256  | NELEM=2 
VL512  | NELEM=2 

NELEM_TUPLE4():: #updated 2011-02-18
VL128  | NELEM=4
VL256  | NELEM=4 
VL512  | NELEM=4

NELEM_TUPLE8():: # updated 2011-02-18
VL128  | NELEM=8
VL256  | NELEM=8 
VL512  | NELEM=8

NELEM_MEM128():: #  element_size=64 always!! SPECIAL updated 2011-02-18
BCRC=0b0  | ELEMENT_SIZE=64 NELEM=2
BCRC=0b1  | error


NELEM_FULL()::
BCRC=0b0  ELEMENT_SIZE=16 VL512 | NELEM=32
BCRC=0b1  ELEMENT_SIZE=16 VL512 | NELEM=1  EMX_BROADCAST_1TO32_16 
BCRC=0b0  ELEMENT_SIZE=32 VL512 | NELEM=16
BCRC=0b1  ELEMENT_SIZE=32 VL512 | NELEM=1  EMX_BROADCAST_1TO16_32 
BCRC=0b0  ELEMENT_SIZE=64 VL512 | NELEM=8
BCRC=0b1  ELEMENT_SIZE=64 VL512 | NELEM=1  EMX_BROADCAST_1TO8_64

BCRC=0b0  ELEMENT_SIZE=16 VL256 | NELEM=16
BCRC=0b1  ELEMENT_SIZE=16 VL256 | NELEM=1  EMX_BROADCAST_1TO16_16
BCRC=0b0  ELEMENT_SIZE=32 VL256 | NELEM=8
BCRC=0b1  ELEMENT_SIZE=32 VL256 | NELEM=1  EMX_BROADCAST_1TO8_32
BCRC=0b0  ELEMENT_SIZE=64 VL256 | NELEM=4
BCRC=0b1  ELEMENT_SIZE=64 VL256 | NELEM=1  EMX_BROADCAST_1TO4_64 

BCRC=0b0  ELEMENT_SIZE=16 VL128 | NELEM=8
BCRC=0b1  ELEMENT_SIZE=16 VL128 | NELEM=1  EMX_BROADCAST_1TO8_16
BCRC=0b0  ELEMENT_SIZE=32 VL128 | NELEM=4
BCRC=0b1  ELEMENT_SIZE=32 VL128 | NELEM=1  EMX_BROADCAST_1TO4_32
BCRC=0b0  ELEMENT_SIZE=64 VL128 | NELEM=2
BCRC=0b1  ELEMENT_SIZE=64 VL128 | NELEM=1  EMX_BROADCAST_1TO2_64 


# 512b=64B=16DW=8QW -> Half = 256b=32B=8DWORDS=4QWORDS
# 256b=32B=8DW=4QW  -> Half = 128b=16B=4DW=2QW
# 128b=16B=4DW=2QW  -> Half =  64b=8B=2DW=1QW
NELEM_HALF():: # updated 2011-02-18
BCRC=0b0  ELEMENT_SIZE=32 VL512 | NELEM=8
BCRC=0b1  ELEMENT_SIZE=32 VL512 | NELEM=1    EMX_BROADCAST_1TO8_32

BCRC=0b0  ELEMENT_SIZE=32 VL256 | NELEM=4
BCRC=0b1  ELEMENT_SIZE=32 VL256 | NELEM=1    EMX_BROADCAST_1TO4_32 

BCRC=0b0  ELEMENT_SIZE=32 VL128 | NELEM=2
BCRC=0b1  ELEMENT_SIZE=32 VL128 | NELEM=1    EMX_BROADCAST_1TO2_32 


# For reg/reg ops with rounding control, we have to avoid having the
#  RC bits mes up the length. So we fix them here.
FIX_ROUND_LEN512()::
mode16 | VL512 VL_IGN=1
mode32 | VL512 VL_IGN=1
mode64 | VL512 VL_IGN=1
FIX_ROUND_LEN128()::
mode16 | VL128 VL_IGN=1
mode32 | VL128 VL_IGN=1
mode64 | VL128 VL_IGN=1
