Add more arithmetic instructions to macro_assembler-inl.h

One-operand ones and three-operand Imul.

Test: berberis_all

Change-Id: I0b08e719c908f9b26e053a3711f64d812fc5426f
diff --git a/intrinsics/common_to_x86/include/berberis/intrinsics/macro_assembler-inl.h b/intrinsics/common_to_x86/include/berberis/intrinsics/macro_assembler-inl.h
index b2512f7..e7cafae 100644
--- a/intrinsics/common_to_x86/include/berberis/intrinsics/macro_assembler-inl.h
+++ b/intrinsics/common_to_x86/include/berberis/intrinsics/macro_assembler-inl.h
@@ -138,36 +138,78 @@
 DEFINE_EXPAND_INSTRUCTION(Register dest, Register src)
 #undef DEFINE_EXPAND_INSTRUCTION
 
-#define DEFINE_INT_INSTRUCTION(insn_name, insn_siffix, parameters, arguments) \
-  template <typename format>                                                  \
-  std::enable_if_t<kIntType<format>> insn_name##insn_siffix parameters {      \
-    if constexpr (kFormatIs<format, int8_t, uint8_t>) {                       \
-      Assembler::insn_name##b##insn_siffix arguments;                         \
-    } else if constexpr (kFormatIs<format, int16_t, uint16_t>) {              \
-      Assembler::insn_name##w##insn_siffix arguments;                         \
-    } else if constexpr (kFormatIs<format, int32_t, uint32_t>) {              \
-      Assembler::insn_name##l##insn_siffix arguments;                         \
-    } else {                                                                  \
-      Assembler::insn_name##q##insn_siffix arguments;                         \
-    }                                                                         \
+#define DEFINE_INT_INSTRUCTION(                                            \
+    insn_name, asm_name, insn_siffix, type_check, parameters, arguments)   \
+  template <typename format>                                               \
+  std::enable_if_t<type_check<format>> insn_name##insn_siffix parameters { \
+    if constexpr (kFormatIs<format, int8_t, uint8_t>) {                    \
+      Assembler::asm_name##b##insn_siffix arguments;                       \
+    } else if constexpr (kFormatIs<format, int16_t, uint16_t>) {           \
+      Assembler::asm_name##w##insn_siffix arguments;                       \
+    } else if constexpr (kFormatIs<format, int32_t, uint32_t>) {           \
+      Assembler::asm_name##l##insn_siffix arguments;                       \
+    } else {                                                               \
+      Assembler::asm_name##q##insn_siffix arguments;                       \
+    }                                                                      \
   }
