MCPcopy Create free account
hub / github.com/Vector35/binaryninja-api / AdvSIMDExpandImm

Function AdvSIMDExpandImm

arch/arm64/disassembler/pcode.c:575–639  ·  view source on GitHub ↗

Mozilla MPL TODO: evaluate license, possibly rewrite https://github.com/Siguza/iometa/blob/master/src/a64.c */

Source from the content-addressed store, hash-verified

573 TODO: evaluate license, possibly rewrite
574 https://github.com/Siguza/iometa/blob/master/src/a64.c */
575uint64_t AdvSIMDExpandImm(uint8_t op, uint8_t cmode, uint64_t imm8)
576{
577 uint64_t imm64;
578 switch ((cmode >> 1) & 0b111)
579 {
580 case 0b000:
581 imm64 = Replicate(imm8, 2, 32);
582 break;
583 case 0b001:
584 imm64 = Replicate(imm8 << 8, 2, 32);
585 break;
586 case 0b010:
587 imm64 = Replicate(imm8 << 16, 2, 32);
588 break;
589 case 0b011:
590 imm64 = Replicate(imm8 << 24, 2, 32);
591 break;
592 case 0b100:
593 imm64 = Replicate(imm8, 4, 16);
594 break;
595 case 0b101:
596 imm64 = Replicate(imm8 << 8, 4, 16);
597 break;
598 case 0b110:
599 imm64 = Replicate(imm8 << (8 << (cmode & 0b1)), 2, 32);
600 break;
601 case 0b111:
602 switch (((cmode & 0b1) << 1) | op)
603 {
604 case 0b00:
605 imm64 = Replicate(imm8, 8, 8);
606 break;
607 case 0b01:
608#if 0
609 imm8a = Replicate((imm8 >> 7) & 0b1, 8, 1);
610 imm8b = Replicate((imm8 >> 6) & 0b1, 8, 1);
611 imm8c = Replicate((imm8 >> 5) & 0b1, 8, 1);
612 imm8d = Replicate((imm8 >> 4) & 0b1, 8, 1);
613 imm8e = Replicate((imm8 >> 3) & 0b1, 8, 1);
614 imm8f = Replicate((imm8 >> 2) & 0b1, 8, 1);
615 imm8g = Replicate((imm8 >> 1) & 0b1, 8, 1);
616 imm8h = Replicate((imm8 ) & 0b1, 8, 1);
617 imm64 = (imm8a << 0x38) | (imm8b << 0x30) | (imm8c << 0x28) | (imm8d << 0x20) | (imm8e << 0x18) | (imm8f << 0x10) | (imm8g << 0x08) | imm8h;
618#else
619 imm64 = imm8 | (imm8 << (0x08 - 1)) | (imm8 << (0x10 - 2)) | (imm8 << (0x18 - 3)) |
620 (imm8 << (0x20 - 4)) | (imm8 << (0x28 - 5)) | (imm8 << (0x30 - 6)) |
621 (imm8 << (0x38 - 7));
622 imm64 &= 0x0101010101010101;
623 imm64 = Replicate(imm64, 8, 1);
624#endif
625 break;
626 case 0b10:
627 imm64 = Replicate((((imm8 & 0xc0) ^ 0x80) << 24) |
628 (Replicate((imm8 >> 6) & 0b1, 5, 1) << 25) | ((imm8 & 0x3f) << 19),
629 2, 32);
630 break;
631 case 0b11:
632 imm64 = (((imm8 & 0xc0) ^ 0x80) << 56) | (Replicate((imm8 >> 6) & 0b1, 8, 1) << 54) |

Callers 5

BIC_advsimd_immFunction · 0.85
FMOV_advsimdFunction · 0.85
MOVI_advsimdFunction · 0.85
MVNI_advsimdFunction · 0.85
ORR_advsimd_immFunction · 0.85

Calls 1

ReplicateFunction · 0.85

Tested by

no test coverage detected