Guest User

Untitled

a guest
Apr 25th, 2022
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.82 KB | None | 0 0
  1. enum svp64_rm_field {
  2.     SVP64_RM_SPR,
  3.     SVP64_RM_MMODE,
  4.     SVP64_RM_MASK,
  5.     SVP64_RM_ELWIDTH,
  6.     SVP64_RM_EWSRC,
  7.     SVP64_RM_SUBVL,
  8.     SVP64_RM_EXTRA,
  9.     SVP64_RM_MODE,
  10.     SVP64_RM_EXTRA2_0,
  11.     SVP64_RM_EXTRA2_1,
  12.     SVP64_RM_EXTRA2_2,
  13.     SVP64_RM_EXTRA2_3,
  14.     SVP64_RM_SMASK,
  15.     SVP64_RM_EXTRA3_0,
  16.     SVP64_RM_EXTRA3_1,
  17. };
  18. struct svp64_rm {
  19.     uint32_t value : 24;
  20. };
  21. uint32_t svp64_rm_get(struct svp64_rm storage, enum svp64_rm_field field);
  22. void svp64_rm_set(struct svp64_rm *storage, enum svp64_rm_field field, uint32_t value);
  23.  
  24. #define SVP64_FIELD_CLEAR(VALUE, BIT) \
  25.     (VALUE & ~((UINT32_C(1) << UINT32_C(BIT))))
  26.  
  27. #define SVP64_FIELD_REMAP(VALUE, SRC, DST) \
  28.     (((VALUE >> UINT32_C(SRC)) & UINT32_C(1)) << UINT32_C(DST))
  29.  
  30. #define SVP64_FIELD_GET(ORIGIN, SRC, DST) \
  31.     SVP64_FIELD_REMAP(ORIGIN, SRC, DST)
  32.  
  33. #define SVP64_FIELD_SET(RESULT, VALUE, SRC, DST) \
  34.     *(RESULT) = (SVP64_FIELD_CLEAR(*(RESULT), DST) | SVP64_FIELD_REMAP(VALUE, SRC, DST))
  35.  
  36. uint32_t svp64_rm_get(struct svp64_rm storage, enum svp64_rm_field field)
  37. {
  38.     uint32_t result = UINT32_C(0);
  39.     uint32_t origin = storage.value;
  40.  
  41.     switch (field) {
  42.         case SVP64_RM_SPR:
  43.             result |= SVP64_FIELD_GET(origin, 23, 0);
  44.             result |= SVP64_FIELD_GET(origin, 22, 1);
  45.             result |= SVP64_FIELD_GET(origin, 21, 2);
  46.             result |= SVP64_FIELD_GET(origin, 20, 3);
  47.             result |= SVP64_FIELD_GET(origin, 19, 4);
  48.             result |= SVP64_FIELD_GET(origin, 18, 5);
  49.             result |= SVP64_FIELD_GET(origin, 17, 6);
  50.             result |= SVP64_FIELD_GET(origin, 16, 7);
  51.             result |= SVP64_FIELD_GET(origin, 15, 8);
  52.             result |= SVP64_FIELD_GET(origin, 14, 9);
  53.             result |= SVP64_FIELD_GET(origin, 13, 10);
  54.             result |= SVP64_FIELD_GET(origin, 12, 11);
  55.             result |= SVP64_FIELD_GET(origin, 11, 12);
  56.             result |= SVP64_FIELD_GET(origin, 10, 13);
  57.             result |= SVP64_FIELD_GET(origin, 9, 14);
  58.             result |= SVP64_FIELD_GET(origin, 8, 15);
  59.             result |= SVP64_FIELD_GET(origin, 7, 16);
  60.             result |= SVP64_FIELD_GET(origin, 6, 17);
  61.             result |= SVP64_FIELD_GET(origin, 5, 18);
  62.             result |= SVP64_FIELD_GET(origin, 4, 19);
  63.             result |= SVP64_FIELD_GET(origin, 3, 20);
  64.             result |= SVP64_FIELD_GET(origin, 2, 21);
  65.             result |= SVP64_FIELD_GET(origin, 1, 22);
  66.             result |= SVP64_FIELD_GET(origin, 0, 23);
  67.             break;
  68.         case SVP64_RM_MMODE:
  69.             result |= SVP64_FIELD_GET(origin, 0, 0);
  70.             break;
  71.         case SVP64_RM_MASK:
  72.             result |= SVP64_FIELD_GET(origin, 3, 0);
  73.             result |= SVP64_FIELD_GET(origin, 2, 1);
  74.             result |= SVP64_FIELD_GET(origin, 1, 2);
  75.             break;
  76.         case SVP64_RM_ELWIDTH:
  77.             result |= SVP64_FIELD_GET(origin, 5, 0);
  78.             result |= SVP64_FIELD_GET(origin, 4, 1);
  79.             break;
  80.         case SVP64_RM_EWSRC:
  81.             result |= SVP64_FIELD_GET(origin, 7, 0);
  82.             result |= SVP64_FIELD_GET(origin, 6, 1);
  83.             break;
  84.         case SVP64_RM_SUBVL:
  85.             result |= SVP64_FIELD_GET(origin, 9, 0);
  86.             result |= SVP64_FIELD_GET(origin, 8, 1);
  87.             break;
  88.         case SVP64_RM_EXTRA:
  89.             result |= SVP64_FIELD_GET(origin, 18, 0);
  90.             result |= SVP64_FIELD_GET(origin, 17, 1);
  91.             result |= SVP64_FIELD_GET(origin, 16, 2);
  92.             result |= SVP64_FIELD_GET(origin, 15, 3);
  93.             result |= SVP64_FIELD_GET(origin, 14, 4);
  94.             result |= SVP64_FIELD_GET(origin, 13, 5);
  95.             result |= SVP64_FIELD_GET(origin, 12, 6);
  96.             result |= SVP64_FIELD_GET(origin, 11, 7);
  97.             result |= SVP64_FIELD_GET(origin, 10, 8);
  98.             break;
  99.         case SVP64_RM_MODE:
  100.             result |= SVP64_FIELD_GET(origin, 23, 0);
  101.             result |= SVP64_FIELD_GET(origin, 22, 1);
  102.             result |= SVP64_FIELD_GET(origin, 21, 2);
  103.             result |= SVP64_FIELD_GET(origin, 20, 3);
  104.             result |= SVP64_FIELD_GET(origin, 19, 4);
  105.             break;
  106.         case SVP64_RM_EXTRA2_0:
  107.             result |= SVP64_FIELD_GET(origin, 11, 0);
  108.             result |= SVP64_FIELD_GET(origin, 10, 1);
  109.             break;
  110.         case SVP64_RM_EXTRA2_1:
  111.             result |= SVP64_FIELD_GET(origin, 13, 0);
  112.             result |= SVP64_FIELD_GET(origin, 12, 1);
  113.             break;
  114.         case SVP64_RM_EXTRA2_2:
  115.             result |= SVP64_FIELD_GET(origin, 15, 0);
  116.             result |= SVP64_FIELD_GET(origin, 14, 1);
  117.             break;
  118.         case SVP64_RM_EXTRA2_3:
  119.             result |= SVP64_FIELD_GET(origin, 17, 0);
  120.             result |= SVP64_FIELD_GET(origin, 16, 1);
  121.             break;
  122.         case SVP64_RM_SMASK:
  123.             result |= SVP64_FIELD_GET(origin, 18, 0);
  124.             result |= SVP64_FIELD_GET(origin, 17, 1);
  125.             result |= SVP64_FIELD_GET(origin, 16, 2);
  126.             break;
  127.         case SVP64_RM_EXTRA3_0:
  128.             result |= SVP64_FIELD_GET(origin, 12, 0);
  129.             result |= SVP64_FIELD_GET(origin, 11, 1);
  130.             result |= SVP64_FIELD_GET(origin, 10, 2);
  131.             break;
  132.         case SVP64_RM_EXTRA3_1:
  133.             result |= SVP64_FIELD_GET(origin, 15, 0);
  134.             result |= SVP64_FIELD_GET(origin, 14, 1);
  135.             result |= SVP64_FIELD_GET(origin, 13, 2);
  136.             break;
  137.     }
  138.  
  139.     return result;
  140. }
  141.  
  142. void svp64_rm_set(struct svp64_rm *storage, enum svp64_rm_field field, uint32_t value)
  143. {
  144.     uint32_t result = storage->value;
  145.  
  146.     switch (field) {
  147.         case SVP64_RM_SPR:
  148.             SVP64_FIELD_SET(&result, value, 0, 23);
  149.             SVP64_FIELD_SET(&result, value, 1, 22);
  150.             SVP64_FIELD_SET(&result, value, 2, 21);
  151.             SVP64_FIELD_SET(&result, value, 3, 20);
  152.             SVP64_FIELD_SET(&result, value, 4, 19);
  153.             SVP64_FIELD_SET(&result, value, 5, 18);
  154.             SVP64_FIELD_SET(&result, value, 6, 17);
  155.             SVP64_FIELD_SET(&result, value, 7, 16);
  156.             SVP64_FIELD_SET(&result, value, 8, 15);
  157.             SVP64_FIELD_SET(&result, value, 9, 14);
  158.             SVP64_FIELD_SET(&result, value, 10, 13);
  159.             SVP64_FIELD_SET(&result, value, 11, 12);
  160.             SVP64_FIELD_SET(&result, value, 12, 11);
  161.             SVP64_FIELD_SET(&result, value, 13, 10);
  162.             SVP64_FIELD_SET(&result, value, 14, 9);
  163.             SVP64_FIELD_SET(&result, value, 15, 8);
  164.             SVP64_FIELD_SET(&result, value, 16, 7);
  165.             SVP64_FIELD_SET(&result, value, 17, 6);
  166.             SVP64_FIELD_SET(&result, value, 18, 5);
  167.             SVP64_FIELD_SET(&result, value, 19, 4);
  168.             SVP64_FIELD_SET(&result, value, 20, 3);
  169.             SVP64_FIELD_SET(&result, value, 21, 2);
  170.             SVP64_FIELD_SET(&result, value, 22, 1);
  171.             SVP64_FIELD_SET(&result, value, 23, 0);
  172.             break;
  173.         case SVP64_RM_MMODE:
  174.             SVP64_FIELD_SET(&result, value, 0, 0);
  175.             break;
  176.         case SVP64_RM_MASK:
  177.             SVP64_FIELD_SET(&result, value, 0, 3);
  178.             SVP64_FIELD_SET(&result, value, 1, 2);
  179.             SVP64_FIELD_SET(&result, value, 2, 1);
  180.             break;
  181.         case SVP64_RM_ELWIDTH:
  182.             SVP64_FIELD_SET(&result, value, 0, 5);
  183.             SVP64_FIELD_SET(&result, value, 1, 4);
  184.             break;
  185.         case SVP64_RM_EWSRC:
  186.             SVP64_FIELD_SET(&result, value, 0, 7);
  187.             SVP64_FIELD_SET(&result, value, 1, 6);
  188.             break;
  189.         case SVP64_RM_SUBVL:
  190.             SVP64_FIELD_SET(&result, value, 0, 9);
  191.             SVP64_FIELD_SET(&result, value, 1, 8);
  192.             break;
  193.         case SVP64_RM_EXTRA:
  194.             SVP64_FIELD_SET(&result, value, 0, 18);
  195.             SVP64_FIELD_SET(&result, value, 1, 17);
  196.             SVP64_FIELD_SET(&result, value, 2, 16);
  197.             SVP64_FIELD_SET(&result, value, 3, 15);
  198.             SVP64_FIELD_SET(&result, value, 4, 14);
  199.             SVP64_FIELD_SET(&result, value, 5, 13);
  200.             SVP64_FIELD_SET(&result, value, 6, 12);
  201.             SVP64_FIELD_SET(&result, value, 7, 11);
  202.             SVP64_FIELD_SET(&result, value, 8, 10);
  203.             break;
  204.         case SVP64_RM_MODE:
  205.             SVP64_FIELD_SET(&result, value, 0, 23);
  206.             SVP64_FIELD_SET(&result, value, 1, 22);
  207.             SVP64_FIELD_SET(&result, value, 2, 21);
  208.             SVP64_FIELD_SET(&result, value, 3, 20);
  209.             SVP64_FIELD_SET(&result, value, 4, 19);
  210.             break;
  211.         case SVP64_RM_EXTRA2_0:
  212.             SVP64_FIELD_SET(&result, value, 0, 11);
  213.             SVP64_FIELD_SET(&result, value, 1, 10);
  214.             break;
  215.         case SVP64_RM_EXTRA2_1:
  216.             SVP64_FIELD_SET(&result, value, 0, 13);
  217.             SVP64_FIELD_SET(&result, value, 1, 12);
  218.             break;
  219.         case SVP64_RM_EXTRA2_2:
  220.             SVP64_FIELD_SET(&result, value, 0, 15);
  221.             SVP64_FIELD_SET(&result, value, 1, 14);
  222.             break;
  223.         case SVP64_RM_EXTRA2_3:
  224.             SVP64_FIELD_SET(&result, value, 0, 17);
  225.             SVP64_FIELD_SET(&result, value, 1, 16);
  226.             break;
  227.         case SVP64_RM_SMASK:
  228.             SVP64_FIELD_SET(&result, value, 0, 18);
  229.             SVP64_FIELD_SET(&result, value, 1, 17);
  230.             SVP64_FIELD_SET(&result, value, 2, 16);
  231.             break;
  232.         case SVP64_RM_EXTRA3_0:
  233.             SVP64_FIELD_SET(&result, value, 0, 12);
  234.             SVP64_FIELD_SET(&result, value, 1, 11);
  235.             SVP64_FIELD_SET(&result, value, 2, 10);
  236.             break;
  237.         case SVP64_RM_EXTRA3_1:
  238.             SVP64_FIELD_SET(&result, value, 0, 15);
  239.             SVP64_FIELD_SET(&result, value, 1, 14);
  240.             SVP64_FIELD_SET(&result, value, 2, 13);
  241.             break;
  242.     }
  243.  
  244.     storage->value = result;
  245. }
  246.  
  247. #undef SVP64_FIELD_CLEAR
  248. #undef SVP64_FIELD_REMAP
  249. #undef SVP64_FIELD_GET
  250. #undef SVP64_FIELD_SET
Advertisement
Add Comment
Please, Sign In to add comment