1 /* |
1 /* |
2 * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved. |
3 * Copyright (c) 2014, Red Hat Inc. All rights reserved. |
3 * Copyright (c) 2014, Red Hat Inc. All rights reserved. |
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
5 * |
5 * |
6 * This code is free software; you can redistribute it and/or modify it |
6 * This code is free software; you can redistribute it and/or modify it |
7 * under the terms of the GNU General Public License version 2 only, as |
7 * under the terms of the GNU General Public License version 2 only, as |
3416 __ ldarb(rscratch1, rscratch1); |
3416 __ ldarb(rscratch1, rscratch1); |
3417 __ cmp(rscratch1, JVM_CONSTANT_Class); |
3417 __ cmp(rscratch1, JVM_CONSTANT_Class); |
3418 __ br(Assembler::NE, slow_case); |
3418 __ br(Assembler::NE, slow_case); |
3419 |
3419 |
3420 // get InstanceKlass |
3420 // get InstanceKlass |
3421 __ lea(r4, Address(r4, r3, Address::lsl(3))); |
3421 __ load_resolved_klass_at_offset(r4, r3, r4, rscratch1); |
3422 __ ldr(r4, Address(r4, sizeof(ConstantPool))); |
|
3423 |
3422 |
3424 // make sure klass is initialized & doesn't have finalizer |
3423 // make sure klass is initialized & doesn't have finalizer |
3425 // make sure klass is fully initialized |
3424 // make sure klass is fully initialized |
3426 __ ldrb(rscratch1, Address(r4, InstanceKlass::init_state_offset())); |
3425 __ ldrb(rscratch1, Address(r4, InstanceKlass::init_state_offset())); |
3427 __ cmp(rscratch1, InstanceKlass::fully_initialized); |
3426 __ cmp(rscratch1, InstanceKlass::fully_initialized); |
3570 __ b(resolved); |
3569 __ b(resolved); |
3571 |
3570 |
3572 // Get superklass in r0 and subklass in r3 |
3571 // Get superklass in r0 and subklass in r3 |
3573 __ bind(quicked); |
3572 __ bind(quicked); |
3574 __ mov(r3, r0); // Save object in r3; r0 needed for subtype check |
3573 __ mov(r3, r0); // Save object in r3; r0 needed for subtype check |
3575 __ lea(r0, Address(r2, r19, Address::lsl(3))); |
3574 __ load_resolved_klass_at_offset(r2, r19, r0, rscratch1); // r0 = klass |
3576 __ ldr(r0, Address(r0, sizeof(ConstantPool))); |
|
3577 |
3575 |
3578 __ bind(resolved); |
3576 __ bind(resolved); |
3579 __ load_klass(r19, r3); |
3577 __ load_klass(r19, r3); |
3580 |
3578 |
3581 // Generate subtype check. Blows r2, r5. Object in r3. |
3579 // Generate subtype check. Blows r2, r5. Object in r3. |
3627 __ b(resolved); |
3625 __ b(resolved); |
3628 |
3626 |
3629 // Get superklass in r0 and subklass in r3 |
3627 // Get superklass in r0 and subklass in r3 |
3630 __ bind(quicked); |
3628 __ bind(quicked); |
3631 __ load_klass(r3, r0); |
3629 __ load_klass(r3, r0); |
3632 __ lea(r0, Address(r2, r19, Address::lsl(3))); |
3630 __ load_resolved_klass_at_offset(r2, r19, r0, rscratch1); |
3633 __ ldr(r0, Address(r0, sizeof(ConstantPool))); |
|
3634 |
3631 |
3635 __ bind(resolved); |
3632 __ bind(resolved); |
3636 |
3633 |
3637 // Generate subtype check. Blows r2, r5 |
3634 // Generate subtype check. Blows r2, r5 |
3638 // Superklass in r0. Subklass in r3. |
3635 // Superklass in r0. Subklass in r3. |