Clean up interface check cast

Changed arm, arm64 to use less labels and removed forward branch
in the success case.

Cleaned up X86, X86_64 to remove the is_null label.

Bug: 12687968
Bug: 32577579

Test: test-art-host, test-art-target CC
Change-Id: Iba426dff548b2ef42198fad13efeb075f7c724a7
diff --git a/compiler/optimizing/code_generator_arm.cc b/compiler/optimizing/code_generator_arm.cc
index 7c72d00..046c2d8 100644
--- a/compiler/optimizing/code_generator_arm.cc
+++ b/compiler/optimizing/code_generator_arm.cc
@@ -6470,30 +6470,26 @@
                                         iftable_offset,
                                         maybe_temp2_loc,
                                         kWithoutReadBarrier);
-      Label is_null;
       // Null iftable means it is empty and will always fail the check.
-      // Not cbz since the temp may not be a low register.
-      __ CompareAndBranchIfZero(temp, &is_null);
+      __ CompareAndBranchIfZero(temp, type_check_slow_path->GetEntryLabel());
 
       // Loop through the iftable and check if any class matches.
       __ ldr(maybe_temp2_loc.AsRegister<Register>(), Address(temp, array_length_offset));
 
       Label start_loop;
       __ Bind(&start_loop);
+      __ CompareAndBranchIfZero(maybe_temp2_loc.AsRegister<Register>(),
+                                type_check_slow_path->GetEntryLabel());
       __ ldr(maybe_temp3_loc.AsRegister<Register>(), Address(temp, object_array_data_offset));
       __ MaybeUnpoisonHeapReference(maybe_temp3_loc.AsRegister<Register>());
-      __ cmp(cls, ShifterOperand(maybe_temp3_loc.AsRegister<Register>()));
-      __ b(&done, EQ);  // Return if same class.
       // Go to next interface.
       __ add(temp, temp, ShifterOperand(2 * kHeapReferenceSize));
       __ sub(maybe_temp2_loc.AsRegister<Register>(),
              maybe_temp2_loc.AsRegister<Register>(),
              ShifterOperand(2));
-      // Not cbnz since the temp may not be a low register.
-      __ CompareAndBranchIfNonZero(maybe_temp2_loc.AsRegister<Register>(), &start_loop);
-      __ Bind(&is_null);
-
-      __ b(type_check_slow_path->GetEntryLabel());
+      // Compare the classes and continue the loop if they do not match.
+      __ cmp(cls, ShifterOperand(maybe_temp3_loc.AsRegister<Register>()));
+      __ b(&start_loop, NE);
       break;
     }
   }
diff --git a/compiler/optimizing/code_generator_arm64.cc b/compiler/optimizing/code_generator_arm64.cc
index 35b1605..a085fea 100644
--- a/compiler/optimizing/code_generator_arm64.cc
+++ b/compiler/optimizing/code_generator_arm64.cc
@@ -3782,26 +3782,23 @@
                                         iftable_offset,
                                         maybe_temp2_loc,
                                         kWithoutReadBarrier);
-      vixl::aarch64::Label is_null;
       // Null iftable means it is empty and will always fail the check.
-      __ Cbz(temp, &is_null);
+      __ Cbz(temp, type_check_slow_path->GetEntryLabel());
 
       // Loop through the iftable and check if any class matches.
       __ Ldr(WRegisterFrom(maybe_temp2_loc), HeapOperand(temp.W(), array_length_offset));
 
       vixl::aarch64::Label start_loop;
       __ Bind(&start_loop);
+      __ Cbz(WRegisterFrom(maybe_temp2_loc), type_check_slow_path->GetEntryLabel());
       __ Ldr(WRegisterFrom(maybe_temp3_loc), HeapOperand(temp.W(), object_array_data_offset));
       GetAssembler()->MaybeUnpoisonHeapReference(WRegisterFrom(maybe_temp3_loc));
-      __ Cmp(cls, WRegisterFrom(maybe_temp3_loc));
-      __ B(eq, &done);  // Return if same class.
       // Go to next interface.
       __ Add(temp, temp, 2 * kHeapReferenceSize);
       __ Sub(WRegisterFrom(maybe_temp2_loc), WRegisterFrom(maybe_temp2_loc), 2);
-      __ Cbnz(WRegisterFrom(maybe_temp2_loc), &start_loop);
-      __ Bind(&is_null);
-
-      __ B(type_check_slow_path->GetEntryLabel());
+      // Compare the classes and continue the loop if they do not match.
+      __ Cmp(cls, WRegisterFrom(maybe_temp3_loc));
+      __ B(ne, &start_loop);
       break;
     }
   }
diff --git a/compiler/optimizing/code_generator_x86.cc b/compiler/optimizing/code_generator_x86.cc
index 2a9e21d..45edff8 100644
--- a/compiler/optimizing/code_generator_x86.cc
+++ b/compiler/optimizing/code_generator_x86.cc
@@ -6833,10 +6833,9 @@
                                           temp_loc,
                                           iftable_offset,
                                           kWithoutReadBarrier);
-        NearLabel is_null;
         // Null iftable means it is empty.
         __ testl(temp, temp);
-        __ j(kZero, &is_null);
+        __ j(kZero, type_check_slow_path->GetEntryLabel());
 
         // Loop through the iftable and check if any class matches.
         __ movl(maybe_temp2_loc.AsRegister<Register>(), Address(temp, array_length_offset));
@@ -6849,7 +6848,6 @@
         __ addl(temp, Immediate(2 * kHeapReferenceSize));
         __ subl(maybe_temp2_loc.AsRegister<Register>(), Immediate(2));
         __ j(kNotZero, &start_loop);
-        __ Bind(&is_null);
       }
 
       __ jmp(type_check_slow_path->GetEntryLabel());
diff --git a/compiler/optimizing/code_generator_x86_64.cc b/compiler/optimizing/code_generator_x86_64.cc
index cb89e50..f7a2f40 100644
--- a/compiler/optimizing/code_generator_x86_64.cc
+++ b/compiler/optimizing/code_generator_x86_64.cc
@@ -6243,10 +6243,9 @@
                                           temp_loc,
                                           iftable_offset,
                                           kWithoutReadBarrier);
-        NearLabel is_null;
         // Null iftable means it is empty.
         __ testl(temp, temp);
-        __ j(kZero, &is_null);
+        __ j(kZero, type_check_slow_path->GetEntryLabel());
 
         // Loop through the iftable and check if any class matches.
         __ movl(maybe_temp2_loc.AsRegister<CpuRegister>(), Address(temp, array_length_offset));
@@ -6259,7 +6258,6 @@
         __ addl(temp, Immediate(2 * kHeapReferenceSize));
         __ subl(maybe_temp2_loc.AsRegister<CpuRegister>(), Immediate(2));
         __ j(kNotZero, &start_loop);
-        __ Bind(&is_null);
       }
       __ jmp(type_check_slow_path->GetEntryLabel());
       break;