1*795d594fSAndroid Build Coastguard Worker%def op_check_cast(): 2*795d594fSAndroid Build Coastguard Worker% slow_path = add_slow_path(op_check_cast_slow_path) 3*795d594fSAndroid Build Coastguard Worker // Fast-path which gets the class from thread-local cache. 4*795d594fSAndroid Build Coastguard Worker% fetch_from_thread_cache("%ecx", miss_label="3f") 5*795d594fSAndroid Build Coastguard Worker1: 6*795d594fSAndroid Build Coastguard Worker GET_VREG %eax, rINST 7*795d594fSAndroid Build Coastguard Worker testl %eax, %eax 8*795d594fSAndroid Build Coastguard Worker je .L${opcode}_resume 9*795d594fSAndroid Build Coastguard Worker // Fast path without read barriers. 10*795d594fSAndroid Build Coastguard Worker POISON_HEAP_REF ecx // Poison class reference for in-memory comparison. 11*795d594fSAndroid Build Coastguard Worker cmpl MIRROR_OBJECT_CLASS_OFFSET(%eax), %ecx 12*795d594fSAndroid Build Coastguard Worker jne ${slow_path} 13*795d594fSAndroid Build Coastguard Worker.L${opcode}_resume: 14*795d594fSAndroid Build Coastguard Worker ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 15*795d594fSAndroid Build Coastguard Worker3: 16*795d594fSAndroid Build Coastguard Worker EXPORT_PC 17*795d594fSAndroid Build Coastguard Worker movl rSELF:THREAD_SELF_OFFSET, ARG0 18*795d594fSAndroid Build Coastguard Worker movl 0(%esp), ARG1 19*795d594fSAndroid Build Coastguard Worker movl rPC, ARG2 20*795d594fSAndroid Build Coastguard Worker call nterp_get_class 21*795d594fSAndroid Build Coastguard Worker movl %eax, %ecx 22*795d594fSAndroid Build Coastguard Worker jmp 1b 23*795d594fSAndroid Build Coastguard Worker 24*795d594fSAndroid Build Coastguard Worker%def op_check_cast_slow_path(): 25*795d594fSAndroid Build Coastguard Worker UNPOISON_HEAP_REF ecx // Unpoison class reference poisoned in main path. 26*795d594fSAndroid Build Coastguard Worker cmpl $$0, rSELF:THREAD_READ_BARRIER_MARK_REG00_OFFSET 27*795d594fSAndroid Build Coastguard Worker jne 2f 28*795d594fSAndroid Build Coastguard Worker1: 29*795d594fSAndroid Build Coastguard Worker EXPORT_PC 30*795d594fSAndroid Build Coastguard Worker call art_quick_check_instance_of 31*795d594fSAndroid Build Coastguard Worker RESTORE_IBASE 32*795d594fSAndroid Build Coastguard Worker jmp .L${opcode}_resume 33*795d594fSAndroid Build Coastguard Worker2: 34*795d594fSAndroid Build Coastguard Worker // 01 is %ecx 35*795d594fSAndroid Build Coastguard Worker call art_quick_read_barrier_mark_reg01 36*795d594fSAndroid Build Coastguard Worker jmp 1b 37*795d594fSAndroid Build Coastguard Worker 38*795d594fSAndroid Build Coastguard Worker%def op_instance_of(): 39*795d594fSAndroid Build Coastguard Worker% slow_path = add_slow_path(op_instance_of_slow_path) 40*795d594fSAndroid Build Coastguard Worker /* instance-of vA, vB, class@CCCC */ 41*795d594fSAndroid Build Coastguard Worker // Fast-path which gets the class from thread-local cache. 42*795d594fSAndroid Build Coastguard Worker% fetch_from_thread_cache("%ecx", miss_label="2f") 43*795d594fSAndroid Build Coastguard Worker1: 44*795d594fSAndroid Build Coastguard Worker movzbl rINSTbl, %eax 45*795d594fSAndroid Build Coastguard Worker sarl $$4,%eax # eax<- B 46*795d594fSAndroid Build Coastguard Worker GET_VREG %eax %eax # eax<- vB (object) 47*795d594fSAndroid Build Coastguard Worker testl %eax, %eax 48*795d594fSAndroid Build Coastguard Worker je .L${opcode}_resume 49*795d594fSAndroid Build Coastguard Worker // Fast path without read barriers. 50*795d594fSAndroid Build Coastguard Worker POISON_HEAP_REF ecx // Poison class reference for in-memory comparison. 51*795d594fSAndroid Build Coastguard Worker cmpl MIRROR_OBJECT_CLASS_OFFSET(%eax), %ecx 52*795d594fSAndroid Build Coastguard Worker jne ${slow_path} 53*795d594fSAndroid Build Coastguard Worker.L${opcode}_set_one: 54*795d594fSAndroid Build Coastguard Worker movl $$1, %eax 55*795d594fSAndroid Build Coastguard Worker.L${opcode}_resume: 56*795d594fSAndroid Build Coastguard Worker andb $$0xf,rINSTbl # rINST<- A 57*795d594fSAndroid Build Coastguard Worker SET_VREG %eax, rINST # fp[A] <- value 58*795d594fSAndroid Build Coastguard Worker ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 59*795d594fSAndroid Build Coastguard Worker2: 60*795d594fSAndroid Build Coastguard Worker EXPORT_PC 61*795d594fSAndroid Build Coastguard Worker movl rSELF:THREAD_SELF_OFFSET, ARG0 62*795d594fSAndroid Build Coastguard Worker movl 0(%esp), ARG1 63*795d594fSAndroid Build Coastguard Worker movl rPC, ARG2 64*795d594fSAndroid Build Coastguard Worker call nterp_get_class 65*795d594fSAndroid Build Coastguard Worker movl %eax, %ecx 66*795d594fSAndroid Build Coastguard Worker jmp 1b 67*795d594fSAndroid Build Coastguard Worker 68*795d594fSAndroid Build Coastguard Worker%def op_instance_of_slow_path(): 69*795d594fSAndroid Build Coastguard Worker UNPOISON_HEAP_REF ecx // Unpoison class reference poisoned in main path. 70*795d594fSAndroid Build Coastguard Worker cmpl $$0, rSELF:THREAD_READ_BARRIER_MARK_REG00_OFFSET 71*795d594fSAndroid Build Coastguard Worker jne 2f 72*795d594fSAndroid Build Coastguard Worker testl $$MIRROR_CLASS_IS_INTERFACE_FLAG, MIRROR_CLASS_ACCESS_FLAGS_OFFSET(%ecx) 73*795d594fSAndroid Build Coastguard Worker jne 3f 74*795d594fSAndroid Build Coastguard Worker cmpl $$0, MIRROR_CLASS_COMPONENT_TYPE_OFFSET(%ecx) 75*795d594fSAndroid Build Coastguard Worker jne 3f 76*795d594fSAndroid Build Coastguard Worker movl MIRROR_OBJECT_CLASS_OFFSET(%eax), %eax 77*795d594fSAndroid Build Coastguard Worker UNPOISON_HEAP_REF eax 78*795d594fSAndroid Build Coastguard Worker1: 79*795d594fSAndroid Build Coastguard Worker movl MIRROR_CLASS_SUPER_CLASS_OFFSET(%eax), %eax 80*795d594fSAndroid Build Coastguard Worker UNPOISON_HEAP_REF eax 81*795d594fSAndroid Build Coastguard Worker cmpl %eax, %ecx 82*795d594fSAndroid Build Coastguard Worker je .L${opcode}_set_one 83*795d594fSAndroid Build Coastguard Worker testl %eax, %eax 84*795d594fSAndroid Build Coastguard Worker jne 1b 85*795d594fSAndroid Build Coastguard Worker jmp .L${opcode}_resume 86*795d594fSAndroid Build Coastguard Worker2: 87*795d594fSAndroid Build Coastguard Worker // 01 is %ecx 88*795d594fSAndroid Build Coastguard Worker call art_quick_read_barrier_mark_reg01 89*795d594fSAndroid Build Coastguard Worker3: 90*795d594fSAndroid Build Coastguard Worker EXPORT_PC 91*795d594fSAndroid Build Coastguard Worker call art_quick_instance_of 92*795d594fSAndroid Build Coastguard Worker RESTORE_IBASE 93*795d594fSAndroid Build Coastguard Worker FETCH_INST_CLEAR_OPCODE 94*795d594fSAndroid Build Coastguard Worker jmp .L${opcode}_resume 95*795d594fSAndroid Build Coastguard Worker 96*795d594fSAndroid Build Coastguard Worker%def op_iget_boolean(): 97*795d594fSAndroid Build Coastguard Worker jmp NterpGetBooleanInstanceField 98*795d594fSAndroid Build Coastguard Worker 99*795d594fSAndroid Build Coastguard Worker%def op_iget_byte(): 100*795d594fSAndroid Build Coastguard Worker jmp NterpGetByteInstanceField 101*795d594fSAndroid Build Coastguard Worker 102*795d594fSAndroid Build Coastguard Worker%def op_iget_char(): 103*795d594fSAndroid Build Coastguard Worker jmp NterpGetCharInstanceField 104*795d594fSAndroid Build Coastguard Worker 105*795d594fSAndroid Build Coastguard Worker%def op_iget_object(): 106*795d594fSAndroid Build Coastguard Worker jmp NterpGetObjectInstanceField 107*795d594fSAndroid Build Coastguard Worker 108*795d594fSAndroid Build Coastguard Worker%def op_iget_short(): 109*795d594fSAndroid Build Coastguard Worker jmp NterpGetShortInstanceField 110*795d594fSAndroid Build Coastguard Worker 111*795d594fSAndroid Build Coastguard Worker%def op_iget_wide(): 112*795d594fSAndroid Build Coastguard Worker jmp NterpGetWideInstanceField 113*795d594fSAndroid Build Coastguard Worker 114*795d594fSAndroid Build Coastguard Worker%def op_iget(): 115*795d594fSAndroid Build Coastguard Worker jmp NterpGetInstanceField 116*795d594fSAndroid Build Coastguard Worker 117*795d594fSAndroid Build Coastguard Worker%def op_iput(): 118*795d594fSAndroid Build Coastguard Worker jmp NterpPutInstanceField 119*795d594fSAndroid Build Coastguard Worker 120*795d594fSAndroid Build Coastguard Worker%def op_iput_boolean(): 121*795d594fSAndroid Build Coastguard Worker jmp NterpPutBooleanInstanceField 122*795d594fSAndroid Build Coastguard Worker 123*795d594fSAndroid Build Coastguard Worker%def op_iput_byte(): 124*795d594fSAndroid Build Coastguard Worker jmp NterpPutByteInstanceField 125*795d594fSAndroid Build Coastguard Worker 126*795d594fSAndroid Build Coastguard Worker%def op_iput_char(): 127*795d594fSAndroid Build Coastguard Worker jmp NterpPutCharInstanceField 128*795d594fSAndroid Build Coastguard Worker 129*795d594fSAndroid Build Coastguard Worker%def op_iput_object(): 130*795d594fSAndroid Build Coastguard Worker jmp NterpPutObjectInstanceField 131*795d594fSAndroid Build Coastguard Worker 132*795d594fSAndroid Build Coastguard Worker%def op_iput_short(): 133*795d594fSAndroid Build Coastguard Worker jmp NterpPutShortInstanceField 134*795d594fSAndroid Build Coastguard Worker 135*795d594fSAndroid Build Coastguard Worker%def op_iput_wide(): 136*795d594fSAndroid Build Coastguard Worker jmp NterpPutWideInstanceField 137*795d594fSAndroid Build Coastguard Worker 138*795d594fSAndroid Build Coastguard Worker%def op_sget(load="movl", wide="0"): 139*795d594fSAndroid Build Coastguard Worker jmp NterpGetIntStaticField 140*795d594fSAndroid Build Coastguard Worker 141*795d594fSAndroid Build Coastguard Worker%def op_sget_boolean(): 142*795d594fSAndroid Build Coastguard Worker jmp NterpGetBooleanStaticField 143*795d594fSAndroid Build Coastguard Worker 144*795d594fSAndroid Build Coastguard Worker%def op_sget_byte(): 145*795d594fSAndroid Build Coastguard Worker jmp NterpGetByteStaticField 146*795d594fSAndroid Build Coastguard Worker 147*795d594fSAndroid Build Coastguard Worker%def op_sget_char(): 148*795d594fSAndroid Build Coastguard Worker jmp NterpGetCharStaticField 149*795d594fSAndroid Build Coastguard Worker 150*795d594fSAndroid Build Coastguard Worker%def op_sget_object(): 151*795d594fSAndroid Build Coastguard Worker jmp NterpGetObjectStaticField 152*795d594fSAndroid Build Coastguard Worker 153*795d594fSAndroid Build Coastguard Worker%def op_sget_short(): 154*795d594fSAndroid Build Coastguard Worker jmp NterpGetShortStaticField 155*795d594fSAndroid Build Coastguard Worker 156*795d594fSAndroid Build Coastguard Worker%def op_sget_wide(): 157*795d594fSAndroid Build Coastguard Worker jmp NterpGetWideStaticField 158*795d594fSAndroid Build Coastguard Worker 159*795d594fSAndroid Build Coastguard Worker%def op_sput(): 160*795d594fSAndroid Build Coastguard Worker jmp NterpPutStaticField 161*795d594fSAndroid Build Coastguard Worker 162*795d594fSAndroid Build Coastguard Worker%def op_sput_boolean(): 163*795d594fSAndroid Build Coastguard Worker jmp NterpPutBooleanStaticField 164*795d594fSAndroid Build Coastguard Worker 165*795d594fSAndroid Build Coastguard Worker%def op_sput_byte(): 166*795d594fSAndroid Build Coastguard Worker jmp NterpPutByteStaticField 167*795d594fSAndroid Build Coastguard Worker 168*795d594fSAndroid Build Coastguard Worker%def op_sput_char(): 169*795d594fSAndroid Build Coastguard Worker jmp NterpPutCharStaticField 170*795d594fSAndroid Build Coastguard Worker 171*795d594fSAndroid Build Coastguard Worker%def op_sput_object(): 172*795d594fSAndroid Build Coastguard Worker jmp NterpPutObjectStaticField 173*795d594fSAndroid Build Coastguard Worker 174*795d594fSAndroid Build Coastguard Worker%def op_sput_short(): 175*795d594fSAndroid Build Coastguard Worker jmp NterpPutShortStaticField 176*795d594fSAndroid Build Coastguard Worker 177*795d594fSAndroid Build Coastguard Worker%def op_sput_wide(): 178*795d594fSAndroid Build Coastguard Worker jmp NterpPutWideStaticField 179*795d594fSAndroid Build Coastguard Worker 180*795d594fSAndroid Build Coastguard Worker%def op_new_instance(): 181*795d594fSAndroid Build Coastguard Worker // The routine is too big to fit in a handler, so jump to it. 182*795d594fSAndroid Build Coastguard Worker jmp NterpNewInstance 183