+static asm_constraint_flags_t ia32_parse_asm_constraint(const void *self, const char **c)
+{
+ (void) self;
+ (void) c;
+
+ /* we already added all our simple flags to the flags modifier list in
+ * init, so this flag we don't know. */
+ return ASM_CONSTRAINT_FLAG_INVALID;
+}
+
+static int ia32_is_valid_clobber(const void *self, const char *clobber)
+{
+ (void) self;
+
+ return ia32_get_clobber_register(clobber) != NULL;
+}
+
+/**
+ * Create the trampoline code.
+ */
+static ir_node *ia32_create_trampoline_fkt(ir_node *block, ir_node *mem, ir_node *trampoline, ir_node *env, ir_node *callee)
+{
+ ir_graph *irg = get_Block_irg(block);
+ ir_node *st, *p = trampoline;
+ ir_mode *mode = get_irn_mode(p);
+
+ /* mov ecx,<env> */
+ st = new_r_Store(irg, block, mem, p, new_Const_long(mode_Bu, 0xb9), 0);
+ mem = new_r_Proj(irg, block, st, mode_M, pn_Store_M);
+ p = new_r_Add(irg, block, p, new_Const_long(mode_Iu, 1), mode);
+ st = new_r_Store(irg, block, mem, p, env, 0);
+ mem = new_r_Proj(irg, block, st, mode_M, pn_Store_M);
+ p = new_r_Add(irg, block, p, new_Const_long(mode_Iu, 4), mode);
+ /* jmp <callee> */
+ st = new_r_Store(irg, block, mem, p, new_Const_long(mode_Bu, 0xe9), 0);
+ mem = new_r_Proj(irg, block, st, mode_M, pn_Store_M);
+ p = new_r_Add(irg, block, p, new_Const_long(mode_Iu, 1), mode);
+ st = new_r_Store(irg, block, mem, p, callee, 0);
+ mem = new_r_Proj(irg, block, st, mode_M, pn_Store_M);
+ p = new_r_Add(irg, block, p, new_Const_long(mode_Iu, 4), mode);
+
+ return mem;
+}
+