You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
168 lines
4.4 KiB
168 lines
4.4 KiB
%def field(helper=""):
|
|
/*
|
|
* General field read / write (iget-* iput-* sget-* sput-*).
|
|
*/
|
|
.extern $helper
|
|
REFRESH_INST ${opnum} # fix rINST to include opcode
|
|
movl rPC, OUT_ARG0(%esp) # arg0: Instruction* inst
|
|
movl rINST, OUT_ARG1(%esp) # arg1: uint16_t inst_data
|
|
leal OFF_FP_SHADOWFRAME(rFP), %eax
|
|
movl %eax, OUT_ARG2(%esp) # arg2: ShadowFrame* sf
|
|
movl rSELF, %eax
|
|
movl %eax, OUT_ARG3(%esp) # arg3: Thread* self
|
|
call SYMBOL($helper)
|
|
testb %al, %al
|
|
jz MterpPossibleException
|
|
RESTORE_IBASE
|
|
ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
|
|
|
|
%def op_check_cast():
|
|
/*
|
|
* Check to see if a cast from one class to another is allowed.
|
|
*/
|
|
/* check-cast vAA, class@BBBB */
|
|
EXPORT_PC
|
|
movzwl 2(rPC), %eax # eax <- BBBB
|
|
movl %eax, OUT_ARG0(%esp)
|
|
leal VREG_ADDRESS(rINST), %ecx
|
|
movl %ecx, OUT_ARG1(%esp)
|
|
movl OFF_FP_METHOD(rFP),%eax
|
|
movl %eax, OUT_ARG2(%esp)
|
|
movl rSELF, %ecx
|
|
movl %ecx, OUT_ARG3(%esp)
|
|
call SYMBOL(MterpCheckCast) # (index, &obj, method, self)
|
|
RESTORE_IBASE
|
|
testb %al, %al
|
|
jnz MterpPossibleException
|
|
ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
|
|
|
|
%def op_iget(is_object="0", helper="MterpIGetU32"):
|
|
% field(helper=helper)
|
|
|
|
%def op_iget_boolean():
|
|
% op_iget(helper="MterpIGetU8")
|
|
|
|
%def op_iget_byte():
|
|
% op_iget(helper="MterpIGetI8")
|
|
|
|
%def op_iget_char():
|
|
% op_iget(helper="MterpIGetU16")
|
|
|
|
%def op_iget_object():
|
|
% op_iget(is_object="1", helper="MterpIGetObj")
|
|
|
|
%def op_iget_short():
|
|
% op_iget(helper="MterpIGetI16")
|
|
|
|
%def op_iget_wide():
|
|
% op_iget(helper="MterpIGetU64")
|
|
|
|
%def op_instance_of():
|
|
/*
|
|
* Check to see if an object reference is an instance of a class.
|
|
*
|
|
* Most common situation is a non-null object, being compared against
|
|
* an already-resolved class.
|
|
*/
|
|
/* instance-of vA, vB, class@CCCC */
|
|
EXPORT_PC
|
|
movzwl 2(rPC), %eax # eax <- BBBB
|
|
movl %eax, OUT_ARG0(%esp)
|
|
movl rINST, %eax # eax <- BA
|
|
sarl $$4, %eax # eax <- B
|
|
leal VREG_ADDRESS(%eax), %ecx # Get object address
|
|
movl %ecx, OUT_ARG1(%esp)
|
|
movl OFF_FP_METHOD(rFP),%eax
|
|
movl %eax, OUT_ARG2(%esp)
|
|
movl rSELF, %ecx
|
|
movl %ecx, OUT_ARG3(%esp)
|
|
call SYMBOL(MterpInstanceOf) # (index, &obj, method, self)
|
|
movl rSELF, %ecx
|
|
RESTORE_IBASE_FROM_SELF %ecx
|
|
cmpl $$0, THREAD_EXCEPTION_OFFSET(%ecx)
|
|
jnz MterpException
|
|
andb $$0xf, rINSTbl # rINSTbl <- A
|
|
SET_VREG %eax, rINST
|
|
ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
|
|
|
|
%def op_iput(is_object="0", helper="MterpIPutU32"):
|
|
% field(helper=helper)
|
|
|
|
%def op_iput_boolean():
|
|
% op_iput(helper="MterpIPutU8")
|
|
|
|
%def op_iput_byte():
|
|
% op_iput(helper="MterpIPutI8")
|
|
|
|
%def op_iput_char():
|
|
% op_iput(helper="MterpIPutU16")
|
|
|
|
%def op_iput_object():
|
|
% op_iput(is_object="1", helper="MterpIPutObj")
|
|
|
|
%def op_iput_short():
|
|
% op_iput(helper="MterpIPutI16")
|
|
|
|
%def op_iput_wide():
|
|
% op_iput(helper="MterpIPutU64")
|
|
|
|
%def op_new_instance():
|
|
/*
|
|
* Create a new instance of a class.
|
|
*/
|
|
/* new-instance vAA, class@BBBB */
|
|
EXPORT_PC
|
|
leal OFF_FP_SHADOWFRAME(rFP), %eax
|
|
movl %eax, OUT_ARG0(%esp)
|
|
movl rSELF, %ecx
|
|
movl %ecx, OUT_ARG1(%esp)
|
|
REFRESH_INST ${opnum}
|
|
movl rINST, OUT_ARG2(%esp)
|
|
call SYMBOL(MterpNewInstance)
|
|
RESTORE_IBASE
|
|
testb %al, %al # 0 means an exception is thrown
|
|
jz MterpPossibleException
|
|
ADVANCE_PC_FETCH_AND_GOTO_NEXT 2
|
|
|
|
%def op_sget(is_object="0", helper="MterpSGetU32"):
|
|
% field(helper=helper)
|
|
|
|
%def op_sget_boolean():
|
|
% op_sget(helper="MterpSGetU8")
|
|
|
|
%def op_sget_byte():
|
|
% op_sget(helper="MterpSGetI8")
|
|
|
|
%def op_sget_char():
|
|
% op_sget(helper="MterpSGetU16")
|
|
|
|
%def op_sget_object():
|
|
% op_sget(is_object="1", helper="MterpSGetObj")
|
|
|
|
%def op_sget_short():
|
|
% op_sget(helper="MterpSGetI16")
|
|
|
|
%def op_sget_wide():
|
|
% op_sget(helper="MterpSGetU64")
|
|
|
|
%def op_sput(is_object="0", helper="MterpSPutU32"):
|
|
% field(helper=helper)
|
|
|
|
%def op_sput_boolean():
|
|
% op_sput(helper="MterpSPutU8")
|
|
|
|
%def op_sput_byte():
|
|
% op_sput(helper="MterpSPutI8")
|
|
|
|
%def op_sput_char():
|
|
% op_sput(helper="MterpSPutU16")
|
|
|
|
%def op_sput_object():
|
|
% op_sput(is_object="1", helper="MterpSPutObj")
|
|
|
|
%def op_sput_short():
|
|
% op_sput(helper="MterpSPutI16")
|
|
|
|
%def op_sput_wide():
|
|
% op_sput(helper="MterpSPutU64")
|