1 /*BEGIN_LEGAL
2 
3 Copyright (c) 2018 Intel Corporation
4 
5   Licensed under the Apache License, Version 2.0 (the "License");
6   you may not use this file except in compliance with the License.
7   You may obtain a copy of the License at
8 
9       http://www.apache.org/licenses/LICENSE-2.0
10 
11   Unless required by applicable law or agreed to in writing, software
12   distributed under the License is distributed on an "AS IS" BASIS,
13   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   See the License for the specific language governing permissions and
15   limitations under the License.
16 
17 END_LEGAL */
18 /// @file xed-encode-private.H
19 ///
20 
21 
22 #if !defined(XED_ENCODE_PRIVATE_H)
23 # define XED_ENCODE_PRIVATE_H
24 
25 #include "xed-types.h"
26 #include "xed-encode-types.h"
27 #include "xed-portability.h"
28 #include "xed-error-enum.h"
29 #include "xed-operand-values-interface.h"
30 #include "xed-operand-width-enum.h"
31 #include "xed-ild-private.h"
32 #include "xed-encoder-iforms.h" //generated
33 #include "xed-encoder-gen-defs.h" //generated
34 #include <string.h> // for memset
35 
36 #define XED_GLOBAL_EXTERN extern
37 #include "xed-encode-tables.h"
38 #undef  XED_GLOBAL_EXTERN
39 
40 static XED_INLINE const xed_encoder_vars_t*
xed_encoder_request_ev_const(const xed_encoder_request_t * p)41 xed_encoder_request_ev_const(const xed_encoder_request_t* p) {
42     return p->u.ev;
43 }
xed_encoder_request_ev(xed_encoder_request_t * p)44 static XED_INLINE xed_encoder_vars_t* xed_encoder_request_ev(xed_encoder_request_t* p) {
45     return p->u.ev;
46 }
47 
xed_encoder_request_vars_remove(xed_encoder_request_t * p)48 static XED_INLINE void xed_encoder_request_vars_remove(xed_encoder_request_t* p) {
49     p->u.ev = 0; // clear the internal data so no one sees it.
50 }
51 
xed_encoder_request_vars_zero(xed_encoder_request_t * p)52 static XED_INLINE void xed_encoder_request_vars_zero(xed_encoder_request_t* p) {
53     xed_encoder_vars_t* q = xed_encoder_request_ev(p);
54     if (q) {
55        q->_ilen = 0;
56        q->_olen = 0;
57        q->_bit_offset = 0;
58        memset(&(q->_iforms),0,sizeof(xed_encoder_iforms_t));
59     }
60 }
61 
xed_encoder_request_set_encoder_vars(xed_encoder_request_t * p,xed_encoder_vars_t * xev)62 static XED_INLINE void xed_encoder_request_set_encoder_vars(xed_encoder_request_t* p,
63                                                             xed_encoder_vars_t* xev) {
64     p->u.ev = xev;
65     xed_encoder_request_vars_zero(p);
66 }
67 
68 static XED_INLINE xed_uint16_t
xed_encoder_request_get_iform_index(const xed_encoder_request_t * p)69 xed_encoder_request_get_iform_index(const xed_encoder_request_t* p) {
70     return xed_encoder_request_ev_const(p)->_iform_index;
71 }
72 
73 static XED_INLINE void
xed_encoder_request_set_iform_index(xed_encoder_request_t * p,xed_uint16_t iform_index)74 xed_encoder_request_set_iform_index(xed_encoder_request_t* p,
75                                   xed_uint16_t iform_index) {
76     xed_encoder_request_ev(p)->_iform_index = iform_index;
77 }
78 
79 
xed_encoder_request_iforms(xed_encoder_request_t * p)80 static XED_INLINE xed_encoder_iforms_t* xed_encoder_request_iforms(xed_encoder_request_t* p) {
81     return &(xed_encoder_request_ev(p)->_iforms);
82 }
83 
xed_encoder_request_ilen(const xed_encoder_request_t * p)84 static XED_INLINE xed_uint32_t xed_encoder_request_ilen(const xed_encoder_request_t* p) {
85     return xed_encoder_request_ev_const(p)->_ilen;
86 }
87 
xed_encoder_request_olen(const xed_encoder_request_t * p)88 static XED_INLINE xed_uint32_t xed_encoder_request_olen(const xed_encoder_request_t* p) {
89     return xed_encoder_request_ev_const(p)->_olen;
90 }
xed_encoder_request_bit_offset(const xed_encoder_request_t * p)91 static XED_INLINE xed_uint32_t xed_encoder_request_bit_offset(const xed_encoder_request_t* p) {
92     return xed_encoder_request_ev_const(p)->_bit_offset;
93 }
94 
95 
xed_encoder_request_set_ilen(xed_encoder_request_t * p,xed_uint32_t ilen)96 static XED_INLINE void xed_encoder_request_set_ilen(xed_encoder_request_t* p, xed_uint32_t ilen) {
97     xed_encoder_request_ev(p)->_ilen= ilen;
98 }
xed_encoder_request_set_olen(xed_encoder_request_t * p,xed_uint32_t olen)99 static XED_INLINE void xed_encoder_request_set_olen(xed_encoder_request_t* p, xed_uint32_t olen) {
100     xed_encoder_request_ev(p)->_olen=olen;
101 }
102 static XED_INLINE void
xed_encoder_request_set_bit_offset(xed_encoder_request_t * p,xed_uint32_t bit_offset)103 xed_encoder_request_set_bit_offset( xed_encoder_request_t* p, xed_uint32_t bit_offset) {
104     xed_encoder_request_ev(p)->_bit_offset = bit_offset;
105 }
106 static XED_INLINE void
xed_encoder_request_update_bit_offset(xed_encoder_request_t * p,xed_uint32_t bit_offset_delta)107 xed_encoder_request_update_bit_offset( xed_encoder_request_t* p, xed_uint32_t bit_offset_delta) {
108     xed_encoder_request_ev(p)->_bit_offset += bit_offset_delta;
109 }
110 
111 static XED_INLINE const xed_encoder_iform_t*
xed_encoder_get_encoder_iform(const xed_encoder_request_t * r)112 xed_encoder_get_encoder_iform(const xed_encoder_request_t* r){
113     xed_uint16_t iform_index = xed_encoder_request_get_iform_index(r);
114     // KW false positive. Correct by construction.
115     return xed_encode_iform_db + iform_index;
116 }
117 
118 void
119 xed_encoder_request_emit_legacy_map(xed_encoder_request_t* q);
120 
121 void
122 xed_encoder_request_emit_bytes(xed_encoder_request_t* q,
123                                const xed_uint8_t bits,
124                                const xed_uint64_t value);
125 void
126 xed_encoder_request_encode_emit(xed_encoder_request_t* q,
127                                 const unsigned int bits,
128                                 const xed_uint64_t value);
129 
130 xed_bool_t
131 xed_encoder_request__memop_compatible(const xed_encoder_request_t* p,
132                                       xed_operand_width_enum_t operand_width);
133 
134 
135 static XED_INLINE xed_ptrn_func_ptr_t
xed_encoder_get_fb_ptrn(const xed_encoder_request_t * p)136 xed_encoder_get_fb_ptrn(const xed_encoder_request_t* p){
137     const xed_encoder_iform_t* enc_iform =  xed_encoder_get_encoder_iform(p);
138     return xed_encode_fb_lu_table[enc_iform->_fb_ptrn_index];
139 }
140 
141 static XED_INLINE xed_ptrn_func_ptr_t
xed_encoder_get_emit_ptrn(const xed_encoder_request_t * p)142 xed_encoder_get_emit_ptrn(const xed_encoder_request_t* p){
143     const xed_encoder_iform_t* enc_iform =  xed_encoder_get_encoder_iform(p);
144     return xed_encode_emit_lu_table[enc_iform->_emit_ptrn_index];
145 }
146 
147 static XED_INLINE xed_uint8_t
xed_encoder_get_nominal_opcode(const xed_encoder_request_t * p)148 xed_encoder_get_nominal_opcode(const xed_encoder_request_t* p){
149     const xed_encoder_iform_t* enc_iform =  xed_encoder_get_encoder_iform(p);
150     return enc_iform->_nom_opcode;
151 }
152 static XED_INLINE xed_uint8_t
xed_encoder_get_map(const xed_encoder_request_t * p)153 xed_encoder_get_map(const xed_encoder_request_t* p){
154     const xed_encoder_iform_t* enc_iform =  xed_encoder_get_encoder_iform(p);
155     return enc_iform->_legacy_map;
156 }
157 
158 static XED_INLINE xed_uint16_t
xed_encoder_get_fb_values_index(const xed_encoder_request_t * p)159 xed_encoder_get_fb_values_index(const xed_encoder_request_t* p){
160     const xed_encoder_iform_t* enc_iform =  xed_encoder_get_encoder_iform(p);
161     return enc_iform->_fb_values_index;
162 }
163 
164 
165 static XED_INLINE const xed_uint8_t*
xed_encoder_get_start_field_value(const xed_encoder_request_t * p)166 xed_encoder_get_start_field_value(const xed_encoder_request_t* p){
167     xed_uint16_t base_index = xed_encoder_get_fb_values_index(p);
168     return xed_encode_fb_values_table + base_index;
169 }
170 
171 
172 static XED_INLINE xed_encode_function_pointer_t
xed_encoder_get_group_encoding_function(xed_iclass_enum_t iclass)173 xed_encoder_get_group_encoding_function(xed_iclass_enum_t iclass){
174     xed_uint16_t indx = xed_enc_iclass2group[iclass];
175     return xed_encode_groups[indx];
176 }
177 
178 static XED_INLINE xed_uint8_t
xed_encoder_get_iclasses_index_in_group(const xed_encoder_request_t * p)179 xed_encoder_get_iclasses_index_in_group(const xed_encoder_request_t* p){
180     xed_iclass_enum_t iclass = xed_encoder_request_get_iclass(p);
181     return xed_enc_iclass2index_in_group[iclass];
182 }
183 
184 
185 #endif
186