| 52 | } |
| 53 | |
| 54 | DecodeBitMasks_ReturnType DecodeBitMasks( |
| 55 | uint8_t /*bit*/ immN, uint8_t /*bit(6)*/ imms, uint8_t /*bit(6)*/ immr) |
| 56 | { |
| 57 | int ones_nbits = 0; |
| 58 | if (immN == 1) |
| 59 | ones_nbits = 6; |
| 60 | else if ((imms & 0x3E) == 0x3C) |
| 61 | ones_nbits = 1; |
| 62 | else if ((imms & 0x3C) == 0x38) |
| 63 | ones_nbits = 2; |
| 64 | else if ((imms & 0x38) == 0x30) |
| 65 | ones_nbits = 3; |
| 66 | else if ((imms & 0x30) == 0x20) |
| 67 | ones_nbits = 4; |
| 68 | else if ((imms & 0x20) == 0) |
| 69 | ones_nbits = 5; |
| 70 | // TODO else: return undefined |
| 71 | |
| 72 | /* set 1's in element */ |
| 73 | int ones_n = (imms & ((1 << ones_nbits) - 1)) + 1; |
| 74 | uint64_t result = ((uint64_t)1 << ones_n) - 1; |
| 75 | |
| 76 | /* rotate element */ |
| 77 | int elem_width = 1 << ones_nbits; |
| 78 | result = rotate_right(result, elem_width, immr); |
| 79 | |
| 80 | /* replicate element */ |
| 81 | while (elem_width < 64) |
| 82 | { |
| 83 | result = (result << elem_width) | result; |
| 84 | elem_width *= 2; |
| 85 | } |
| 86 | |
| 87 | DecodeBitMasks_ReturnType dbmrt; |
| 88 | // TODO: do this right |
| 89 | dbmrt.wmask = result; |
| 90 | dbmrt.tmask = result; |
| 91 | return dbmrt; |
| 92 | } |
| 93 | |
| 94 | /* idea to abandon pseudocode and compute+compare actual bitmask |
| 95 | is from NetBSD sys/arch/aarch64/aarch64/disasm.c */ |
no test coverage detected