@@ -1317,6 +1317,60 @@ OopMapSet* Runtime1::generate_code_for(C1StubId id, StubAssembler* sasm) {
13171317 }
13181318 break ;
13191319
1320+ case C1StubId::is_instance_of_id:
1321+ {
1322+ // Mirror: c_rarg0 (Windows: rcx, SysV: rdi)
1323+ // Object: c_rarg1 (Windows: rdx, SysV: rsi)
1324+ // ObjClass: r9
1325+ // Temps: rcx, r8, r10, r11
1326+ // Result: rax
1327+
1328+ Register klass = r9, obj = c_rarg1, result = rax;
1329+ Register temp0 = rcx, temp1 = r8, temp2 = r10, temp3 = r11;
1330+
1331+ // Get the Klass* into r9. c_rarg0 is now dead.
1332+ __ movptr (klass, Address (c_rarg0, java_lang_Class::klass_offset ()));
1333+
1334+ Label done, is_secondary, same;
1335+
1336+ __ xorq (result, result);
1337+ __ testq (klass, klass);
1338+ __ jcc (Assembler::equal, done); // Klass is null
1339+
1340+ __ testq (obj, obj);
1341+ __ jcc (Assembler::equal, done); // obj is null
1342+
1343+ __ movl (temp0, Address (klass, in_bytes (Klass::super_check_offset_offset ())));
1344+ __ cmpl (temp0, in_bytes (Klass::secondary_super_cache_offset ()));
1345+ __ jcc (Assembler::equal, is_secondary); // Klass is a secondary superclass
1346+
1347+ // Klass is a concrete class
1348+ __ load_klass (temp2, obj, /* tmp*/ temp1);
1349+ __ cmpptr (klass, Address (temp2, temp0));
1350+ __ setcc (Assembler::equal, result);
1351+ __ ret (0 );
1352+
1353+ __ bind (is_secondary);
1354+
1355+ __ load_klass (obj, obj, /* tmp*/ temp1);
1356+
1357+ // This is necessary because I am never in my own secondary_super list.
1358+ __ cmpptr (obj, klass);
1359+ __ jcc (Assembler::equal, same);
1360+
1361+ __ lookup_secondary_supers_table_var (obj, klass,
1362+ /* temps*/ temp0, temp1, temp2, temp3,
1363+ result);
1364+ __ testq (result, result);
1365+
1366+ __ bind (same);
1367+ __ setcc (Assembler::equal, result);
1368+
1369+ __ bind (done);
1370+ __ ret (0 );
1371+ }
1372+ break ;
1373+
13201374 case C1StubId::monitorenter_nofpu_id:
13211375 save_fpu_registers = false ;
13221376 // fall through
0 commit comments