@@ -123,6 +123,15 @@ typedef enum {
123123 ARMSIZE_X = 0x3
124124} ARMSize ;
125125
126+ typedef enum {
127+ ARMHINT_NOP = 0x0 ,
128+ ARMHINT_YIELD = 0x1 ,
129+ ARMHINT_WFE = 0x2 ,
130+ ARMHINT_WFI = 0x3 ,
131+ ARMHINT_SEV = 0x4 ,
132+ ARMHINT_SEVL = 0x5
133+ } ARMHint ;
134+
126135#define arm_emit (p , ins ) do { *(guint32*)(p) = (ins); (p) += 4; } while (0)
127136
128137/* Overwrite bits [offset,offset+nbits] with value */
@@ -703,6 +712,19 @@ arm_encode_arith_imm (int imm, guint32 *shift)
703712#define arm_mulw (p , rd , rn , rm ) arm_maddw ((p), (rd), (rn), (rm), ARMREG_RZR)
704713
705714/* FIXME: Missing multiple opcodes */
715+ #define arm_format_clx (p , sf , op , rd , rn ) arm_emit ((p), 0b01011010110000000001000000000000 | (sf) << 31 | (op) << 10 | (rn) << 5 | (rd))
716+ #define arm_clsw (p , rd , rn ) arm_format_clx ((p), 0, 1, (rd), (rn))
717+ #define arm_clsx (p , rd , rn ) arm_format_clx ((p), 1, 1, (rd), (rn))
718+ #define arm_clzw (p , rd , rn ) arm_format_clx ((p), 0, 0, (rd), (rn))
719+ #define arm_clzx (p , rd , rn ) arm_format_clx ((p), 1, 0, (rd), (rn))
720+
721+ #define arm_format_mulh (p , u , rd , rn , rm ) arm_emit ((p), 0b10011011010000000111110000000000 | (u) << 23 | (rm) << 16 | (rn) << 5 | (rd))
722+ #define arm_smulh (p , rd , rn , rm ) arm_format_mulh ((p), 0, (rd), (rn), (rm))
723+ #define arm_umulh (p , rd , rn , rm ) arm_format_mulh ((p), 1, (rd), (rn), (rm))
724+
725+ #define arm_format_rbit (p , sf , rd , rn ) arm_emit ((p), 0b01011010110000000000000000000000 | (sf) << 31 | (rn) << 5 | (rd))
726+ #define arm_rbitw (p , rd , rn ) arm_format_rbit ((p), 0, (rd), (rn))
727+ #define arm_rbitx (p , rd , rn ) arm_format_rbit ((p), 1, (rd), (rn))
706728
707729/* Division */
708730#define arm_format_div (p , sf , o1 , rd , rn , rm ) arm_emit ((p), ((sf) << 31) | (0xd6 << 21) | ((rm) << 16) | (0x1 << 11) | ((o1) << 10) | ((rn) << 5) | ((rd) << 0))
0 commit comments