xref: /aosp_15_r20/art/runtime/interpreter/mterp/x86ng/object.S (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
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