hotspot/src/cpu/aarch64/vm/templateTable_aarch64.cpp
changeset 46488 01c282163d38
parent 45115 e3a622b2b7db
parent 46465 bda4a36cebb6
child 46538 44ea5e0f2901
equal deleted inserted replaced
45171:44927fb4cd60 46488:01c282163d38
     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.