Christian Ullrich
Edwin Steiner
- $Id: codegen.c 7534 2007-03-16 23:00:18Z pm $
+ $Id: codegen.c 7581 2007-03-26 07:23:16Z pm $
*/
break;
case ICMD_IAND: /* ..., val1, val2 ==> ..., val1 & val2 */
- OOPS();
-#if 0
+
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_IAND(s2, d);
}
emit_store_dst(jd, iptr, d);
-#endif
+
break;
+ case ICMD_IOR: /* ..., 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);
+ if (s2 == d)
+ M_IOR(s1, d);
+ else {
+ M_INTMOVE(s1, d);
+ M_IOR(s2, d);
+ }
+ emit_store_dst(jd, iptr, d);
+
+ break;
+
+ 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);
+ if (s2 == d)
+ M_IXOR(s1, d);
+ else {
+ M_INTMOVE(s1, d);
+ M_IXOR(s2, d);
+ }
+ emit_store_dst(jd, iptr, d);
+
+ break;
+
+
+
case ICMD_IANDCONST: /* ..., value ==> ..., value & constant */
/* sx.val.i = constant */
OOPS();
case ICMD_LANDCONST: /* ..., value ==> ..., value & constant */
/* sx.val.l = constant */
+
+ s3 = iptr->sx.val.l & 0xffffffff;
+ s1 = emit_load_s1_low(jd, iptr, REG_ITMP1);
+ d = codegen_reg_of_dst(jd, iptr, REG_ITMP12_PACKED);
+ if ((s3 >= 0) && (s3 <= 65535))
+ M_AND_IMM(s1, s3, GET_LOW_REG(d));
+ else {
+ ICONST(REG_ITMP3, s3);
+ M_AND(s1, REG_ITMP3, GET_LOW_REG(d));
+ }
+ s1 = emit_load_s1_high(jd, iptr, REG_ITMP1);
+ s3 = iptr->sx.val.l >> 32;
+ if ((s3 >= 0) && (s3 <= 65535))
+ M_AND_IMM(s1, s3, GET_HIGH_REG(d));
+ else {
+ ICONST(REG_ITMP3, s3); /* don't use REG_ITMP2 */
+ M_AND(s1, REG_ITMP3, GET_HIGH_REG(d));
+ }
+ emit_store_dst(jd, iptr, d);
+
OOPS();
#if 0
s1 = emit_load_s1(jd, iptr, REG_ITMP1);
#endif
break;
- case ICMD_IOR: /* ..., val1, val2 ==> ..., val1 | val2 */
- OOPS();
-#if 0
- 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);
- if (s2 == d)
- M_IOR(s1, d);
- else {
- M_INTMOVE(s1, d);
- M_IOR(s2, d);
- }
- emit_store_dst(jd, iptr, d);
-#endif
- break;
-
case ICMD_IORCONST: /* ..., value ==> ..., value | constant */
/* sx.val.i = constant */
OOPS();
#endif
break;
- case ICMD_IXOR: /* ..., val1, val2 ==> ..., val1 ^ val2 */
- OOPS();
-#if 0
- 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);
- if (s2 == d)
- M_IXOR(s1, d);
- else {
- M_INTMOVE(s1, d);
- M_IXOR(s2, d);
- }
- emit_store_dst(jd, iptr, d);
-#endif
- break;
-
case ICMD_IXORCONST: /* ..., value ==> ..., value ^ constant */
/* sx.val.i = constant */
OOPS();
break;
case ICMD_FADD: /* ..., val1, val2 ==> ..., val1 + val2 */
- OOPS();
-#if 0
s1 = emit_load_s1(jd, iptr, REG_FTMP1);
s2 = emit_load_s2(jd, iptr, REG_FTMP2);
- d = codegen_reg_of_dst(jd, iptr, REG_FTMP3);
+ d = codegen_reg_of_dst(jd, iptr, REG_FTMP1);
if (s2 == d)
M_FADD(s1, d);
else {
M_FADD(s2, d);
}
emit_store_dst(jd, iptr, d);
-#endif
break;
case ICMD_DADD: /* ..., val1, val2 ==> ..., val1 + val2 */
- OOPS();
-#if 0
s1 = emit_load_s1(jd, iptr, REG_FTMP1);
s2 = emit_load_s2(jd, iptr, REG_FTMP2);
- d = codegen_reg_of_dst(jd, iptr, REG_FTMP3);
+ d = codegen_reg_of_dst(jd, iptr, REG_FTMP1);
if (s2 == d)
M_DADD(s1, d);
else {
M_DADD(s2, d);
}
emit_store_dst(jd, iptr, d);
-#endif
break;
case ICMD_FSUB: /* ..., val1, val2 ==> ..., val1 - val2 */
- OOPS();
-#if 0
s1 = emit_load_s1(jd, iptr, REG_FTMP1);
- s2 = emit_load_s2(jd, iptr, REG_FTMP2);
- d = codegen_reg_of_dst(jd, iptr, REG_FTMP3);
- if (s2 == d) {
- M_FLTMOVE(s2, REG_FTMP2);
- s2 = REG_FTMP2;
- }
+ d = codegen_reg_of_dst(jd, iptr, REG_FTMP1);
+ s2 = emit_load_s2_but(jd, iptr, REG_FTMP2, d);
+
M_FLTMOVE(s1, d);
M_FSUB(s2, d);
emit_store_dst(jd, iptr, d);
-#endif
break;
case ICMD_DSUB: /* ..., val1, val2 ==> ..., val1 - val2 */
- OOPS();
-#if 0
s1 = emit_load_s1(jd, iptr, REG_FTMP1);
- s2 = emit_load_s2(jd, iptr, REG_FTMP2);
- d = codegen_reg_of_dst(jd, iptr, REG_FTMP3);
- if (s2 == d) {
- M_FLTMOVE(s2, REG_FTMP2);
- s2 = REG_FTMP2;
- }
+ d = codegen_reg_of_dst(jd, iptr, REG_FTMP1);
+ s2 = emit_load_s2_but(jd, iptr, REG_FTMP2, d);
+
M_FLTMOVE(s1, d);
M_DSUB(s2, d);
emit_store_dst(jd, iptr, d);
-#endif
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_FTMP3);
+ d = codegen_reg_of_dst(jd, iptr, REG_FTMP2);
if (s2 == d)
M_FMUL(s1, d);
else {
M_FMUL(s2, d);
}
emit_store_dst(jd, iptr, d);
-
break;
case ICMD_DMUL: /* ..., val1, val2 ==> ..., val1 * val2 */
- OOPS();
-#if 0
s1 = emit_load_s1(jd, iptr, REG_FTMP1);
s2 = emit_load_s2(jd, iptr, REG_FTMP2);
- d = codegen_reg_of_dst(jd, iptr, REG_FTMP3);
+ d = codegen_reg_of_dst(jd, iptr, REG_FTMP2);
if (s2 == d)
M_DMUL(s1, d);
else {
M_DMUL(s2, d);
}
emit_store_dst(jd, iptr, d);
-#endif
break;
case ICMD_FDIV: /* ..., val1, val2 ==> ..., val1 / val2 */
- OOPS();
-#if 0
s1 = emit_load_s1(jd, iptr, REG_FTMP1);
- s2 = emit_load_s2(jd, iptr, REG_FTMP2);
- d = codegen_reg_of_dst(jd, iptr, REG_FTMP3);
- if (s2 == d) {
- M_FLTMOVE(s2, REG_FTMP2);
- s2 = REG_FTMP2;
- }
+ d = codegen_reg_of_dst(jd, iptr, REG_FTMP1);
+ s2 = emit_load_s2_but(jd, iptr, REG_FTMP2, d);
+
M_FLTMOVE(s1, d);
M_FDIV(s2, d);
emit_store_dst(jd, iptr, d);
-#endif
break;
case ICMD_DDIV: /* ..., val1, val2 ==> ..., val1 / val2 */
- OOPS();
-#if 0
s1 = emit_load_s1(jd, iptr, REG_FTMP1);
- s2 = emit_load_s2(jd, iptr, REG_FTMP2);
- d = codegen_reg_of_dst(jd, iptr, REG_FTMP3);
- if (s2 == d) {
- M_FLTMOVE(s2, REG_FTMP2);
- s2 = REG_FTMP2;
- }
+ d = codegen_reg_of_dst(jd, iptr, REG_FTMP1);
+ s2 = emit_load_s2_but(jd, iptr, REG_FTMP2, d);
+
M_FLTMOVE(s1, d);
M_DDIV(s2, d);
emit_store_dst(jd, iptr, d);
-#endif
break;
case ICMD_I2F: /* ..., value ==> ..., (float) value */
case ICMD_F2D: /* ..., value ==> ..., (double) value */
s1 = emit_load_s1(jd, iptr, REG_FTMP1);
- d = codegen_reg_of_dst(jd, iptr, REG_FTMP3);
+ d = codegen_reg_of_dst(jd, iptr, REG_FTMP2);
M_CVTFD(s1, d);
emit_store_dst(jd, iptr, d);
break;
break;
case ICMD_BALOAD: /* ..., arrayref, index ==> ..., value */
- OOPS();
-#if 0
- s1 = emit_load_s1(jd, iptr, REG_ITMP1);
- s2 = emit_load_s2(jd, iptr, REG_ITMP2);
- d = codegen_reg_of_dst(jd, iptr, REG_ITMP3);
- if (INSTRUCTION_MUST_CHECK(iptr)) {
- gen_nullptr_check(s1);
- gen_bound_check;
- }
- emit_movsbq_memindex_reg(cd, OFFSET(java_bytearray, data[0]), s1, s2, 0, d);
+ s1 = emit_load_s1_notzero(jd, iptr, REG_ITMP1);
+ s2 = emit_load_s2_notzero(jd, iptr, REG_ITMP2);
+ d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
+
+ emit_array_checks(cd, iptr, s1, s2);
+
+ N_IC(d, OFFSET(java_bytearray, data[0]), s2, s1);
+ /* TODO improove this */
+ N_SLL(d, 24, RN);
+ N_SRL(d, 24, RN);
emit_store_dst(jd, iptr, d);
-#endif
break;
case ICMD_CALOAD: /* ..., arrayref, index ==> ..., value */
break;
case ICMD_SALOAD: /* ..., arrayref, index ==> ..., value */
- OOPS();
-#if 0
- s1 = emit_load_s1(jd, iptr, REG_ITMP1);
+ s1 = emit_load_s1_notzero(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
- d = codegen_reg_of_dst(jd, iptr, REG_ITMP3);
- if (INSTRUCTION_MUST_CHECK(iptr)) {
- gen_nullptr_check(s1);
- gen_bound_check;
- }
- emit_movswq_memindex_reg(cd, OFFSET(java_shortarray, data[0]), s1, s2, 1, d);
+ d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
+
+ emit_array_checks(cd, iptr, s1, s2);
+
+ M_INTMOVE(s2, REG_ITMP2);
+ M_ISLL_IMM(1, REG_ITMP2);
+
+ N_LH(d, OFFSET(java_shortarray, data[0]), REG_ITMP2, s1);
emit_store_dst(jd, iptr, d);
-#endif
break;
case ICMD_IALOAD: /* ..., arrayref, index ==> ..., value */
- OOPS();
-#if 0
- s1 = emit_load_s1(jd, iptr, REG_ITMP1);
+ s1 = emit_load_s1_notzero(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
- d = codegen_reg_of_dst(jd, iptr, REG_ITMP3);
- if (INSTRUCTION_MUST_CHECK(iptr)) {
- gen_nullptr_check(s1);
- gen_bound_check;
- }
- emit_movl_memindex_reg(cd, OFFSET(java_intarray, data[0]), s1, s2, 2, d);
+ d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
+ emit_array_checks(cd, iptr, s1, s2);
+
+ M_INTMOVE(s2, REG_ITMP2);
+ M_ISLL_IMM(2, REG_ITMP2); /* scale index by 4 */
+ N_L(d, OFFSET(java_intarray, data[0]), REG_ITMP2, s1);
emit_store_dst(jd, iptr, d);
-#endif
break;
case ICMD_LALOAD: /* ..., arrayref, index ==> ..., value */
break;
case ICMD_BASTORE: /* ..., arrayref, index, value ==> ... */
- OOPS();
-#if 0
- s1 = emit_load_s1(jd, iptr, REG_ITMP1);
- s2 = emit_load_s2(jd, iptr, REG_ITMP2);
- if (INSTRUCTION_MUST_CHECK(iptr)) {
- gen_nullptr_check(s1);
- gen_bound_check;
- }
+ s1 = emit_load_s1_notzero(jd, iptr, REG_ITMP1);
+ s2 = emit_load_s2_notzero(jd, iptr, REG_ITMP2);
+ emit_array_checks(cd, iptr, s1, s2);
s3 = emit_load_s3(jd, iptr, REG_ITMP3);
- emit_movb_reg_memindex(cd, s3, OFFSET(java_bytearray, data[0]), s1, s2, 0);
-#endif
+
+ N_STC(s3, OFFSET(java_bytearray, data[0]), s2, s1);
break;
case ICMD_CASTORE: /* ..., arrayref, index, value ==> ... */
break;
case ICMD_SASTORE: /* ..., arrayref, index, value ==> ... */
- OOPS();
-#if 0
- s1 = emit_load_s1(jd, iptr, REG_ITMP1);
+ s1 = emit_load_s1_notzero(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
- if (INSTRUCTION_MUST_CHECK(iptr)) {
- gen_nullptr_check(s1);
- gen_bound_check;
- }
+ emit_array_checks(cd, iptr, s1, s2);
s3 = emit_load_s3(jd, iptr, REG_ITMP3);
- emit_movw_reg_memindex(cd, s3, OFFSET(java_shortarray, data[0]), s1, s2, 1);
-#endif
+
+ M_INTMOVE(s2, REG_ITMP2);
+ M_ISLL_IMM(1, REG_ITMP2);
+
+ N_STH(s3, OFFSET(java_shortarray, data[0]), REG_ITMP2, s1);
break;
case ICMD_IASTORE: /* ..., arrayref, index, value ==> ... */
- OOPS();
-#if 0
- s1 = emit_load_s1(jd, iptr, REG_ITMP1);
+ s1 = emit_load_s1_notzero(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
- if (INSTRUCTION_MUST_CHECK(iptr)) {
- gen_nullptr_check(s1);
- gen_bound_check;
- }
+ emit_array_checks(cd, iptr, s1, s2);
s3 = emit_load_s3(jd, iptr, REG_ITMP3);
- emit_movl_reg_memindex(cd, s3, OFFSET(java_intarray, data[0]), s1, s2, 2);
-#endif
+
+ M_INTMOVE(s2, REG_ITMP2);
+ M_ISLL_IMM(2, REG_ITMP2);
+
+ N_ST(s3, OFFSET(java_intarray, data[0]), REG_ITMP2, s1);
break;
case ICMD_LASTORE: /* ..., arrayref, index, value ==> ... */
- OOPS();
-#if 0
- s1 = emit_load_s1(jd, iptr, REG_ITMP1);
+ s1 = emit_load_s1_notzero(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
- if (INSTRUCTION_MUST_CHECK(iptr)) {
- gen_nullptr_check(s1);
- gen_bound_check;
- }
- s3 = emit_load_s3(jd, iptr, REG_ITMP3);
- emit_mov_reg_memindex(cd, s3, OFFSET(java_longarray, data[0]), s1, s2, 3);
-#endif
+ emit_array_checks(cd, iptr, s1, s2);
+
+ M_INTMOVE(s2, REG_ITMP2);
+ M_ISLL_IMM(3, REG_ITMP2);
+
+ s3 = emit_load_s3_high(jd, iptr, REG_ITMP3);
+ N_ST(s3, OFFSET(java_intarray, data[0]), REG_ITMP2, s1);
+ s3 = emit_load_s3_low(jd, iptr, REG_ITMP3);
+ N_ST(s3, OFFSET(java_intarray, data[0]) + 4, REG_ITMP2, s1);
break;
case ICMD_FASTORE: /* ..., arrayref, index, value ==> ... */
- OOPS();
-#if 0
- s1 = emit_load_s1(jd, iptr, REG_ITMP1);
+ s1 = emit_load_s1_notzero(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
- if (INSTRUCTION_MUST_CHECK(iptr)) {
- gen_nullptr_check(s1);
- gen_bound_check;
- }
- s3 = emit_load_s3(jd, iptr, REG_FTMP3);
- emit_movss_reg_memindex(cd, s3, OFFSET(java_floatarray, data[0]), s1, s2, 2);
-#endif
+ emit_array_checks(cd, iptr, s1, s2);
+ s3 = emit_load_s3(jd, iptr, REG_FTMP1);
+
+ M_INTMOVE(s2, REG_ITMP2);
+ M_ISLL_IMM(2, REG_ITMP2);
+
+ N_STE(s3, OFFSET(java_floatarray, data[0]), REG_ITMP2, s1);
break;
case ICMD_DASTORE: /* ..., arrayref, index, value ==> ... */
- OOPS();
-#if 0
- s1 = emit_load_s1(jd, iptr, REG_ITMP1);
+ s1 = emit_load_s1_notzero(jd, iptr, REG_ITMP1);
s2 = emit_load_s2(jd, iptr, REG_ITMP2);
- if (INSTRUCTION_MUST_CHECK(iptr)) {
- gen_nullptr_check(s1);
- gen_bound_check;
- }
- s3 = emit_load_s3(jd, iptr, REG_FTMP3);
- emit_movsd_reg_memindex(cd, s3, OFFSET(java_doublearray, data[0]), s1, s2, 3);
-#endif
+ emit_array_checks(cd, iptr, s1, s2);
+ s3 = emit_load_s3(jd, iptr, REG_FTMP1);
+
+ M_INTMOVE(s2, REG_ITMP2);
+ M_ISLL_IMM(3, REG_ITMP2);
+
+ N_STD(s3, OFFSET(java_doublearray, data[0]), REG_ITMP2, s1);
break;
case ICMD_AASTORE: /* ..., arrayref, index, value ==> ... */
}
M_ALD(REG_ITMP2, s1, OFFSET(java_objectheader, vftbl));
- M_ILD(REG_ITMP3, REG_ITMP2,
- OFFSET(vftbl_t, interfacetablelength));
- M_LDA(REG_ITMP3, REG_ITMP3, -superindex);
- M_TEST(REG_ITMP3);
+ M_ILD(REG_ITMP3, REG_ITMP2, OFFSET(vftbl_t, interfacetablelength));
+ M_ISUB_IMM(superindex, REG_ITMP3);
M_BLE(0);
codegen_add_classcastexception_ref(cd, s1);
- M_ALD(REG_ITMP3, REG_ITMP2,
- (s4) (OFFSET(vftbl_t, interfacetable[0]) -
- superindex * sizeof(methodptr*)));
- M_TEST(REG_ITMP3);
+ N_AHI(
+ REG_ITMP2,
+ (s4) (OFFSET(vftbl_t, interfacetable[0]) -
+ superindex * sizeof(methodptr*))
+ );
+ M_ALD(REG_ITMP2, REG_ITMP2, 0);
+ M_TEST(REG_ITMP2);
M_BEQ(0);
codegen_add_classcastexception_ref(cd, s1);
M_ALD(REG_ITMP1, s1, OFFSET(java_objectheader, vftbl));
M_ILD(REG_ITMP3, REG_ITMP1, OFFSET(vftbl_t, interfacetablelength));
- M_ASUB_IMM(superindex, REG_ITMP3);
+ M_ISUB_IMM(superindex, REG_ITMP3);
label1_refs[0] = cd->mcodeptr;
M_BLE(0);
N_AHI(
/* d := (REG_ITMP1 != 0) */
N_LTR(d, REG_ITMP1);
- M_BEQ(SZ_LHI);
+ M_BEQ(SZ_BRC + SZ_LHI);
N_LHI(d, 1);
label1 = cd->mcodeptr;
#if defined(ENABLE_THREADS)
codegen_threadcritstop(cd, cd->mcodeptr - cd->mcodebase);
#endif
- M_ISUB(REG_ITMP1, REG_ITMP3);
+ M_ISUB(REG_ITMP3, REG_ITMP1); /* itmp1 := itmp1 (sub.baseval) - itmp3 (super.baseval) */
N_CLR(REG_ITMP1, REG_ITMP2); /* d := (uint)REG_ITMP1 <= (uint)REG_ITMP2 */
N_LHI(d, 0);
- M_BGT(SZ_LHI);
+ M_BGT(SZ_BRC + SZ_LHI);
N_LHI(d, 1);
}
Authors: Andreas Krall
Christian Thalinger
- $Id: codegen.h 7534 2007-03-16 23:00:18Z pm $
+ $Id: codegen.h 7581 2007-03-26 07:23:16Z pm $
*/
#define N_VALID_DISP(x) ((N_DISP_MIN <= (x)) && ((x) <= N_DISP_MAX))
#define ASSERT_VALID_DISP(x) assert(N_VALID_DISP(x))
+#define N_BRANCH_MIN -32768
+#define N_BRANCH_MAX 32767
+#define N_VALID_BRANCH(x) ((N_BRANCH_MIN <= (x)) && ((x) <= N_BRANCH_MAX))
+#define ASSERT_VALID_BRANCH(x) assert(N_VALID_BRANCH(x))
+
/* Condition codes */
#define DD_O 1
# define SZ_AHI SZ_RI
#define N_ALR(r1, r2) N_RR(0x1E, r1, r2)
#define N_AL(r1, d2, x2, b2) N_RX(0x5E, r1, d2, x2, b2)
-#define N_NR(r1, r2) N_RR(r1, r2)
+#define N_NR(r1, r2) N_RR(0x14, r1, r2)
#define N_N(r1, d2, x2, b2) N_RX(0x54, r1, d2, x2, b2)
#define N_NI(d1, b1, i2) N_SI(0x94, d1, b1, i2)
#define N_NC(d1, l, b1, d2, b2) N_NC(0xD4, l, b1, d1, b2, d2)
/* chapter 19. Binary floating point instructions */
+#define N_AEBR(r1, r2) N_RRE(0xB30A, r1, r2)
+#define N_ADBR(r1, r2) N_RRE(0xB31A, r1, r2)
+#define N_AXBR(r1, r2) N_RRE(0xB34A, r1, r2)
+#define N_AEB(r1, d2, x2, b2) N_RXE(0xED0A, r1, d2, x2, b2)
+#define N_ADB(r1, d2, x2, b2) N_RXE(0xED1A, r1, d2, x2, b2)
+
#define N_CEBR(r1, r2) N_RRE(0xB309, r1, r2)
#define N_CDBR(r1, r2) N_RRE(0xB319, r1, r2)
#define N_CXBR(r1, r2) N_RRE(0xB349, r1, r2)
#define N_CFDBR(r1, m3, r2) N_RRF(0xB399, r1, m3, r2)
#define N_CFXBR(r1, m3, r2) N_RRF(0xB39A, r1, m3, r2)
+#define N_DEBR(r1, r2) N_RRE(0xB30D, r1, r2)
+#define N_DDBR(r1, r2) N_RRE(0xB31D, r1, r2)
+#define N_DXBR(r1, r2) N_RRE(0xB34D, r1, r2)
+#define N_DEB(r1, d2, x2, b2) N_RXE(0xED0D, r1, d2, x2, b2)
+#define N_DDB(r1, d2, x2, b2) N_RXE(0xED1D, r1, d2, x2, b2)
+
#define N_LDEBR(r1, r2) N_RRE(0xB304, r1, r2)
#define N_LXDBR(r1, r2) N_RRE(0xB305, r1, r2)
#define N_LXEBR(r1, r2) N_RRE(0xB306, r1, r2)
#define N_MDEBR(r1, r2) N_RRE(0xB30C, r1, r2)
#define N_MXDBR(r1, r2) N_RRE(0xB307, r1, r2)
+#define N_SEBR(r1, r2) N_RRE(0xB30B, r1, r2)
+#define N_SDBR(r1, r2) N_RRE(0xB31B, r1, r2)
+#define N_SXBR(r1, r2) N_RRE(0xB34B, r1, r2)
+#define N_SEB(r1, d2, x2, b2) N_RXE(0xED0B, r1, d2, x2, b2)
+#define N_SDB(r1, d2, x2, b2) N_RXE(0xED1B, r1, d2, x2, b2)
+
/* Alpha like instructions */
#define M_CALL(r2) N_BASR(R14, r2)
#define M_CVTIF(src, dst) N_CEFBR(dst, src)
#define M_CVTID(src, dst) N_CDFBR(dst, src)
#define M_FMUL(a, dest) N_MEEBR(dest, a)
+#define M_FSUB(a, dest) N_SEBR(dest, a)
+#define M_FADD(a, dest) N_AEBR(dest, a)
+#define M_FDIV(a, dest) N_DEBR(dest, a)
+#define M_DMUL(a, dest) N_MDBR(dest, a)
+#define M_DSUB(a, dest) N_SDBR(dest, a)
+#define M_DADD(a, dest) N_ADBR(dest, a)
+#define M_DDIV(a, dest) N_DDBR(dest, a)
#define M_CVTFI(src, dst) N_CFEBR(dst, 5, src)
#define M_IADD(a, dest) N_AR(dest, a)
#define M_ISUB(a, dest) N_SR(dest, a)
#define M_IAND(a, dest) N_NR(dest, a)
+#define M_IOR(a, dest) N_OR(dest, a)
+#define M_IXOR(a, dest) N_XR(dest, a)
#define M_CVTFD(src,dst) N_LDEBR(dst, src)
#define M_ISLL_IMM(imm,reg) N_SLL(reg, imm, RN)
#define M_INEG(a) _DEPR( M_INEG(a) )
#define M_LNEG(a) _DEPR( M_LNEG(a) )
-#define M_IOR(a,b) _DEPR( M_IOR(a,b) )
-#define M_IXOR(a,b) _DEPR( M_IXOR(a,b) )
-
#define M_IAND_IMM(a,b) _DEPR( M_IAND_IMM(a,b) )
#define M_IOR_IMM(a,b) _DEPR( M_IOR_IMM(a,b) )
#define M_IXOR_IMM(a,b) _DEPR( M_IXOR_IMM(a,b) )
#define M_FST32(a,b,disp) _DEPR( M_FST32(a,b,disp) )
#define M_DST32(a,b,disp) _DEPR( M_DST32(a,b,disp) )
-#define M_FADD(a,b) _DEPR( M_FADD(a,b) )
-#define M_DADD(a,b) _DEPR( M_DADD(a,b) )
-#define M_FSUB(a,b) _DEPR( M_FSUB(a,b) )
-#define M_DSUB(a,b) _DEPR( M_DSUB(a,b) )
-#define M_DMUL(a,b) _DEPR( M_DMUL(a,b) )
-#define M_FDIV(a,b) _DEPR( M_FDIV(a,b) )
-#define M_DDIV(a,b) _DEPR( M_DDIV(a,b) )
-
#define M_CVTLF(a,b) _DEPR( M_CVTLF(a,b) )
#define M_CVTLD(a,b) _DEPR( M_CVTLD(a,b) )
#define M_CVTDI(a,b) _DEPR( M_CVTDI(a,b) )