1*795d594fSAndroid Build Coastguard Worker# Copyright (C) 2015 The Android Open Source Project 2*795d594fSAndroid Build Coastguard Worker# 3*795d594fSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 4*795d594fSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 5*795d594fSAndroid Build Coastguard Worker# You may obtain a copy of the License at 6*795d594fSAndroid Build Coastguard Worker# 7*795d594fSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 8*795d594fSAndroid Build Coastguard Worker# 9*795d594fSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*795d594fSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 11*795d594fSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*795d594fSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 13*795d594fSAndroid Build Coastguard Worker# limitations under the License. 14*795d594fSAndroid Build Coastguard Worker 15*795d594fSAndroid Build Coastguard Worker.class public LRegisterAllocator; 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker.super Ljava/lang/Object; 18*795d594fSAndroid Build Coastguard Worker 19*795d594fSAndroid Build Coastguard Worker# Test that catch phis are allocated to a stack slot, and that equivalent catch 20*795d594fSAndroid Build Coastguard Worker# phis are allocated to the same stack slot. 21*795d594fSAndroid Build Coastguard Worker 22*795d594fSAndroid Build Coastguard Worker## CHECK-START: int RegisterAllocator.testEquivalentCatchPhiSlot_Single(int, int, int) register (after) 23*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Phi reg:0 is_catch_phi:true locations:{{\[.*\]}}-><<SlotA1:\d+>>(sp) 24*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Phi reg:0 is_catch_phi:true locations:{{\[.*\]}}-><<SlotA2:\d+>>(sp) 25*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Phi reg:1 is_catch_phi:true locations:{{\[.*\]}}-><<SlotB:\d+>>(sp) 26*795d594fSAndroid Build Coastguard Worker## CHECK-EVAL: <<SlotA1>> == <<SlotA2>> 27*795d594fSAndroid Build Coastguard Worker## CHECK-EVAL: <<SlotB>> != <<SlotA1>> 28*795d594fSAndroid Build Coastguard Worker 29*795d594fSAndroid Build Coastguard Worker.method public static testEquivalentCatchPhiSlot_Single(III)I 30*795d594fSAndroid Build Coastguard Worker .registers 8 31*795d594fSAndroid Build Coastguard Worker 32*795d594fSAndroid Build Coastguard Worker :try_start 33*795d594fSAndroid Build Coastguard Worker const/high16 v0, 0x40000000 # float 2 34*795d594fSAndroid Build Coastguard Worker move v1, p0 35*795d594fSAndroid Build Coastguard Worker div-int/2addr p0, p1 36*795d594fSAndroid Build Coastguard Worker 37*795d594fSAndroid Build Coastguard Worker const/high16 v0, 0x41000000 # float 8 38*795d594fSAndroid Build Coastguard Worker move v1, p1 39*795d594fSAndroid Build Coastguard Worker div-int/2addr p0, p2 40*795d594fSAndroid Build Coastguard Worker goto :return 41*795d594fSAndroid Build Coastguard Worker :try_end 42*795d594fSAndroid Build Coastguard Worker .catchall {:try_start .. :try_end} :catch_all 43*795d594fSAndroid Build Coastguard Worker 44*795d594fSAndroid Build Coastguard Worker :catch_all 45*795d594fSAndroid Build Coastguard Worker # 2x CatchPhi for v0, 1x for v1 46*795d594fSAndroid Build Coastguard Worker if-eqz v1, :use_as_float 47*795d594fSAndroid Build Coastguard Worker 48*795d594fSAndroid Build Coastguard Worker :use_as_int 49*795d594fSAndroid Build Coastguard Worker goto :return 50*795d594fSAndroid Build Coastguard Worker 51*795d594fSAndroid Build Coastguard Worker :use_as_float 52*795d594fSAndroid Build Coastguard Worker float-to-int v0, v0 53*795d594fSAndroid Build Coastguard Worker 54*795d594fSAndroid Build Coastguard Worker :return 55*795d594fSAndroid Build Coastguard Worker return v0 56*795d594fSAndroid Build Coastguard Worker.end method 57*795d594fSAndroid Build Coastguard Worker 58*795d594fSAndroid Build Coastguard Worker# Test that wide catch phis are allocated to two stack slots. 59*795d594fSAndroid Build Coastguard Worker 60*795d594fSAndroid Build Coastguard Worker## CHECK-START: long RegisterAllocator.testEquivalentCatchPhiSlot_Wide(int, int, int) register (after) 61*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Phi reg:0 is_catch_phi:true locations:{{\[.*\]}}->2x<<SlotB1:\d+>>(sp) 62*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Phi reg:0 is_catch_phi:true locations:{{\[.*\]}}->2x<<SlotB2:\d+>>(sp) 63*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Phi reg:2 is_catch_phi:true locations:{{\[.*\]}}-><<SlotA:\d+>>(sp) 64*795d594fSAndroid Build Coastguard Worker## CHECK-EVAL: <<SlotB1>> == <<SlotB2>> 65*795d594fSAndroid Build Coastguard Worker## CHECK-EVAL: abs(<<SlotA>> - <<SlotB1>>) >= 8 66*795d594fSAndroid Build Coastguard Worker 67*795d594fSAndroid Build Coastguard Worker.method public static testEquivalentCatchPhiSlot_Wide(III)J 68*795d594fSAndroid Build Coastguard Worker .registers 8 69*795d594fSAndroid Build Coastguard Worker 70*795d594fSAndroid Build Coastguard Worker :try_start 71*795d594fSAndroid Build Coastguard Worker const-wide/high16 v0, 0x4000000000000000L # double 2 72*795d594fSAndroid Build Coastguard Worker move v2, p0 73*795d594fSAndroid Build Coastguard Worker div-int/2addr p0, p1 74*795d594fSAndroid Build Coastguard Worker 75*795d594fSAndroid Build Coastguard Worker const-wide/high16 v0, 0x4100000000000000L # double 8 76*795d594fSAndroid Build Coastguard Worker move v2, p1 77*795d594fSAndroid Build Coastguard Worker div-int/2addr p0, p2 78*795d594fSAndroid Build Coastguard Worker goto :return 79*795d594fSAndroid Build Coastguard Worker :try_end 80*795d594fSAndroid Build Coastguard Worker .catchall {:try_start .. :try_end} :catch_all 81*795d594fSAndroid Build Coastguard Worker 82*795d594fSAndroid Build Coastguard Worker :catch_all 83*795d594fSAndroid Build Coastguard Worker # 2x CatchPhi for v0, 1x for v2 84*795d594fSAndroid Build Coastguard Worker if-eqz v2, :use_as_double 85*795d594fSAndroid Build Coastguard Worker 86*795d594fSAndroid Build Coastguard Worker :use_as_long 87*795d594fSAndroid Build Coastguard Worker goto :return 88*795d594fSAndroid Build Coastguard Worker 89*795d594fSAndroid Build Coastguard Worker :use_as_double 90*795d594fSAndroid Build Coastguard Worker double-to-long v0, v0 91*795d594fSAndroid Build Coastguard Worker 92*795d594fSAndroid Build Coastguard Worker :return 93*795d594fSAndroid Build Coastguard Worker return-wide v0 94*795d594fSAndroid Build Coastguard Worker.end method 95