hotspot/src/cpu/aarch64/vm/templateTable_aarch64.cpp
changeset 46427 54713555867e
parent 41688 230f8c29f67b
child 46465 bda4a36cebb6
equal deleted inserted replaced
46426:02a1fc064144 46427:54713555867e
     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
  3370   __ ldarb(rscratch1, rscratch1);
  3370   __ ldarb(rscratch1, rscratch1);
  3371   __ cmp(rscratch1, JVM_CONSTANT_Class);
  3371   __ cmp(rscratch1, JVM_CONSTANT_Class);
  3372   __ br(Assembler::NE, slow_case);
  3372   __ br(Assembler::NE, slow_case);
  3373 
  3373 
  3374   // get InstanceKlass
  3374   // get InstanceKlass
  3375   __ lea(r4, Address(r4, r3, Address::lsl(3)));
  3375   __ load_resolved_klass_at_offset(r4, r3, r4, rscratch1);
  3376   __ ldr(r4, Address(r4, sizeof(ConstantPool)));
       
  3377 
  3376 
  3378   // make sure klass is initialized & doesn't have finalizer
  3377   // make sure klass is initialized & doesn't have finalizer
  3379   // make sure klass is fully initialized
  3378   // make sure klass is fully initialized
  3380   __ ldrb(rscratch1, Address(r4, InstanceKlass::init_state_offset()));
  3379   __ ldrb(rscratch1, Address(r4, InstanceKlass::init_state_offset()));
  3381   __ cmp(rscratch1, InstanceKlass::fully_initialized);
  3380   __ cmp(rscratch1, InstanceKlass::fully_initialized);
  3524   __ b(resolved);
  3523   __ b(resolved);
  3525 
  3524 
  3526   // Get superklass in r0 and subklass in r3
  3525   // Get superklass in r0 and subklass in r3
  3527   __ bind(quicked);
  3526   __ bind(quicked);
  3528   __ mov(r3, r0); // Save object in r3; r0 needed for subtype check
  3527   __ mov(r3, r0); // Save object in r3; r0 needed for subtype check
  3529   __ lea(r0, Address(r2, r19, Address::lsl(3)));
  3528   __ load_resolved_klass_at_offset(r2, r19, r0, rscratch1); // r0 = klass
  3530   __ ldr(r0, Address(r0, sizeof(ConstantPool)));
       
  3531 
  3529 
  3532   __ bind(resolved);
  3530   __ bind(resolved);
  3533   __ load_klass(r19, r3);
  3531   __ load_klass(r19, r3);
  3534 
  3532 
  3535   // Generate subtype check.  Blows r2, r5.  Object in r3.
  3533   // Generate subtype check.  Blows r2, r5.  Object in r3.
  3581   __ b(resolved);
  3579   __ b(resolved);
  3582 
  3580 
  3583   // Get superklass in r0 and subklass in r3
  3581   // Get superklass in r0 and subklass in r3
  3584   __ bind(quicked);
  3582   __ bind(quicked);
  3585   __ load_klass(r3, r0);
  3583   __ load_klass(r3, r0);
  3586   __ lea(r0, Address(r2, r19, Address::lsl(3)));
  3584   __ load_resolved_klass_at_offset(r2, r19, r0, rscratch1);
  3587   __ ldr(r0, Address(r0, sizeof(ConstantPool)));
       
  3588 
  3585 
  3589   __ bind(resolved);
  3586   __ bind(resolved);
  3590 
  3587 
  3591   // Generate subtype check.  Blows r2, r5
  3588   // Generate subtype check.  Blows r2, r5
  3592   // Superklass in r0.  Subklass in r3.
  3589   // Superklass in r0.  Subklass in r3.