- M_BEQZ(REG_ITMP1, 0);
- codegen_addreference(cd, (basicblock *) iptr->target, mcodeptr);
- break;
-
- /* (value xx 0) ? IFxx_ICONST : ELSE_ICONST */
-
- case ICMD_ELSE_ICONST: /* handled by IFxx_ICONST */
- break;
-
- case ICMD_IFEQ_ICONST: /* ..., value ==> ..., constant */
- /* val.i = constant */
-
- var_to_reg_int(s1, src, REG_ITMP1);
- d = reg_of_var(rd, iptr->dst, REG_ITMP2);
- s3 = iptr->val.i;
- if (iptr[1].opc == ICMD_ELSE_ICONST) {
- if ((s3 == 1) && (iptr[1].val.i == 0)) {
- M_CMPEQ(s1, REG_ZERO, d);
- store_reg_to_var_int(iptr->dst, d);
- break;
- }
- if ((s3 == 0) && (iptr[1].val.i == 1)) {
- M_CMPEQ(s1, REG_ZERO, d);
- M_XOR_IMM(d, 1, d);
- store_reg_to_var_int(iptr->dst, d);
- break;
- }
- if (s1 == d) {
- M_MOV(s1, REG_ITMP1);
- s1 = REG_ITMP1;
- }
- ICONST(d, iptr[1].val.i);
- }
- if ((s3 >= 0) && (s3 <= 255)) {
- M_CMOVEQ_IMM(s1, s3, d);
- } else {
- ICONST(REG_ITMP3, s3);
- M_CMOVEQ(s1, REG_ITMP3, d);
- }
- store_reg_to_var_int(iptr->dst, d);
- break;
-
- case ICMD_IFNE_ICONST: /* ..., value ==> ..., constant */
- /* val.i = constant */
-
- var_to_reg_int(s1, src, REG_ITMP1);
- d = reg_of_var(rd, iptr->dst, REG_ITMP2);
- s3 = iptr->val.i;
- if (iptr[1].opc == ICMD_ELSE_ICONST) {
- if ((s3 == 0) && (iptr[1].val.i == 1)) {
- M_CMPEQ(s1, REG_ZERO, d);
- store_reg_to_var_int(iptr->dst, d);
- break;
- }
- if ((s3 == 1) && (iptr[1].val.i == 0)) {
- M_CMPEQ(s1, REG_ZERO, d);
- M_XOR_IMM(d, 1, d);
- store_reg_to_var_int(iptr->dst, d);
- break;
- }
- if (s1 == d) {
- M_MOV(s1, REG_ITMP1);
- s1 = REG_ITMP1;
- }
- ICONST(d, iptr[1].val.i);
- }
- if ((s3 >= 0) && (s3 <= 255)) {
- M_CMOVNE_IMM(s1, s3, d);
- } else {
- ICONST(REG_ITMP3, s3);
- M_CMOVNE(s1, REG_ITMP3, d);
- }
- store_reg_to_var_int(iptr->dst, d);
- break;
-
- case ICMD_IFLT_ICONST: /* ..., value ==> ..., constant */
- /* val.i = constant */
-
- var_to_reg_int(s1, src, REG_ITMP1);
- d = reg_of_var(rd, iptr->dst, REG_ITMP2);
- s3 = iptr->val.i;
- if ((iptr[1].opc == ICMD_ELSE_ICONST)) {
- if ((s3 == 1) && (iptr[1].val.i == 0)) {
- M_CMPLT(s1, REG_ZERO, d);
- store_reg_to_var_int(iptr->dst, d);
- break;
- }
- if ((s3 == 0) && (iptr[1].val.i == 1)) {
- M_CMPLE(REG_ZERO, s1, d);
- store_reg_to_var_int(iptr->dst, d);
- break;
- }
- if (s1 == d) {
- M_MOV(s1, REG_ITMP1);
- s1 = REG_ITMP1;
- }
- ICONST(d, iptr[1].val.i);
- }
- if ((s3 >= 0) && (s3 <= 255)) {
- M_CMOVLT_IMM(s1, s3, d);
- } else {
- ICONST(REG_ITMP3, s3);
- M_CMOVLT(s1, REG_ITMP3, d);
- }
- store_reg_to_var_int(iptr->dst, d);
- break;
-
- case ICMD_IFGE_ICONST: /* ..., value ==> ..., constant */
- /* val.i = constant */
-
- var_to_reg_int(s1, src, REG_ITMP1);
- d = reg_of_var(rd, iptr->dst, REG_ITMP2);
- s3 = iptr->val.i;
- if ((iptr[1].opc == ICMD_ELSE_ICONST)) {
- if ((s3 == 1) && (iptr[1].val.i == 0)) {
- M_CMPLE(REG_ZERO, s1, d);
- store_reg_to_var_int(iptr->dst, d);
- break;
- }
- if ((s3 == 0) && (iptr[1].val.i == 1)) {
- M_CMPLT(s1, REG_ZERO, d);
- store_reg_to_var_int(iptr->dst, d);
- break;
- }
- if (s1 == d) {
- M_MOV(s1, REG_ITMP1);
- s1 = REG_ITMP1;
- }
- ICONST(d, iptr[1].val.i);
- }
- if ((s3 >= 0) && (s3 <= 255)) {
- M_CMOVGE_IMM(s1, s3, d);
- } else {
- ICONST(REG_ITMP3, s3);
- M_CMOVGE(s1, REG_ITMP3, d);
- }
- store_reg_to_var_int(iptr->dst, d);
- break;
-
- case ICMD_IFGT_ICONST: /* ..., value ==> ..., constant */
- /* val.i = constant */
-
- var_to_reg_int(s1, src, REG_ITMP1);
- d = reg_of_var(rd, iptr->dst, REG_ITMP2);
- s3 = iptr->val.i;
- if ((iptr[1].opc == ICMD_ELSE_ICONST)) {
- if ((s3 == 1) && (iptr[1].val.i == 0)) {
- M_CMPLT(REG_ZERO, s1, d);
- store_reg_to_var_int(iptr->dst, d);
- break;
- }
- if ((s3 == 0) && (iptr[1].val.i == 1)) {
- M_CMPLE(s1, REG_ZERO, d);
- store_reg_to_var_int(iptr->dst, d);
- break;
- }
- if (s1 == d) {
- M_MOV(s1, REG_ITMP1);
- s1 = REG_ITMP1;
- }
- ICONST(d, iptr[1].val.i);
- }
- if ((s3 >= 0) && (s3 <= 255)) {
- M_CMOVGT_IMM(s1, s3, d);
- } else {
- ICONST(REG_ITMP3, s3);
- M_CMOVGT(s1, REG_ITMP3, d);
- }
- store_reg_to_var_int(iptr->dst, d);
- break;
-
- case ICMD_IFLE_ICONST: /* ..., value ==> ..., constant */
- /* val.i = constant */
-
- var_to_reg_int(s1, src, REG_ITMP1);
- d = reg_of_var(rd, iptr->dst, REG_ITMP2);
- s3 = iptr->val.i;
- if ((iptr[1].opc == ICMD_ELSE_ICONST)) {
- if ((s3 == 1) && (iptr[1].val.i == 0)) {
- M_CMPLE(s1, REG_ZERO, d);
- store_reg_to_var_int(iptr->dst, d);
- break;
- }
- if ((s3 == 0) && (iptr[1].val.i == 1)) {
- M_CMPLT(REG_ZERO, s1, d);
- store_reg_to_var_int(iptr->dst, d);
- break;
- }
- if (s1 == d) {
- M_MOV(s1, REG_ITMP1);
- s1 = REG_ITMP1;
- }
- ICONST(d, iptr[1].val.i);
- }
- if ((s3 >= 0) && (s3 <= 255)) {
- M_CMOVLE_IMM(s1, s3, d);
- } else {
- ICONST(REG_ITMP3, s3);
- M_CMOVLE(s1, REG_ITMP3, d);
- }
- store_reg_to_var_int(iptr->dst, d);