1/* { dg-require-effective-target indirect_jumps } */ 2/* { dg-require-effective-target label_values } */ 3 4typedef int c_int; 5union c_insn 6{ 7 void (*op) (); 8 c_int *mem; 9 c_int imm; 10}; 11static union c_insn c_stack[((0x100 + 4) * 4)]; 12static struct c_ident *c_funcs; 13static void (*c_op_bz) (); 14static void c_direct (union c_insn *addr); 15c_compile (int (*ext_getchar) (), void (*ext_rewind) (), 16 struct c_ident *externs) 17{ 18 c_direct (((void *) 0)); 19} 20static void 21c_direct (union c_insn *addr) 22{ 23 union c_insn *pc = addr; 24 union c_insn *sp = c_stack; 25 c_int imm = 0; 26 static void *ops[] = { 27 &&op_index, &&op_assign, &&op_add_a, &&op_sub_a, &&op_mul_a, &&op_div_a, 28 &&op_mod_a, &&op_or_a, &&op_xor_a, &&op_and_a, &&op_shl_a, &&op_shr_a, 29 }; 30 { 31 c_op_bz = &&op_bz; 32 } 33 goto *(pc++)->op; 34op_bz:if (imm) 35 { 36 } 37op_push_imm_imm:(sp - 2)->imm = imm; 38 goto *(pc - 1)->op; 39op_index:imm = *((sp - 3)->mem += imm); 40op_assign:*(sp - 3)->mem = imm; 41op_add_a:imm = *(sp - 3)->mem += imm; 42op_sub_a:imm = *(sp - 3)->mem -= imm; 43op_mul_a:imm = *(sp - 3)->mem *= imm; 44op_div_a:imm = *(sp - 3)->mem /= imm; 45op_mod_a:imm = *(sp - 3)->mem %= imm; 46op_or_a:imm = *(sp - 3)->mem |= imm; 47op_xor_a:imm = *(sp - 3)->mem ^= imm; 48op_and_a:imm = *(sp - 3)->mem &= imm; 49op_shl_a:imm = *(sp - 3)->mem <<= imm; 50op_shr_a:imm = *(sp - 3)->mem >>= imm; 51} 52