Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

641 lines
37 KiB

  1. /*
  2. * Copyright (c) 2000, Intel Corporation
  3. * All rights reserved.
  4. *
  5. * WARRANTY DISCLAIMER
  6. *
  7. * THESE MATERIALS ARE PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  8. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  9. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  10. * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR ITS
  11. * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  12. * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  13. * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  14. * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  15. * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR TORT (INCLUDING
  16. * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THESE
  17. * MATERIALS, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  18. *
  19. * Intel Corporation is the author of the Materials, and requests that all
  20. * problem reports or change requests be submitted to it directly at
  21. * http://developer.intel.com/opensource.
  22. */
  23. #ifndef _FRMT_MAC_H_
  24. #define _FRMT_MAC_H_
  25. #include "decoder_priv.h"
  26. #define PRED_SIZE EM_PREDICATE_BITS
  27. #define GET_REG_VALUE(Value,Binary,Pos,Sz) \
  28. { \
  29. int mask = (1<<(Sz))-1; \
  30. U64 tmp64; \
  31. IEL_SHR(tmp64,(Binary),(Pos)); \
  32. (Value) = IEL_GETDW0(tmp64); \
  33. (Value) &= mask; \
  34. }
  35. #define FILL_REG_INFO(Reg_type, Reg_name, Value, Max_value, Dec_oper, Err) \
  36. { \
  37. (Dec_oper).type = EM_DECODER_REGISTER; \
  38. (Dec_oper).reg_info.valid = 1; \
  39. (Dec_oper).reg_info.value = (Value); \
  40. (Dec_oper).reg_info.type = (Reg_type); \
  41. (Dec_oper).reg_info.name = (Reg_name)+(Value); \
  42. \
  43. if ((Value)>=(Max_value)) \
  44. { \
  45. (Dec_oper).reg_info.valid = 0; \
  46. if (!(Err)) \
  47. (Err) = EM_DECODER_REGISTER_VALUE_OUT_OF_RANGE; \
  48. } \
  49. }
  50. #define CHECK_REG_VALUE_0(Value, Dec_oper, Err) \
  51. { \
  52. if ((Value) == 0) \
  53. { \
  54. (Dec_oper).reg_info.valid = 0; \
  55. if (!(Err)) \
  56. (Err) = EM_DECODER_WRITE_TO_ZERO_REGISTER; \
  57. } \
  58. }
  59. #define CHECK_FP_REG_VALUE_0_1(Value, Dec_oper, Err) \
  60. { \
  61. if (((Value) == 0) || ((Value) == 1)) \
  62. { \
  63. (Dec_oper).reg_info.valid = 0; \
  64. if (!(Err)) \
  65. (Err) = EM_DECODER_WRITE_TO_SPECIAL_FP_REGISTER; \
  66. } \
  67. }
  68. #define CHECK_DEST_AND_BASE(Dec_oper_dest, Dec_oper_base, Err) \
  69. { \
  70. if ((Dec_oper_dest).reg_info.value == \
  71. (Dec_oper_base).mem_info.mem_base.value) \
  72. if (!(Err)) \
  73. (Err) = EM_DECODER_BASE_EQUAL_DEST; \
  74. }
  75. #define CHECK_DEST_AND_DEST(Dec_info_p, Err) \
  76. { \
  77. if ((Dec_info_p)->dst1.reg_info.value == \
  78. (Dec_info_p)->dst2.reg_info.value) \
  79. { \
  80. if (!(Err)) \
  81. (Err) = EM_DECODER_EQUAL_DESTS; \
  82. if (EM_DECODER_CHECK_UNC_ILLEGAL_FAULT(Dec_info_p)) \
  83. EM_DECODER_SET_UNC_ILLEGAL_FAULT(Dec_info_p); \
  84. } \
  85. }
  86. #define CHECK_ODD_EVEN_DSTS(Dec_oper_dest1, Dec_oper_dest2, Err) \
  87. { \
  88. int reg_val1 = (Dec_oper_dest1).reg_info.value; \
  89. int reg_val2 = (Dec_oper_dest2).reg_info.value; \
  90. if (((reg_val1<32)&& (reg_val2<32))|| \
  91. ((reg_val1>32)&& (reg_val2>32))) \
  92. { \
  93. if (!((reg_val1^reg_val2)&1)) /* both even of odd */ \
  94. { \
  95. if (!(Err)) \
  96. (Err) = EM_DECODER_ODD_EVEN_DESTS; \
  97. } \
  98. } \
  99. }
  100. #define GET_SIMM_VALUE1(Value,Pos1,Sz1,Binary) \
  101. { \
  102. int mask = (1<<(Sz1))-1; \
  103. int or_mask, is_neg,imm_size = (Sz1); \
  104. U64 tmp64; \
  105. IEL_SHR(tmp64,(Binary),((Pos1)+PRED_SIZE)); \
  106. (Value) = IEL_GETDW0(tmp64); \
  107. (Value) &= mask; \
  108. is_neg = (Value)>>(imm_size-1); \
  109. or_mask = is_neg * (((1<<(32-imm_size))-1)<<imm_size); \
  110. (Value) |= or_mask; \
  111. }
  112. #define GET_SIMM_VALUE2(Value,Pos1,Sz1,Pos2,Sz2,Binary) \
  113. { \
  114. int mask1 = (1<<(Sz1))-1; \
  115. int mask2 = (1<<(Sz2))-1; \
  116. int or_mask, is_neg,imm_size = (Sz1)+(Sz2); \
  117. U64 tmp64; \
  118. int tmp; \
  119. IEL_SHR(tmp64,(Binary),PRED_SIZE); \
  120. tmp = IEL_GETDW0(tmp64); \
  121. (Value) = (((tmp>>(Pos1))&mask1) | (((tmp>>(Pos2))&mask2)<<(Sz1))); \
  122. is_neg = (Value)>>(imm_size-1); \
  123. or_mask = is_neg * (((1<<(32-imm_size))-1)<<imm_size); \
  124. (Value) |= or_mask; \
  125. }
  126. #define GET_SIMM_VALUE_NP2(Value,Pos1,Sz1,Pos2,Sz2,Binary) \
  127. { \
  128. int mask1 = (1<<(Sz1))-1; \
  129. int mask2 = (1<<(Sz2))-1; \
  130. int or_mask, is_neg,imm_size = (Sz1)+(Sz2); \
  131. U64 tmp64; \
  132. int tmp; \
  133. IEL_SHR(tmp64, Binary, Pos1); \
  134. tmp = IEL_GETDW0(tmp64); \
  135. (Value) = (tmp & mask1); \
  136. IEL_SHR(tmp64, Binary, Pos2); \
  137. tmp = IEL_GETDW0(tmp64); \
  138. (Value) |= ((tmp & mask2)<<(Sz1)); \
  139. is_neg = (Value)>>(imm_size-1); \
  140. or_mask = is_neg * (((1<<(32-imm_size))-1)<<imm_size); \
  141. (Value) |= or_mask; \
  142. }
  143. #define GET_CMP4_UIMM_VALUE2(Value,Pos1,Sz1,Pos2,Sz2,Binary) \
  144. { \
  145. int mask1 = (1<<(Sz1))-1; \
  146. int mask2 = (1<<(Sz2))-1; \
  147. int or_mask, to_complete,imm_size = (Sz1)+(Sz2); \
  148. U64 tmp64; \
  149. int tmp; \
  150. IEL_SHR(tmp64,(Binary),PRED_SIZE); \
  151. tmp = IEL_GETDW0(tmp64); \
  152. (Value) = (((tmp>>(Pos1))&mask1) | (((tmp>>(Pos2))&mask2)<<(Sz1))); \
  153. to_complete = (Value)>>(imm_size-1); \
  154. or_mask = to_complete * (((1<<(32-imm_size))-1)<<imm_size); \
  155. (Value) |= or_mask; \
  156. }
  157. #define GET_CMP_UIMM_VALUE2(Value64,Pos1,Sz1,Pos2,Sz2,Binary) \
  158. { \
  159. int mask1 = (1<<(Sz1))-1; \
  160. int mask2 = (1<<(Sz2))-1; \
  161. int or_mask, to_complete,imm_size = (Sz1)+(Sz2); \
  162. U64 tmp64; \
  163. int tmp, val1, val2; \
  164. IEL_SHR(tmp64,(Binary),PRED_SIZE); \
  165. tmp = IEL_GETDW0(tmp64); \
  166. val1 = (((tmp>>(Pos1))&mask1) | (((tmp>>(Pos2))&mask2)<<(Sz1))); \
  167. to_complete = val1>>(imm_size-1); \
  168. or_mask = to_complete * (((1<<(32-imm_size))-1)<<imm_size); \
  169. val1 |= or_mask; \
  170. val2 = to_complete * (-1); \
  171. IEL_CONVERT2((Value64),val1,val2); \
  172. }
  173. #define GET_SIMM_VALUE3(Value,Pos1,Sz1,Pos2,Sz2,Pos3,Sz3,Binary) \
  174. { \
  175. int mask1 = (1<<(Sz1))-1; \
  176. int mask2 = (1<<(Sz2))-1; \
  177. int mask3 = (1<<(Sz3))-1; \
  178. int or_mask, is_neg,imm_size = (Sz1)+(Sz2)+(Sz3); \
  179. U64 tmp64; \
  180. int tmp; \
  181. IEL_SHR(tmp64,(Binary),PRED_SIZE); \
  182. tmp = IEL_GETDW0(tmp64); \
  183. (Value) = (((tmp>>(Pos1))&mask1) | (((tmp>>(Pos2))&mask2)<<(Sz1)) | \
  184. (((tmp>>(Pos3))&mask3)<<((Sz1)+(Sz2)))); \
  185. is_neg = (Value)>>(imm_size-1); \
  186. or_mask = is_neg * (((1<<(32-imm_size))-1)<<imm_size); \
  187. (Value) |= or_mask; \
  188. }
  189. #define GET_SIMM_VALUE4(Value,Pos1,Sz1,Pos2,Sz2,Pos3,Sz3,Pos4,Sz4,Binary) \
  190. { \
  191. int mask1 = (1<<(Sz1))-1; \
  192. int mask2 = (1<<(Sz2))-1; \
  193. int mask3 = (1<<(Sz3))-1; \
  194. int mask4 = (1<<(Sz4))-1; \
  195. int or_mask, is_neg,imm_size = (Sz1)+(Sz2)+(Sz3)+(Sz4); \
  196. U64 tmp64; \
  197. int tmp; \
  198. IEL_SHR(tmp64,(Binary),PRED_SIZE); \
  199. tmp = IEL_GETDW0(tmp64); \
  200. (Value) = (((tmp>>(Pos1))&mask1) | (((tmp>>(Pos2))&mask2)<<(Sz1)) | \
  201. (((tmp>>(Pos3))&mask3)<<((Sz1)+(Sz2))) | \
  202. (((tmp>>(Pos4))&mask4)<<((Sz1)+(Sz2)+(Sz3)))); \
  203. is_neg = (Value)>>(imm_size-1); \
  204. or_mask = is_neg * (((1<<(32-imm_size))-1)<<imm_size); \
  205. (Value) |= or_mask; \
  206. }
  207. #define GET_SIMM_VALUE5(Value,Pos1,Sz1,Pos2,Sz2,Pos3,Sz3,Pos4,Sz4, \
  208. Pos5,Sz5,Binary) \
  209. { \
  210. int mask1 = (1<<(Sz1))-1; \
  211. int mask2 = (1<<(Sz2))-1; \
  212. int mask3 = (1<<(Sz3))-1; \
  213. int mask4 = (1<<(Sz4))-1; \
  214. int mask5 = (1<<(Sz5))-1; \
  215. int or_mask, is_neg,imm_size = (Sz1)+(Sz2)+(Sz3)+(Sz4)+(Sz5); \
  216. U64 tmp64; \
  217. int tmp; \
  218. IEL_SHR(tmp64,(Binary),PRED_SIZE); \
  219. tmp = IEL_GETDW0(tmp64); \
  220. (Value) = (((tmp>>(Pos1))&mask1) | (((tmp>>(Pos2))&mask2)<<(Sz1)) | \
  221. (((tmp>>(Pos3))&mask3)<<((Sz1)+(Sz2))) | \
  222. (((tmp>>(Pos4))&mask4)<<((Sz1)+(Sz2)+(Sz3))) | \
  223. (((tmp>>(Pos5))&mask5)<<((Sz1)+(Sz2)+(Sz3)+(Sz4)))); \
  224. is_neg = (Value)>>(imm_size-1); \
  225. or_mask = is_neg * (((1<<(32-imm_size))-1)<<imm_size); \
  226. (Value) |= or_mask; \
  227. }
  228. #define GET_UIMM_VALUE_NP1(Value,Pos1,Sz1,Binary) \
  229. GET_UIMM_VALUE1((Value),((Pos1)-PRED_SIZE),(Sz1),(Binary))
  230. #define GET_UIMM_VALUE_NP2(Value,Pos1,Sz1,Pos2,Sz2,Binary) \
  231. { \
  232. int mask1 = (1<<(Sz1))-1; \
  233. int mask2 = (1<<(Sz2))-1; \
  234. U64 tmp64; \
  235. int tmp1,tmp2; \
  236. IEL_SHR(tmp64,(Binary),(Pos1)); \
  237. tmp1 = IEL_GETDW0(tmp64); \
  238. IEL_SHR(tmp64,(Binary),(Pos2)); \
  239. tmp2 = IEL_GETDW0(tmp64); \
  240. (Value) = (tmp1 & mask1) | ((tmp2 & mask2)<<(Sz1)); \
  241. }
  242. #define GET_SIMM_VALUE_NP3(Value,Pos1,Sz1,Pos2,Sz2,Pos3,Sz3,Binary) \
  243. { \
  244. int mask1 = (1<<(Sz1))-1; \
  245. int mask2 = (1<<(Sz2))-1; \
  246. int mask3 = (1<<(Sz3))-1; \
  247. U64 tmp64; \
  248. int or_mask, is_neg,imm_size = (Sz1)+(Sz2)+(Sz3); \
  249. int tmp1,tmp2,tmp3; \
  250. IEL_SHR(tmp64,(Binary),(Pos1)); \
  251. tmp1 = IEL_GETDW0(tmp64); \
  252. IEL_SHR(tmp64,(Binary),(Pos2)); \
  253. tmp2 = IEL_GETDW0(tmp64); \
  254. IEL_SHR(tmp64,(Binary),(Pos3)); \
  255. tmp3 = IEL_GETDW0(tmp64); \
  256. (Value) = (tmp1 & mask1) | ((tmp2 & mask2)<<(Sz1)) | \
  257. ((tmp3 & mask3)<<((Sz1)+(Sz2))); \
  258. is_neg = (Value)>>(imm_size-1); \
  259. or_mask = is_neg * (((1<<(32-imm_size))-1)<<imm_size); \
  260. (Value) |= or_mask; \
  261. }
  262. #define GET_UIMM_VALUE1(Value,Pos1,Sz1,Binary) \
  263. { \
  264. int mask = (1<<(Sz1))-1; \
  265. U64 tmp64; \
  266. IEL_SHR(tmp64,(Binary),((Pos1)+PRED_SIZE)); \
  267. (Value) = IEL_GETDW0(tmp64); \
  268. (Value) &= mask; \
  269. }
  270. #define GET_UIMM_VALUE2(Value,Pos1,Sz1,Pos2,Sz2,Binary) \
  271. { \
  272. int mask1 = (1<<(Sz1))-1; \
  273. int mask2 = (1<<(Sz2))-1; \
  274. U64 tmp64; \
  275. int tmp; \
  276. IEL_SHR(tmp64,(Binary),PRED_SIZE); \
  277. tmp = IEL_GETDW0(tmp64); \
  278. (Value) = (((tmp>>(Pos1))&mask1) | (((tmp>>(Pos2))&mask2)<<(Sz1))); \
  279. }
  280. #define GET_UIMM_VALUE3(Value,Pos1,Sz1,Pos2,Sz2,Pos3,Sz3,Binary) \
  281. { \
  282. int mask1 = (1<<(Sz1))-1; \
  283. int mask2 = (1<<(Sz2))-1; \
  284. int mask3 = (1<<(Sz3))-1; \
  285. U64 tmp64; \
  286. int tmp; \
  287. IEL_SHR(tmp64,(Binary),PRED_SIZE); \
  288. tmp = IEL_GETDW0(tmp64); \
  289. (Value) = (((tmp>>(Pos1))&mask1) | (((tmp>>(Pos2))&mask2)<<(Sz1)) | \
  290. (((tmp>>(Pos3))&mask3)<<((Sz1)+(Sz2)))); \
  291. }
  292. #define GET_UIMM_VALUE4(Value,Pos1,Sz1,Pos2,Sz2,Pos3,Sz3,Pos4,Sz4,Binary) \
  293. { \
  294. int mask1 = (1<<(Sz1))-1; \
  295. int mask2 = (1<<(Sz2))-1; \
  296. int mask3 = (1<<(Sz3))-1; \
  297. int mask4 = (1<<(Sz4))-1; \
  298. U64 tmp64; \
  299. int tmp; \
  300. IEL_SHR(tmp64,(Binary),PRED_SIZE); \
  301. tmp = IEL_GETDW0(tmp64); \
  302. (Value) = (((tmp>>(Pos1))&mask1) | (((tmp>>(Pos2))&mask2)<<(Sz1)) | \
  303. (((tmp>>(Pos3))&mask3)<<((Sz1)+(Sz2))) | \
  304. (((tmp>>(Pos4))&mask4)<<((Sz1)+(Sz2)+(Sz3)))); \
  305. }
  306. #define GET_UIMM_VALUE5(Value,Pos1,Sz1,Pos2,Sz2,Pos3,Sz3,Pos4,Sz4, \
  307. Pos5,Sz5,Binary) \
  308. { \
  309. int mask1 = (1<<(Sz1))-1; \
  310. int mask2 = (1<<(Sz2))-1; \
  311. int mask3 = (1<<(Sz3))-1; \
  312. int mask4 = (1<<(Sz4))-1; \
  313. int mask5 = (1<<(Sz5))-1; \
  314. U64 tmp64; \
  315. int tmp; \
  316. IEL_SHR(tmp64,(Binary),PRED_SIZE); \
  317. tmp = IEL_GETDW0(tmp64); \
  318. (Value) = (((tmp>>(Pos1))&mask1) | (((tmp>>(Pos2))&mask2)<<(Sz1)) | \
  319. (((tmp>>(Pos3))&mask3)<<((Sz1)+(Sz2))) | \
  320. (((tmp>>(Pos4))&mask4)<<((Sz1)+(Sz2)+(Sz3))) | \
  321. (((tmp>>(Pos5))&mask5)<<((Sz1)+(Sz2)+(Sz3)+(Sz4)))); \
  322. }
  323. #define FILL_IMM_INFO(Imm_type, Value, Size, Dec_oper) \
  324. { \
  325. (Dec_oper).type = EM_DECODER_IMMEDIATE; \
  326. (Dec_oper).imm_info.imm_type = (Imm_type); \
  327. (Dec_oper).imm_info.size = (Size); \
  328. if (((Imm_type)==EM_DECODER_IMM_SIGNED) && ((Value)<0)) \
  329. IEL_CONVERT2((Dec_oper).imm_info.val64,(Value),0xffffffff); \
  330. else \
  331. IEL_CONVERT2((Dec_oper).imm_info.val64,(Value),0); \
  332. }
  333. #define FILL_LONG_IMM_INFO(Imm_type, Value64, Size, Dec_oper) \
  334. { \
  335. (Dec_oper).type = EM_DECODER_IMMEDIATE; \
  336. (Dec_oper).imm_info.imm_type = (Imm_type); \
  337. (Dec_oper).imm_info.size = (Size); \
  338. (Dec_oper).imm_info.val64 = (Value64); \
  339. }
  340. #define FILL_MEM_INFO(Value, Mem_size, Dec_oper, Err) \
  341. { \
  342. (Dec_oper).type = EM_DECODER_MEMORY; \
  343. (Dec_oper).mem_info.mem_base.type = EM_DECODER_INT_REG; \
  344. (Dec_oper).mem_info.mem_base.name = EM_DECODER_REG_R0+(Value); \
  345. (Dec_oper).mem_info.mem_base.value = (Value); \
  346. (Dec_oper).mem_info.mem_base.valid = 1; \
  347. (Dec_oper).mem_info.size = (Mem_size); \
  348. \
  349. if ((Value)>=EM_NUM_OF_GREGS) \
  350. { \
  351. (Dec_oper).mem_info.mem_base.valid = 0; \
  352. if (!(Err)) \
  353. (Err) = EM_DECODER_REGISTER_VALUE_OUT_OF_RANGE; \
  354. } \
  355. }
  356. #define FILL_REGFILE_INFO(Reg_name, Value, Dec_oper, Err) \
  357. { \
  358. (Dec_oper).type = EM_DECODER_REGFILE; \
  359. (Dec_oper).regfile_info.name = (Reg_name); \
  360. (Dec_oper).regfile_info.index.valid = 1; \
  361. (Dec_oper).regfile_info.index.type = EM_DECODER_INT_REG; \
  362. (Dec_oper).regfile_info.index.name = EM_DECODER_REG_R0+(Value); \
  363. (Dec_oper).regfile_info.index.value = (Value); \
  364. \
  365. if ((Value)>=EM_NUM_OF_GREGS) \
  366. { \
  367. (Dec_oper).regfile_info.index.valid = 0; \
  368. if (!(Err)) \
  369. (Err) = EM_DECODER_REGISTER_VALUE_OUT_OF_RANGE; \
  370. } \
  371. }
  372. #define FILL_LONG_IPREL_INFO(Value64, Size, Dec_oper) \
  373. { \
  374. (Dec_oper).type = EM_DECODER_IP_RELATIVE; \
  375. (Dec_oper).imm_info.size = (Size); \
  376. (Dec_oper).imm_info.val64 = (Value64); \
  377. }
  378. #define FILL_IPREL_INFO(Value, Size, Dec_oper) \
  379. { \
  380. (Dec_oper).type = EM_DECODER_IP_RELATIVE; \
  381. (Dec_oper).imm_info.size = (Size); \
  382. if ((Value)<0) \
  383. { \
  384. IEL_CONVERT2((Dec_oper).imm_info.val64,(Value),0xffffffff); \
  385. } \
  386. else \
  387. { \
  388. IEL_CONVERT2((Dec_oper).imm_info.val64,(Value),0); \
  389. } \
  390. }
  391. #define CHECK_REG_CR(Value, Dec_oper, Err) \
  392. { \
  393. if (EM_CREG_IS_RESERVED(Value)) \
  394. { \
  395. (Dec_oper).reg_info.valid = 0; \
  396. if (!(Err)) \
  397. (Err) = EM_DECODER_REGISTER_RESERVED_VALUE; \
  398. } \
  399. }
  400. #define CHECK_REG_APP_GRP_HIGH(Value, Dec_oper, Err) \
  401. { \
  402. if (!EM_APP_REG_IS_I_ROLE(Value)) \
  403. { \
  404. (Dec_oper).reg_info.valid = 0; \
  405. if (!(Err)) \
  406. (Err) = EM_DECODER_REGISTER_VALUE_OUT_OF_RANGE; \
  407. } \
  408. else if (EM_APP_REG_IS_RESERVED(Value)) \
  409. { \
  410. (Dec_oper).reg_info.valid = 0; \
  411. if (!(Err)) \
  412. (Err) = EM_DECODER_REGISTER_RESERVED_VALUE; \
  413. } \
  414. }
  415. #define CHECK_REG_APP_GRP_LOW(Value, Dec_oper, Err) \
  416. { \
  417. if (EM_APP_REG_IS_I_ROLE(Value)) \
  418. { \
  419. (Dec_oper).reg_info.valid = 0; \
  420. if (!(Err)) \
  421. (Err) = EM_DECODER_REGISTER_VALUE_OUT_OF_RANGE; \
  422. } \
  423. else if (EM_APP_REG_IS_RESERVED(Value)) \
  424. { \
  425. (Dec_oper).reg_info.valid = 0; \
  426. if (!(Err)) \
  427. (Err) = EM_DECODER_REGISTER_RESERVED_VALUE; \
  428. } \
  429. }
  430. #define CHECK_IMM_COUNT_123(Value, Err) \
  431. { \
  432. if (((Value)<1)||((Value)>3)) \
  433. if (!(Err)) \
  434. (Err) = EM_DECODER_IMMEDIATE_VALUE_OUT_OF_RANGE; \
  435. }
  436. #define CHECK_IMM_COUNT_1234(Value, Err) \
  437. { \
  438. if (((Value)<1)||((Value)>4)) \
  439. if (!(Err)) \
  440. (Err) = EM_DECODER_IMMEDIATE_VALUE_OUT_OF_RANGE; \
  441. }
  442. #define CHECK_IMM_COUNT_PACK(Value, Err) \
  443. { \
  444. if (((Value)!=0)&&((Value)!=7)&&((Value)!=15)&&((Value)!=16)) \
  445. if (!(Err)) \
  446. (Err) = EM_DECODER_IMMEDIATE_INVALID_VALUE; \
  447. }
  448. #define CHECK_IMM_MUX1(Value, Err) \
  449. { \
  450. switch(Value) \
  451. { \
  452. case EM_MUX_BRCST: \
  453. case EM_MUX_MIX: \
  454. case EM_MUX_SHUF: \
  455. case EM_MUX_ALT: \
  456. case EM_MUX_REV: \
  457. break; \
  458. default: \
  459. (Err) = EM_DECODER_IMMEDIATE_INVALID_VALUE; \
  460. } \
  461. }
  462. #define CONVERT_IMM_SEMAPHORE_INC(Value, Err) \
  463. { \
  464. switch (Value) \
  465. { \
  466. case 0: \
  467. Value = 16; \
  468. break; \
  469. case 1: \
  470. Value = 8; \
  471. break; \
  472. case 2: \
  473. Value = 4; \
  474. break; \
  475. case 3: \
  476. Value = 1; \
  477. break; \
  478. case (-4): \
  479. Value = -16; \
  480. break; \
  481. case (-3): \
  482. Value = -8; \
  483. break; \
  484. case (-2): \
  485. Value = -4; \
  486. break; \
  487. case (-1): \
  488. Value = -1; \
  489. break; \
  490. default: \
  491. if (!(Err)) \
  492. (Err) = EM_DECODER_IMMEDIATE_INVALID_VALUE; \
  493. } \
  494. }
  495. #define CONVERT_IMM_COUNT_PACK(Value) \
  496. { \
  497. switch(Value) \
  498. { \
  499. case (0): \
  500. break; \
  501. case (1): \
  502. (Value) = 7; \
  503. break; \
  504. case (2): \
  505. (Value) = 15; \
  506. break; \
  507. case (3): \
  508. (Value) = 16; \
  509. break; \
  510. } \
  511. }
  512. #define GET_UIMM64_VALUE1(Value64,Start,Pos1,Sz1,Bin128) \
  513. { \
  514. U128 tmp128; \
  515. U64 mask; \
  516. IEL_CONVERT2(mask, 1, 0); \
  517. IEL_SHL(mask, mask, (Sz1)); \
  518. IEL_DECU(mask); \
  519. IEL_SHR(tmp128,(Bin128),(5+41)+(Pos1)); \
  520. IEL_AND(tmp128, tmp128, mask); \
  521. IEL_SHL(tmp128,tmp128,(Start)); \
  522. IEL_OR((Value64),(Value64),tmp128); \
  523. }
  524. #define GET_UIMM_2_U64_VALUE1(Value64,Start,Pos1,Sz1,Binary) \
  525. { \
  526. int mask = (1<<(Sz1))-1; \
  527. unsigned int Value; \
  528. U64 tmp64; \
  529. IEL_SHR(tmp64,(Binary),((Pos1)+PRED_SIZE)); \
  530. (Value) = IEL_GETDW0(tmp64); \
  531. (Value) &= mask; \
  532. IEL_CONVERT2(tmp64, Value, 0); \
  533. IEL_SHL(tmp64, tmp64, (Start)); \
  534. IEL_OR((Value64), (Value64), tmp64); \
  535. }
  536. #define GET_UIMM64_VALUE6_1(Value64, Pos1, Sz1, Pos2, Sz2, Pos3, Sz3, \
  537. Pos4, Sz4, Pos5, Sz5, Pos6, Sz6, Bin128) \
  538. { \
  539. U128 tmp128; \
  540. U64 mask; \
  541. IEL_SHR(tmp128,Bin128,(5+41)); \
  542. IEL_CONVERT2(mask, 0xffffffff,0x1ff); \
  543. IEL_AND(tmp128, tmp128, mask); \
  544. IEL_SHL(tmp128,tmp128,((Sz1)+(Sz2)+(Sz3)+(Sz4))); \
  545. IEL_OR((Value64),(Value64),tmp128); \
  546. \
  547. }
  548. #define GET_UIMM64_VALUE6_2(Value64, Pos1, Sz1, Pos2, Sz2, Pos3, Sz3, \
  549. Pos4, Sz4, Pos5, Sz5, Pos6, Sz6, Bin128) \
  550. { \
  551. U128 tmp128; \
  552. U64 mask; \
  553. IEL_SHR(tmp128,Bin128,((Pos6)+5+41+41)); \
  554. IEL_CONVERT2(mask, 1,0); \
  555. IEL_AND(tmp128, tmp128, mask); \
  556. IEL_SHL(tmp128,tmp128,((Sz1)+(Sz2)+(Sz3)+(Sz4)+(Sz5))); \
  557. IEL_OR((Value64),(Value64),tmp128); \
  558. }
  559. #define SET_2ND_ROLE_TO_DEST(Dec_oper) \
  560. ((Dec_oper).oper_flags |= EM_DECODER_OPER_2ND_ROLE_DST_BIT)
  561. #define SET_2ND_ROLE_TO_SRC(Dec_oper) \
  562. ((Dec_oper).oper_flags |= EM_DECODER_OPER_2ND_ROLE_SRC_BIT)
  563. #define GET_PREDICATE_HARD_CODED_VALUE(Value,Binary) \
  564. GET_UIMM_VALUE1((Value),((EM_PREDICATE_POS)-PRED_SIZE),(PRED_SIZE),(Binary))
  565. #define CHECK_PREDICATE_HARD_CODED(Value, HC_Value, Err) \
  566. { \
  567. if ((Value) != (HC_Value)) \
  568. { \
  569. if (!(Err)) \
  570. (Err) = EM_DECODER_HARD_CODED_PREDICATE_INVALID_VALUE; \
  571. } \
  572. }
  573. #define GET_FIELD_HARD_CODED_VALUE(Value,Pos,Sz,Binary) \
  574. GET_UIMM_VALUE1((Value),((Pos)-PRED_SIZE),(Sz),(Binary))
  575. #define CHECK_FIELD_HARD_CODED(Value, HC_Value, Err) \
  576. { \
  577. if ((Value) != (HC_Value)) \
  578. { \
  579. if (!(Err)) \
  580. (Err) = EM_DECODER_HARD_CODED_FIELD_INVALID_VALUE; \
  581. } \
  582. }
  583. #endif /* FRMT_MAC_H_ */