-DEFINE_INT_INSTRUCTION(CmpXchg, , (Operand dest, Register src), (dest, src))
-DEFINE_INT_INSTRUCTION(CmpXchg, , (Register dest, Register src), (dest, src))
-DEFINE_INT_INSTRUCTION(LockCmpXchg, , (Operand dest, Register src), (dest, src))
-DEFINE_INT_INSTRUCTION(Mov, , (Operand dest, ImmFormat<format> imm), (dest, imm))
-DEFINE_INT_INSTRUCTION(Mov, , (Operand dest, Register src), (dest, src))
-DEFINE_INT_INSTRUCTION(Mov, , (Register dest, std::make_signed_t<format> imm), (dest, imm))
-DEFINE_INT_INSTRUCTION(Mov, , (Register dest, Operand src), (dest, src))
-DEFINE_INT_INSTRUCTION(Test, , (Operand dest, ImmFormat<format> imm), (dest, imm))
-DEFINE_INT_INSTRUCTION(Test, , (Operand dest, Register src), (dest, src))
-DEFINE_INT_INSTRUCTION(Test, , (Register dest, ImmFormat<format> imm), (dest, imm))
-DEFINE_INT_INSTRUCTION(Test, , (Register dest, Register src), (dest, src))
-#define DEFINE_ARITH_INSTRUCTION(insn_name)                                                \
-  DEFINE_INT_INSTRUCTION(insn_name, , (Operand dest, ImmFormat<format> imm), (dest, imm))  \
-  DEFINE_INT_INSTRUCTION(insn_name, , (Operand dest, Register src), (dest, src))           \
-  DEFINE_INT_INSTRUCTION(insn_name, , (Register dest, ImmFormat<format> imm), (dest, imm)) \
-  DEFINE_INT_INSTRUCTION(insn_name, , (Register dest, Operand src), (dest, src))           \
-  DEFINE_INT_INSTRUCTION(insn_name, , (Register dest, Register src), (dest, src))
+DEFINE_INT_INSTRUCTION(CmpXchg, CmpXchg, , kIntType, (Operand dest, Register src), (dest, src))
+DEFINE_INT_INSTRUCTION(CmpXchg, CmpXchg, , kIntType, (Register dest, Register src), (dest, src))
+DEFINE_INT_INSTRUCTION(LockCmpXchg,
+                       LockCmpXchg,
+                       ,
+                       kIntType,
+                       (Operand dest, Register src),
+                       (dest, src))
+DEFINE_INT_INSTRUCTION(Mov, Mov, , kIntType, (Operand dest, ImmFormat<format> imm), (dest, imm))
+DEFINE_INT_INSTRUCTION(Mov, Mov, , kIntType, (Operand dest, Register src), (dest, src))
+DEFINE_INT_INSTRUCTION(Mov,
+                       Mov,
+                       ,
+                       kIntType,
+                       (Register dest, std::make_signed_t<format> imm),
+                       (dest, imm))
+DEFINE_INT_INSTRUCTION(Mov, Mov, , kIntType, (Register dest, Operand src), (dest, src))
+DEFINE_INT_INSTRUCTION(Mul, Imul, , kIntTypeWLQ, (Operand dest, Register src), (dest, src))
+DEFINE_INT_INSTRUCTION(Mul, Imul, , kIntTypeWLQ, (Operand dest, Operand src), (dest, src))
+DEFINE_INT_INSTRUCTION(Mul,
+                       Imul,
+                       ,
+                       kIntTypeWLQ,
+                       (Operand dest, Register src, ImmFormat<format> imm),
+                       (dest, src, imm))
+DEFINE_INT_INSTRUCTION(Mul,
+                       Imul,
+                       ,
+                       kIntTypeWLQ,
+                       (Operand dest, Operand src, ImmFormat<format> imm),
+                       (dest, src, imm))
+DEFINE_INT_INSTRUCTION(Test, Test, , kIntType, (Operand dest, ImmFormat<format> imm), (dest, imm))
+DEFINE_INT_INSTRUCTION(Test, Test, , kIntType, (Operand dest, Register src), (dest, src))
+DEFINE_INT_INSTRUCTION(Test, Test, , kIntType, (Register dest, ImmFormat<format> imm), (dest, imm))
+DEFINE_INT_INSTRUCTION(Test, Test, , kIntType, (Register dest, Register src), (dest, src))
+#define DEFINE_ARITH_INSTRUCTION(insn_name, asm_name, type_check)                 \
+  DEFINE_INT_INSTRUCTION(insn_name, asm_name, , type_check, (Operand arg), (arg)) \
+  DEFINE_INT_INSTRUCTION(insn_name, asm_name, , type_check, (Register arg), (arg))
+DEFINE_ARITH_INSTRUCTION(Dec, Dec, kIntType)
+DEFINE_ARITH_INSTRUCTION(Div, Div, kUnsignedIntType)
+DEFINE_ARITH_INSTRUCTION(Div, Idiv, kSignedIntType)
+DEFINE_ARITH_INSTRUCTION(Inc, Inc, kIntType)
+DEFINE_ARITH_INSTRUCTION(Mul, Imul, kSignedIntType)
+DEFINE_ARITH_INSTRUCTION(Mul, Mul, kUnsignedIntType)
+DEFINE_ARITH_INSTRUCTION(Neg, Neg, kIntType)
+DEFINE_ARITH_INSTRUCTION(Not, Not, kIntType)
+#undef DEFINE_ARITH_INSTRUCTION
+#define DEFINE_ARITH_INSTRUCTION(insn_name)                                                  \
+  DEFINE_INT_INSTRUCTION(                                                                    \
+      insn_name, insn_name, , kIntType, (Operand dest, ImmFormat<format> imm), (dest, imm))  \
+  DEFINE_INT_INSTRUCTION(                                                                    \
+      insn_name, insn_name, , kIntType, (Operand dest, Register src), (dest, src))           \
+  DEFINE_INT_INSTRUCTION(                                                                    \
+      insn_name, insn_name, , kIntType, (Register dest, ImmFormat<format> imm), (dest, imm)) \
+  DEFINE_INT_INSTRUCTION(                                                                    \
+      insn_name, insn_name, , kIntType, (Register dest, Operand src), (dest, src))           \
+  DEFINE_INT_INSTRUCTION(                                                                    \
+      insn_name, insn_name, , kIntType, (Register dest, Register src), (dest, src))
 DEFINE_ARITH_INSTRUCTION(Adc)
 DEFINE_ARITH_INSTRUCTION(Add)
 DEFINE_ARITH_INSTRUCTION(And)
@@ -176,11 +218,14 @@
 DEFINE_ARITH_INSTRUCTION(Sbb)
 DEFINE_ARITH_INSTRUCTION(Sub)
 DEFINE_ARITH_INSTRUCTION(Xor)
-#define DEFINE_SHIFT_INSTRUCTION(insn_name)                                     \
-  DEFINE_INT_INSTRUCTION(insn_name, , (Operand dest, int8_t imm), (dest, imm))  \
-  DEFINE_INT_INSTRUCTION(insn_name, ByCl, (Operand dest), (dest))               \
-  DEFINE_INT_INSTRUCTION(insn_name, , (Register dest, int8_t imm), (dest, imm)) \
-  DEFINE_INT_INSTRUCTION(insn_name, ByCl, (Register dest), (dest))
+#undef DEFINE_ARITH_INSTRUCTION
+#define DEFINE_SHIFT_INSTRUCTION(insn_name)                                            \
+  DEFINE_INT_INSTRUCTION(                                                              \
+      insn_name, insn_name, , kIntType, (Operand dest, int8_t imm), (dest, imm))       \
+  DEFINE_INT_INSTRUCTION(insn_name, insn_name, ByCl, kIntType, (Operand dest), (dest)) \
+  DEFINE_INT_INSTRUCTION(                                                              \
+      insn_name, insn_name, , kIntType, (Register dest, int8_t imm), (dest, imm))      \
+  DEFINE_INT_INSTRUCTION(insn_name, insn_name, ByCl, kIntType, (Register dest), (dest))
 DEFINE_SHIFT_INSTRUCTION(Rcl)
 DEFINE_SHIFT_INSTRUCTION(Rcr)
 DEFINE_SHIFT_INSTRUCTION(Rol)