-#if 0
-/* Matze: doesn't seem to work this way... */
-UNOP(rol, 0xD3, 0, n_ia32_Rol_val)
-UNOP(ror, 0xD3, 1, n_ia32_Ror_val)
-UNOP(shl, 0xD3, 4, n_ia32_Shl_val)
-UNOP(shr, 0xD3, 5, n_ia32_Shr_val)
-UNOP(sar, 0xD3, 7, n_ia32_Sar_val)
-#endif
+#define SHIFT(op, ext) \
+static void bemit_##op(const ir_node *node) \
+{ \
+ const arch_register_t *reg = get_out_reg(node, 0); \
+ ir_node *count = get_irn_n(node, 1); \
+ if (is_ia32_Immediate(count)) { \
+ int offset = get_ia32_immediate_attr_const(count)->offset; \
+ if (offset == 1) { \
+ bemit8(0xD1); \
+ bemit_modru(reg, ext); \
+ } else { \
+ bemit8(0xC1); \
+ bemit_modru(reg, ext); \
+ bemit8(offset); \
+ } \
+ } else { \
+ bemit8(0xD3); \
+ bemit_modru(reg, ext); \
+ } \
+}
+
+SHIFT(rol, 0)
+SHIFT(ror, 1)
+SHIFT(shl, 4)
+SHIFT(shr, 5)
+SHIFT(sar, 7)