16cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov%default {"preinstr":"", "instr":"", "wide":"0"}
26cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov/*
36cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov * Generic 32/64-bit unary operation.  Provide an "instr" line that
46cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov * specifies an instruction that performs "result = op eax".
56cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov */
66cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov    /* unop vA, vB */
76cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov    movl    rINST, %ecx                     # rcx <- A+
86cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov    sarl    $$4,rINST                       # rINST <- B
96cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov    .if ${wide}
106cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov    GET_WIDE_VREG %rax, rINSTq              # rax <- vB
116cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov    .else
126cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov    GET_VREG %eax, rINSTq                   # eax <- vB
136cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov    .endif
146cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov    andb    $$0xf,%cl                       # ecx <- A
156cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov$preinstr
166cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov$instr
176cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov    .if ${wide}
186cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov    SET_WIDE_VREG %rax, %rcx
196cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov    .else
206cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov    SET_VREG %eax, %rcx
216cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov    .endif
226cbe0814952bd3bbb329c4ca4dc683ac87c2c2deSerguei Katkov    ADVANCE_PC_FETCH_AND_GOTO_NEXT 1
23