#define MAKE_1OP_8FLAGS_INST(iname) static inline void iname##8(addr_t * dst, addr_t * flags) { \
- uchar_t tmp_dst = *dst; \
- \
/* Some of the flags values are not copied out in a pushf, we save them here */ \
addr_t flags_rsvd = *flags & ~0xfffe7fff; \
\
- asm volatile ( \
+ asm volatile ( \
"pushf; " \
"push %2; " \
"popf; " \
"pushf; " \
"pop %1; " \
"popf; " \
- : "=q"(tmp_dst),"=q"(*flags) \
- : "q"(*flags), "0"(tmp_dst) \
+ : "=q"(*(uint8_t *)dst),"=q"(*flags) \
+ : "q"(*flags), "0"(*(uint8_t *)dst) \
); \
- *dst = tmp_dst; \
*flags |= flags_rsvd; \
\
}
#define MAKE_1OP_16FLAGS_INST(iname) static inline void iname##16(addr_t * dst, addr_t * flags) { \
- ushort_t tmp_dst = *dst; \
- \
/* Some of the flags values are not copied out in a pushf, we save them here */ \
addr_t flags_rsvd = *flags & ~0xfffe7fff; \
\
- asm volatile ( \
+ asm volatile ( \
"pushf; " \
"push %2; " \
"popf; " \
"pushf; " \
"pop %1; " \
"popf; " \
- : "=q"(tmp_dst),"=q"(*flags) \
- : "q"(*flags), "0"(tmp_dst) \
+ : "=q"(*(uint16_t *)dst),"=q"(*flags) \
+ : "q"(*flags), "0"(*(uint16_t *)dst) \
); \
- *dst = tmp_dst; \
*flags |= flags_rsvd; \
\
}
#define MAKE_1OP_32FLAGS_INST(iname) static inline void iname##32(addr_t * dst, addr_t * flags) { \
- uint_t tmp_dst = *dst; \
- \
/* Some of the flags values are not copied out in a pushf, we save them here */ \
addr_t flags_rsvd = *flags & ~0xfffe7fff; \
\
- asm volatile ( \
+ asm volatile ( \
"pushf; " \
"push %2; " \
"popf; " \
"pushf; " \
"pop %1; " \
"popf; " \
- : "=q"(tmp_dst),"=q"(*flags) \
- : "q"(*flags), "0"(tmp_dst) \
+ : "=q"(*(uint32_t *)dst),"=q"(*flags) \
+ : "q"(*flags), "0"(*(uint32_t *)dst) \
); \
- *dst = tmp_dst; \
*flags |= flags_rsvd; \
\
}
#define MAKE_1OP_64FLAGS_INST(iname) static inline void iname##64(addr_t * dst, addr_t * flags) { \
- ullong_t tmp_dst = *dst; \
- \
/* Some of the flags values are not copied out in a pushf, we save them here */ \
addr_t flags_rsvd = *flags & ~0xfffe7fff; \
\
- asm volatile ( \
+ asm volatile ( \
"pushfq; " \
"push %2; " \
"popfq; " \
"pushfq; " \
"pop %1; " \
"popfq; " \
- : "=q"(tmp_dst),"=q"(*flags) \
- : "q"(*flags), "0"(tmp_dst) \
+ : "=q"(*(uint64_t *)dst),"=q"(*flags) \
+ : "q"(*flags), "0"(*(uint64_t *)dst) \
); \
- *dst = tmp_dst; \
*flags |= flags_rsvd; \
\
}
#define MAKE_1OP_8_INST(iname) static inline void iname##8(addr_t * dst) { \
- uchar_t tmp_dst = *dst; \
- \
asm volatile ( \
#iname"b %0; " \
- : "=q"(tmp_dst) \
- : "0"(tmp_dst) \
+ : "=q"(*(uint8_t *)dst) \
+ : "0"(*(uint8_t *)dst) \
); \
- *dst = tmp_dst; \
}
#define MAKE_1OP_16_INST(iname) static inline void iname##16(addr_t * dst) { \
- ushort_t tmp_dst = *dst; \
- \
asm volatile ( \
- #iname"w %0; " \
- : "=q"(tmp_dst) \
- : "0"(tmp_dst) \
- ); \
- *dst = tmp_dst; \
+ #iname"w %0; " \
+ : "=q"(*(uint16_t *)dst) \
+ : "0"(*(uint16_t *)dst) \
+ ); \
}
#define MAKE_1OP_32_INST(iname) static inline void iname##32(addr_t * dst) { \
- uint_t tmp_dst = *dst; \
- \
asm volatile ( \
- #iname"l %0; " \
- : "=q"(tmp_dst) \
- : "0"(tmp_dst) \
- ); \
- *dst = tmp_dst; \
+ #iname"l %0; " \
+ : "=q"(*(uint32_t *)dst) \
+ : "0"(*(uint32_t *)dst) \
+ ); \
}
#define MAKE_1OP_64_INST(iname) static inline void iname##64(addr_t * dst) { \
- ullong_t tmp_dst = *dst; \
- \
asm volatile ( \
#iname"q %0; " \
- : "=q"(tmp_dst) \
- : "0"(tmp_dst) \
+ : "=q"(*(uint64_t *)dst) \
+ : "0"(*(uint64_t *)dst) \
); \
- *dst = tmp_dst; \
}
#define MAKE_2OP_64FLAGS_INST(iname) static inline void iname##64(addr_t * dst, addr_t * src, addr_t * flags) { \
- uint64_t tmp_dst = *dst, tmp_src = *src; \
- addr_t tmp_flags = *flags; \
- \
/* Some of the flags values are not copied out in a pushf, we save them here */ \
addr_t flags_rsvd = *flags & ~0xfffe7fff; \
\
- asm volatile ( \
- "pushfq\r\n" \
- "push %3\r\n" \
- "popfq\r\n" \
- #iname"q %2, %0\r\n" \
- "pushfq\r\n" \
- "pop %1\r\n" \
- "popfq\r\n" \
- : "=q"(tmp_dst),"=q"(tmp_flags) \
- : "q"(tmp_src),"q"(tmp_flags), "0"(tmp_dst) \
- ); \
- \
- *dst = tmp_dst; \
- *flags = tmp_flags; \
+ asm volatile ( \
+ "pushfq\r\n" \
+ "push %3\r\n" \
+ "popfq\r\n" \
+ #iname"q %2, %0\r\n" \
+ "pushfq\r\n" \
+ "pop %1\r\n" \
+ "popfq\r\n" \
+ : "=q"(*(uint64_t *)dst),"=q"(*flags) \
+ : "q"(*(uint64_t *)src),"q"(*flags), "0"(*(uint64_t *)dst) \
+ ); \
*flags |= flags_rsvd; \
\
}
#define MAKE_2OP_32FLAGS_INST(iname) static inline void iname##32(addr_t * dst, addr_t * src, addr_t * flags) { \
- uint32_t tmp_dst = *dst, tmp_src = *src; \
- \
/* Some of the flags values are not copied out in a pushf, we save them here */ \
addr_t flags_rsvd = *flags & ~0xfffe7fff; \
\
"pushf; " \
"pop %1; " \
"popf; " \
- : "=q"(tmp_dst),"=q"(*flags) \
- : "q"(tmp_src),"q"(*flags), "0"(tmp_dst) \
+ : "=q"(*(uint32_t *)dst),"=q"(*flags) \
+ : "q"(*(uint32_t *)src),"q"(*flags), "0"(*(uint32_t *)dst) \
); \
- *dst = tmp_dst; \
*flags |= flags_rsvd; \
- \
}
#define MAKE_2OP_16FLAGS_INST(iname) static inline void iname##16(addr_t * dst, addr_t * src, addr_t * flags) { \
- ushort_t tmp_dst = *dst, tmp_src = *src; \
- \
/* Some of the flags values are not copied out in a pushf, we save them here */ \
addr_t flags_rsvd = *flags & ~0xfffe7fff; \
\
"pushf; " \
"pop %1; " \
"popf; " \
- : "=q"(tmp_dst),"=q"(*flags) \
- : "q"(tmp_src),"q"(*flags), "0"(tmp_dst) \
+ : "=q"(*(uint16_t *)dst),"=q"(*flags) \
+ : "q"(*(uint16_t *)src),"q"(*flags), "0"(*(uint16_t *)dst) \
); \
- *dst = tmp_dst; \
*flags |= flags_rsvd; \
- \
}
#define MAKE_2OP_8FLAGS_INST(iname) static inline void iname##8(addr_t * dst, addr_t * src, addr_t * flags) { \
- uchar_t tmp_dst = *dst, tmp_src = *src; \
- \
/* Some of the flags values are not copied out in a pushf, we save them here */ \
addr_t flags_rsvd = *flags & ~0xfffe7fff; \
\
"pushf; " \
"pop %1; " \
"popf; " \
- : "=q"(tmp_dst),"=q"(*flags) \
- : "q"(tmp_src),"q"(*flags), "0"(tmp_dst) \
+ : "=q"(*(uint8_t *)dst),"=q"(*flags) \
+ : "q"(*(uint8_t *)src),"q"(*flags), "0"(*(uint8_t *)dst) \
); \
- *dst = tmp_dst; \
*flags |= flags_rsvd; \
- \
}
#define MAKE_2OP_64STR_INST(iname) static inline void iname##64(addr_t * dst, \
- addr_t * src, \
- addr_t * ecx, addr_t * flags) { \
+ addr_t * src, \
+ addr_t * ecx, addr_t * flags) { \
/* Some of the flags values are not copied out in a pushf, we save them here */ \
addr_t flags_rsvd = *flags & ~0xfffe7fff; \
\
"popq %0; " \
"popfq; " \
: "=q"(*flags) \
- : "D"(*dst),"S"(*src),"c"(*ecx),"q"(*flags) \
+ : "D"(*dst),"S"(*src),"c"(*ecx),"q"(*flags) \
); \
- \
- /* : "=D"(*dst),"=S"(*src),"=c"(*ecx),"=q"(*flags)*/ \
*flags |= flags_rsvd; \
}
: "=q"(*flags) \
: "D"(*dst),"S"(*src),"c"(*ecx),"q"(*flags) \
); \
- \
- /* : "=D"(*dst),"=S"(*src),"=c"(*ecx),"=q"(*flags)*/ \
*flags |= flags_rsvd; \
}
: "=q"(*flags) \
: "D"(*(uint32_t *)dst),"a"(*(uint32_t *)src),"c"(*(uint32_t *)ecx),"q"(*flags) \
); \
- \
*flags |= flags_rsvd; \
}
#define MAKE_2OP_64_INST(iname) static inline void iname##64(addr_t * dst, addr_t * src) { \
- uint64_t tmp_dst = *dst, tmp_src = *src; \
- \
asm volatile ( \
#iname"q %1, %0; " \
- : "=q"(tmp_dst) \
- : "q"(tmp_src), "0"(tmp_dst) \
+ : "=q"(*(uint64_t *)dst) \
+ : "q"(*(uint64_t *)src), "0"(*(uint64_t *)dst) \
); \
- *dst = tmp_dst; \
}
#define MAKE_2OP_32_INST(iname) static inline void iname##32(addr_t * dst, addr_t * src) { \
- uint32_t tmp_dst = *dst, tmp_src = *src; \
- \
asm volatile ( \
#iname"l %1, %0; " \
- : "=q"(tmp_dst) \
- : "q"(tmp_src), "0"(tmp_dst) \
+ : "=q"(*(uint32_t *)dst) \
+ : "q"(*(uint32_t *)src), "0"(*(uint32_t *)dst) \
); \
- *dst = tmp_dst; \
}
#define MAKE_2OP_16_INST(iname) static inline void iname##16(addr_t * dst, addr_t * src) { \
- ushort_t tmp_dst = *dst, tmp_src = *src; \
- \
asm volatile ( \
#iname"w %1, %0; " \
- : "=q"(tmp_dst) \
- : "q"(tmp_src), "0"(tmp_dst) \
+ : "=q"(*(uint16_t *)dst) \
+ : "q"(*(uint16_t *)src), "0"(*(uint16_t *)dst) \
); \
- *dst = tmp_dst; \
}
#define MAKE_2OP_8_INST(iname) static inline void iname##8(addr_t * dst, addr_t * src) { \
- uchar_t tmp_dst = *dst, tmp_src = *src; \
- \
asm volatile ( \
#iname"b %1, %0; " \
- : "=q"(tmp_dst) \
- : "q"(tmp_src), "0"(tmp_dst) \
+ : "=q"(*(uint8_t *)dst) \
+ : "q"(*(uint8_t *)src), "0"(*(uint8_t *)dst) \
); \
- *dst = tmp_dst; \
}