#define AO_HAVE_test_and_set_full
-#endif // __ARM_ARCH_x
+#endif /* __ARM_ARCH_x */
+
*******************************************************************************/
-jint _Jv_JNI_GetEnv(JavaVM *vm, void **env, jint version)
+jint jni_GetEnv(JavaVM *vm, void **env, jint version)
{
- TRACEJNICALLS(("_Jv_JNI_GetEnv(vm=%p, env=%p, %d=version)", vm, env, version));
+ TRACEJNICALLS(("jni_GetEnv(vm=%p, env=%p, version=%d)", vm, env, version));
if (vm_created == false) {
*env = NULL;
_Jv_JNI_DestroyJavaVM,
_Jv_JNI_AttachCurrentThread,
_Jv_JNI_DetachCurrentThread,
- _Jv_JNI_GetEnv,
+ jni_GetEnv,
_Jv_JNI_AttachCurrentThreadAsDaemon
};
if (!md->params[i].inmemory) {
s = md->params[i].regoff;
+#if defined(ENABLE_SOFTFLOAT)
+ switch (md->paramtypes[i].type) {
+ case TYPE_INT:
+ case TYPE_FLT:
+ case TYPE_ADR:
+ M_IST(s, REG_SP, i * 8);
+ break;
+ case TYPE_LNG:
+ case TYPE_DBL:
+ M_LST(s, REG_SP, i * 8);
+ break;
+ }
+#else
switch (md->paramtypes[i].type) {
case TYPE_ADR:
case TYPE_INT:
M_DST(s, REG_SP, i * 8);
break;
}
+#endif
}
}
if (!md->params[i].inmemory) {
s = md->params[i].regoff;
+#if defined(ENABLE_SOFTFLOAT)
+ switch (md->paramtypes[i].type) {
+ case TYPE_INT:
+ case TYPE_FLT:
+ case TYPE_ADR:
+ M_ILD(s, REG_SP, i * 8);
+ break;
+ case TYPE_LNG:
+ case TYPE_DBL:
+ M_LLD(s, REG_SP, i * 8);
+ break;
+ }
+#else
switch (md->paramtypes[i].type) {
case TYPE_ADR:
case TYPE_INT:
M_DLD(s, REG_SP, i * 8);
break;
}
+#endif
}
}
#include "vm/builtin.h"
#include "vm/exceptions.h"
#include "vm/global.h"
+#include "vm/primitive.h"
#include "vm/stringlocal.h"
#include "vm/vm.h"
switch (md->returntype.type) {
case TYPE_INT:
case TYPE_ADR:
+ switch (md->returntype.decltype) {
+ case PRIMITIVETYPE_BOOLEAN:
+ M_BZEXT(REG_RESULT, REG_RESULT);
+ break;
+ case PRIMITIVETYPE_BYTE:
+ M_BSEXT(REG_RESULT, REG_RESULT);
+ break;
+ case PRIMITIVETYPE_CHAR:
+ M_CZEXT(REG_RESULT, REG_RESULT);
+ break;
+ case PRIMITIVETYPE_SHORT:
+ M_SSEXT(REG_RESULT, REG_RESULT);
+ break;
+ }
M_IST(REG_RESULT, REG_SP, 1 * 8);
break;
case TYPE_LNG:
#define M_CMP_IMM32(a,b) emit_alu_imm32_reg(cd, ALU_CMP, (a), (b))
-#define M_BSEXT(a,b) /* XXX does not work, because of nibbles */
+#define M_BSEXT(a,b) emit_movsbl_reg_reg(cd, (a), (b))
#define M_SSEXT(a,b) emit_movswl_reg_reg(cd, (a), (b))
+#define M_BZEXT(a,b) emit_movzbl_reg_reg(cd, (a), (b))
#define M_CZEXT(a,b) emit_movzwl_reg_reg(cd, (a), (b))
#define M_CLTD M_BYTE1(0x99)
}
+void emit_movsbl_reg_reg(codegendata *cd, s4 a, s4 b)
+{
+ assert(a < 4); /* Can only operate on al, bl, cl, dl. */
+ *(cd->mcodeptr++) = 0x0f;
+ *(cd->mcodeptr++) = 0xbe;
+ emit_reg((b),(a));
+}
+
+
void emit_movsbl_memindex_reg(codegendata *cd, s4 disp, s4 basereg, s4 indexreg, s4 scale, s4 reg)
{
COUNT(count_mov_mem_reg);
}
+void emit_movzbl_reg_reg(codegendata *cd, s4 a, s4 b)
+{
+ assert(a < 4); /* Can only operate on al, bl, cl, dl. */
+ *(cd->mcodeptr++) = 0x0f;
+ *(cd->mcodeptr++) = 0xb6;
+ emit_reg((b),(a));
+}
+
+
void emit_movzwl_reg_reg(codegendata *cd, s4 a, s4 b)
{
*(cd->mcodeptr++) = 0x0f;
void emit_mov_imm_membase(codegendata *cd, s4 imm, s4 basereg, s4 disp);
void emit_mov_imm_membase32(codegendata *cd, s4 imm, s4 basereg, s4 disp);
void emit_movb_imm_membase(codegendata *cd, s4 imm, s4 basereg, s4 disp);
+void emit_movsbl_reg_reg(codegendata *cd, s4 a, s4 b);
void emit_movsbl_memindex_reg(codegendata *cd, s4 disp, s4 basereg, s4 indexreg, s4 scale, s4 reg);
void emit_movswl_reg_reg(codegendata *cd, s4 a, s4 b);
void emit_movswl_memindex_reg(codegendata *cd, s4 disp, s4 basereg, s4 indexreg, s4 scale, s4 reg);
+void emit_movzbl_reg_reg(codegendata *cd, s4 a, s4 b);
void emit_movzwl_reg_reg(codegendata *cd, s4 a, s4 b);
void emit_movzwl_memindex_reg(codegendata *cd, s4 disp, s4 basereg, s4 indexreg, s4 scale, s4 reg);
void emit_mov_imm_memindex(codegendata *cd, s4 imm, s4 disp, s4 basereg, s4 indexreg, s4 scale);
#include "vm/builtin.h"
#include "vm/exceptions.h"
#include "vm/global.h"
+#include "vm/primitive.h"
#include "vm/stringlocal.h"
#include "vm/vm.h"
case TYPE_INT:
case TYPE_LNG:
case TYPE_ADR:
+ switch (md->returntype.decltype) {
+ case PRIMITIVETYPE_BOOLEAN:
+ M_BZEXT(REG_RESULT, REG_RESULT);
+ break;
+ case PRIMITIVETYPE_BYTE:
+ M_BSEXT(REG_RESULT, REG_RESULT);
+ break;
+ case PRIMITIVETYPE_CHAR:
+ M_CZEXT(REG_RESULT, REG_RESULT);
+ break;
+ case PRIMITIVETYPE_SHORT:
+ M_SSEXT(REG_RESULT, REG_RESULT);
+ break;
+ }
M_LST(REG_RESULT, REG_SP, 0 * 8);
break;
case TYPE_FLT:
#define M_SSEXT(a,b) emit_movswq_reg_reg(cd, (a), (b))
#define M_ISEXT(a,b) emit_movslq_reg_reg(cd, (a), (b))
+#define M_BZEXT(a,b) emit_movzbq_reg_reg(cd, (a), (b))
#define M_CZEXT(a,b) emit_movzwq_reg_reg(cd, (a), (b))
#define M_ISLL_IMM(a,b) emit_shiftl_imm_reg(cd, SHIFT_SHL, (a), (b))
}
+void emit_movzbq_reg_reg(codegendata *cd, s8 reg, s8 dreg)
+{
+ emit_rex(1,(dreg),0,(reg));
+ *(cd->mcodeptr++) = 0x0f;
+ *(cd->mcodeptr++) = 0xb6;
+ /* XXX: why do reg and dreg have to be exchanged */
+ emit_reg((dreg),(reg));
+}
+
+
void emit_movzwq_reg_reg(codegendata *cd, s8 reg, s8 dreg)
{
emit_rex(1,(dreg),0,(reg));
void emit_movswq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
void emit_movslq_reg_reg(codegendata *cd, s8 reg, s8 dreg);
void emit_movslq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
+void emit_movzbq_reg_reg(codegendata *cd, s8 reg, s8 dreg);
void emit_movzwq_reg_reg(codegendata *cd, s8 reg, s8 dreg);
void emit_movzwq_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 dreg);
void emit_movswq_memindex_reg(codegendata *cd, s8 disp, s8 basereg, s8 indexreg, s8 scale, s8 reg);