jit_emit_exception.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. /*
  2. * Copyright (C) 2019 Intel Corporation. All rights reserved.
  3. * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. */
  5. #include "jit_emit_exception.h"
  6. #include "../jit_frontend.h"
  7. bool
  8. jit_emit_exception(JitCompContext *cc, int32 exception_id, uint8 jit_opcode,
  9. JitReg cond_br_if, JitBasicBlock *cond_br_else_block)
  10. {
  11. JitInsn *insn = NULL;
  12. JitIncomingInsn *incoming_insn;
  13. JitReg else_label;
  14. bh_assert(exception_id < EXCE_NUM);
  15. if (jit_opcode >= JIT_OP_BEQ && jit_opcode <= JIT_OP_BLEU) {
  16. bh_assert(cond_br_if == cc->cmp_reg);
  17. else_label =
  18. cond_br_else_block ? jit_basic_block_label(cond_br_else_block) : 0;
  19. switch (jit_opcode) {
  20. case JIT_OP_BEQ:
  21. insn = GEN_INSN(BEQ, cond_br_if, 0, else_label);
  22. break;
  23. case JIT_OP_BNE:
  24. insn = GEN_INSN(BNE, cond_br_if, 0, else_label);
  25. break;
  26. case JIT_OP_BGTS:
  27. insn = GEN_INSN(BGTS, cond_br_if, 0, else_label);
  28. break;
  29. case JIT_OP_BGES:
  30. insn = GEN_INSN(BGES, cond_br_if, 0, else_label);
  31. break;
  32. case JIT_OP_BLTS:
  33. insn = GEN_INSN(BLTS, cond_br_if, 0, else_label);
  34. break;
  35. case JIT_OP_BLES:
  36. insn = GEN_INSN(BLES, cond_br_if, 0, else_label);
  37. break;
  38. case JIT_OP_BGTU:
  39. insn = GEN_INSN(BGTU, cond_br_if, 0, else_label);
  40. break;
  41. case JIT_OP_BGEU:
  42. insn = GEN_INSN(BGEU, cond_br_if, 0, else_label);
  43. break;
  44. case JIT_OP_BLTU:
  45. insn = GEN_INSN(BLTU, cond_br_if, 0, else_label);
  46. break;
  47. case JIT_OP_BLEU:
  48. insn = GEN_INSN(BLEU, cond_br_if, 0, else_label);
  49. break;
  50. }
  51. if (!insn) {
  52. jit_set_last_error(cc, "generate cond br insn failed");
  53. return false;
  54. }
  55. }
  56. else if (jit_opcode == JIT_OP_JMP) {
  57. insn = GEN_INSN(JMP, 0);
  58. if (!insn) {
  59. jit_set_last_error(cc, "generate jmp insn failed");
  60. return false;
  61. }
  62. }
  63. incoming_insn = jit_calloc(sizeof(JitIncomingInsn));
  64. if (!incoming_insn) {
  65. jit_set_last_error(cc, "allocate memory failed");
  66. return false;
  67. }
  68. incoming_insn->insn = insn;
  69. incoming_insn->next = cc->incoming_insns_for_exec_bbs[exception_id];
  70. cc->incoming_insns_for_exec_bbs[exception_id] = incoming_insn;
  71. return true;
  72. }