+ case ICMD_IXOR: /* ..., val1, val2 ==> ..., val1 | val2 */
+ s1 = emit_load_s1(jd, iptr, REG_ITMP1);
+ s2 = emit_load_s2(jd, iptr, REG_ITMP2);
+ d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
+ M_INTMOVE(s2, REG_ITMP2);
+ M_IXOR(s1, REG_ITMP2);
+ M_INTMOVE(REG_ITMP2, d);
+ emit_store_dst(jd, iptr, d);
+ break;
+
+ case ICMD_IXORCONST: /* ..., value ==> ..., value | constant */
+ /* sx.val.i = constant */
+ s1 = emit_load_s1(jd, iptr, REG_ITMP1);
+ d = codegen_reg_of_dst(jd, iptr, REG_ITMP1);
+ M_INTMOVE(s1, REG_ITMP1);
+ M_IXOR_IMM(iptr->sx.val.i, REG_ITMP1);
+ M_INTMOVE(REG_ITMP1, d);
+ emit_store_dst(jd, iptr, d);
+ break;
+
+ /* floating point operations ******************************************/
+ #if !defined(ENABLE_SOFTFLOAT)
+ case ICMD_FCMPL: /* ..., val1, val2 ==> ..., val1 fcmpl val2 */
+ case ICMD_DCMPL:
+ s1 = emit_load_s1(jd, iptr, REG_FTMP1);
+ s2 = emit_load_s2(jd, iptr, REG_FTMP2);
+ d = codegen_reg_of_dst(jd, iptr, REG_ITMP1);
+ M_IMOV_IMM(-1, d);
+ M_FCMP(s1, s2);
+ M_BFUN(14); /* result is -1, branch to end */
+ M_BFLT(10); /* result is -1, branch to end */
+ M_IMOV_IMM(0, d);
+ M_BFEQ(4) /* result is 0, branch to end */
+ M_IMOV_IMM(1, d);
+ emit_store_dst(jd, iptr, d);
+ break;
+
+ case ICMD_FCMPG: /* ..., val1, val2 ==> ..., val1 fcmpg val2 */
+ case ICMD_DCMPG:
+ s1 = emit_load_s1(jd, iptr, REG_FTMP1);
+ s2 = emit_load_s2(jd, iptr, REG_FTMP2);
+ d = codegen_reg_of_dst(jd, iptr, REG_ITMP1);
+ M_IMOV_IMM(1, d);
+ M_FCMP(s1, s2);
+ M_BFUN(16); /* result is +1, branch to end */
+ M_BFGT(14); /* result is +1, branch to end */
+ M_IMOV_IMM(0, d);
+ M_BFEQ(8) /* result is 0, branch to end */
+ M_IMOV_IMM(-1, d);
+ emit_store_dst(jd, iptr, d);
+ break;
+
+ case ICMD_FMUL: /* ..., val1, val2 ==> ..., val1 * val2 */
+ s1 = emit_load_s1(jd, iptr, REG_FTMP1);
+ s2 = emit_load_s2(jd, iptr, REG_FTMP2);
+ d = codegen_reg_of_dst(jd, iptr, REG_FTMP2);
+ M_FLTMOVE(s2, REG_FTMP2);
+ M_FMUL(s1, REG_FTMP2);
+ M_FLTMOVE(REG_FTMP2, d);
+ emit_store_dst(jd, iptr, d);
+ break;
+
+ case ICMD_DMUL: /* ..., val1, val2 ==> ..., val1 * val2 */
+ s1 = emit_load_s1(jd, iptr, REG_FTMP1);
+ s2 = emit_load_s2(jd, iptr, REG_FTMP2);
+ d = codegen_reg_of_dst(jd, iptr, REG_FTMP2);
+ M_DBLMOVE(s2, REG_FTMP2);
+ M_DMUL(s1, REG_FTMP2);
+ M_DBLMOVE(REG_FTMP2, d);
+ emit_store_dst(jd, iptr, d);
+ break;
+
+ case ICMD_FDIV: /* ..., val1, val2 ==> ..., val1 / val2 */
+ s1 = emit_load_s1(jd, iptr, REG_FTMP1);
+ s2 = emit_load_s2(jd, iptr, REG_FTMP2);
+ d = codegen_reg_of_dst(jd, iptr, REG_FTMP1);
+ M_FLTMOVE(s1, REG_FTMP1);
+ M_FDIV(s2, REG_FTMP1);
+ M_FLTMOVE(REG_FTMP1, d);
+ emit_store_dst(jd, iptr, d);
+ break;
+
+ case ICMD_DDIV: /* ..., val1, val2 ==> ..., val1 / val2 */
+ s1 = emit_load_s1(jd, iptr, REG_FTMP1);
+ s2 = emit_load_s2(jd, iptr, REG_FTMP2);
+ d = codegen_reg_of_dst(jd, iptr, REG_FTMP1);
+ M_DBLMOVE(s1, REG_FTMP1);
+ M_DDIV(s2, REG_FTMP1);
+ M_DBLMOVE(REG_FTMP1, d);
+ emit_store_dst(jd, iptr, d);
+ break;
+
+ case ICMD_FADD: /* ..., val1, val2 ==> ..., val1 + val2 */
+ s1 = emit_load_s1(jd, iptr, REG_FTMP1);
+ s2 = emit_load_s2(jd, iptr, REG_FTMP2);
+ d = codegen_reg_of_dst(jd, iptr, REG_FTMP2);
+ M_FLTMOVE(s2, REG_FTMP2);
+ M_FADD(s1, REG_FTMP2);
+ M_FLTMOVE(REG_FTMP2, d);
+ emit_store_dst(jd, iptr, d);
+ break;
+
+ case ICMD_DADD: /* ..., val1, val2 ==> ..., val1 + val2 */
+ s1 = emit_load_s1(jd, iptr, REG_FTMP1);
+ s2 = emit_load_s2(jd, iptr, REG_FTMP2);
+ d = codegen_reg_of_dst(jd, iptr, REG_FTMP2);
+ M_DBLMOVE(s2, REG_FTMP2);
+ M_DADD(s1, REG_FTMP2);
+ M_DBLMOVE(REG_FTMP2, d);
+ emit_store_dst(jd, iptr, d);
+ break;
+
+ case ICMD_FSUB: /* ..., val1, val2 ==> ..., val1 - val2 */
+ s1 = emit_load_s1(jd, iptr, REG_FTMP1);
+ s2 = emit_load_s2(jd, iptr, REG_FTMP2);
+ d = codegen_reg_of_dst(jd, iptr, REG_FTMP2);
+ M_FLTMOVE(s1, REG_FTMP1);
+ M_FSUB(s2, REG_FTMP1);
+ M_FLTMOVE(REG_FTMP1, d);
+ emit_store_dst(jd, iptr, d);
+ break;
+
+ case ICMD_DSUB: /* ..., val1, val2 ==> ..., val1 - val2 */
+ s1 = emit_load_s1(jd, iptr, REG_FTMP1);
+ s2 = emit_load_s2(jd, iptr, REG_FTMP2);
+ d = codegen_reg_of_dst(jd, iptr, REG_FTMP2);
+ M_DBLMOVE(s1, REG_FTMP1);
+ M_DSUB(s2, REG_FTMP1);
+ M_DBLMOVE(REG_FTMP1, d);
+ emit_store_dst(jd, iptr, d);
+ break;
+
+ case ICMD_F2D: /* ..., value ==> ..., (double) value */
+ s1 = emit_load_s1(jd, iptr, REG_FTMP1);
+ d = codegen_reg_of_dst(jd, iptr, REG_FTMP2);
+ M_F2D(s1, d);
+ emit_store_dst(jd, iptr, d);
+ break;
+
+ case ICMD_D2F: /* ..., value ==> ..., (float) value */
+ s1 = emit_load_s1(jd, iptr, REG_FTMP1);
+ d = codegen_reg_of_dst(jd, iptr, REG_FTMP2);
+ M_D2F(s1, d);
+ emit_store_dst(jd, iptr, d);
+ break;
+
+ case ICMD_FNEG: /* ..., value ==> ..., - value */
+ s1 = emit_load_s1(jd, iptr, REG_FTMP1);
+ d = codegen_reg_of_dst(jd, iptr, REG_FTMP2);
+ M_FNEG(s1, d);
+ emit_store_dst(jd, iptr, d);
+ break;
+
+ case ICMD_DNEG: /* ..., value ==> ..., - value */
+ s1 = emit_load_s1(jd, iptr, REG_FTMP1);
+ d = codegen_reg_of_dst(jd, iptr, REG_FTMP2);
+ M_DNEG(s1, d);
+ emit_store_dst(jd, iptr, d);
+ break;
+
+ #endif