1# Copyright (C) 2016 The Android Open Source Project
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7#      http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
15.class public LMain2;
16.super Ljava/lang/Object;
17
18## CHECK-START: int Main2.rotateLeftBoolean(boolean, int) builder (after)
19## CHECK:         <<ArgVal:z\d+>>  ParameterValue
20## CHECK:         <<ArgDist:i\d+>> ParameterValue
21## CHECK-DAG:     <<Zero:i\d+>>    IntConstant 0
22## CHECK-DAG:     <<One:i\d+>>     IntConstant 1
23## CHECK-DAG:     <<Val:i\d+>>     Phi [<<One>>,<<Zero>>]
24## CHECK-DAG:     <<Result:i\d+>>  InvokeStaticOrDirect [<<Val>>,<<ArgDist>>{{(,[ij]\d+)?}}] intrinsic:IntegerRotateLeft
25## CHECK-DAG:                      Return [<<Result>>]
26
27## CHECK-START: int Main2.rotateLeftBoolean(boolean, int) instruction_simplifier (after)
28## CHECK:         <<ArgVal:z\d+>>  ParameterValue
29## CHECK:         <<ArgDist:i\d+>> ParameterValue
30## CHECK-DAG:     <<Zero:i\d+>>    IntConstant 0
31## CHECK-DAG:     <<One:i\d+>>     IntConstant 1
32## CHECK-DAG:     <<Val:i\d+>>     Phi [<<One>>,<<Zero>>]
33## CHECK-DAG:     <<NegDist:i\d+>> Neg [<<ArgDist>>]
34## CHECK-DAG:     <<Result:i\d+>>  Ror [<<Val>>,<<NegDist>>]
35## CHECK-DAG:                      Return [<<Result>>]
36
37## CHECK-START: int Main2.rotateLeftBoolean(boolean, int) instruction_simplifier (after)
38## CHECK-NOT:                      InvokeStaticOrDirect
39
40## CHECK-START: int Main2.rotateLeftBoolean(boolean, int) select_generator (after)
41## CHECK:         <<ArgVal:z\d+>>  ParameterValue
42## CHECK:         <<ArgDist:i\d+>> ParameterValue
43## CHECK-DAG:     <<Zero:i\d+>>    IntConstant 0
44## CHECK-DAG:     <<One:i\d+>>     IntConstant 1
45## CHECK-DAG:     <<SelVal:i\d+>>  Select [<<Zero>>,<<One>>,<<ArgVal>>]
46## CHECK-DAG:     <<NegDist:i\d+>> Neg [<<ArgDist>>]
47## CHECK-DAG:     <<Result:i\d+>>  Ror [<<SelVal>>,<<NegDist>>]
48## CHECK-DAG:                      Return [<<Result>>]
49
50## CHECK-START: int Main2.rotateLeftBoolean(boolean, int) select_generator (after)
51## CHECK-NOT:                      Phi
52
53## CHECK-START: int Main2.rotateLeftBoolean(boolean, int) instruction_simplifier$after_bce (after)
54## CHECK:         <<ArgVal:z\d+>>  ParameterValue
55## CHECK:         <<ArgDist:i\d+>> ParameterValue
56## CHECK-DAG:     <<NegDist:i\d+>> Neg [<<ArgDist>>]
57## CHECK-DAG:     <<Result:i\d+>>  Ror [<<ArgVal>>,<<NegDist>>]
58## CHECK-DAG:                      Return [<<Result>>]
59
60## CHECK-START: int Main2.rotateLeftBoolean(boolean, int) instruction_simplifier$after_bce (after)
61## CHECK-NOT:                      Select
62
63# Original java source
64#
65#     private static int rotateLeftBoolean(boolean value, int distance) {
66#       return Integer.rotateLeft(value ? 1 : 0, distance);
67#     }
68
69.method public static rotateLeftBoolean(ZI)I
70    .registers 3
71    .param p0, "value"    # Z
72    .param p1, "distance"    # I
73
74    .prologue
75    .line 66
76    if-eqz p0, :cond_8
77
78    const/4 v0, 0x1
79
80    :goto_3
81    invoke-static {v0, p1}, Ljava/lang/Integer;->rotateLeft(II)I
82
83    move-result v0
84
85    return v0
86
87    :cond_8
88    const/4 v0, 0x0
89
90    goto :goto_3
91.end method
92
93## CHECK-START: int Main2.rotateRightBoolean(boolean, int) builder (after)
94## CHECK:         <<ArgVal:z\d+>>  ParameterValue
95## CHECK:         <<ArgDist:i\d+>> ParameterValue
96## CHECK-DAG:     <<Zero:i\d+>>    IntConstant 0
97## CHECK-DAG:     <<One:i\d+>>     IntConstant 1
98## CHECK-DAG:     <<Val:i\d+>>     Phi [<<One>>,<<Zero>>]
99## CHECK-DAG:     <<Result:i\d+>>  InvokeStaticOrDirect [<<Val>>,<<ArgDist>>{{(,[ij]\d+)?}}] intrinsic:IntegerRotateRight
100## CHECK-DAG:                      Return [<<Result>>]
101
102## CHECK-START: int Main2.rotateRightBoolean(boolean, int) instruction_simplifier (after)
103## CHECK:         <<ArgVal:z\d+>>  ParameterValue
104## CHECK:         <<ArgDist:i\d+>> ParameterValue
105## CHECK-DAG:     <<Zero:i\d+>>    IntConstant 0
106## CHECK-DAG:     <<One:i\d+>>     IntConstant 1
107## CHECK-DAG:     <<Val:i\d+>>     Phi [<<One>>,<<Zero>>]
108## CHECK-DAG:     <<Result:i\d+>>  Ror [<<Val>>,<<ArgDist>>]
109## CHECK-DAG:                      Return [<<Result>>]
110
111## CHECK-START: int Main2.rotateRightBoolean(boolean, int) instruction_simplifier (after)
112## CHECK-NOT:                      InvokeStaticOrDirect
113
114## CHECK-START: int Main2.rotateRightBoolean(boolean, int) select_generator (after)
115## CHECK:         <<ArgVal:z\d+>>  ParameterValue
116## CHECK:         <<ArgDist:i\d+>> ParameterValue
117## CHECK-DAG:     <<Zero:i\d+>>    IntConstant 0
118## CHECK-DAG:     <<One:i\d+>>     IntConstant 1
119## CHECK-DAG:     <<SelVal:i\d+>>  Select [<<Zero>>,<<One>>,<<ArgVal>>]
120## CHECK-DAG:     <<Result:i\d+>>  Ror [<<SelVal>>,<<ArgDist>>]
121## CHECK-DAG:                      Return [<<Result>>]
122
123## CHECK-START: int Main2.rotateRightBoolean(boolean, int) select_generator (after)
124## CHECK-NOT:                     Phi
125
126## CHECK-START: int Main2.rotateRightBoolean(boolean, int) instruction_simplifier$after_bce (after)
127## CHECK:         <<ArgVal:z\d+>>  ParameterValue
128## CHECK:         <<ArgDist:i\d+>> ParameterValue
129## CHECK-DAG:     <<Result:i\d+>>  Ror [<<ArgVal>>,<<ArgDist>>]
130## CHECK-DAG:                      Return [<<Result>>]
131
132## CHECK-START: int Main2.rotateRightBoolean(boolean, int) instruction_simplifier$after_bce (after)
133## CHECK-NOT:                     Select
134
135# Original java source:
136#
137#     private static int rotateRightBoolean(boolean value, int distance) {
138#       return Integer.rotateRight(value ? 1 : 0, distance);
139#     }
140
141.method public static rotateRightBoolean(ZI)I
142    .registers 3
143    .param p0, "value"    # Z
144    .param p1, "distance"    # I
145
146    .prologue
147    .line 219
148    if-eqz p0, :cond_8
149
150    const/4 v0, 0x1
151
152    :goto_3
153    invoke-static {v0, p1}, Ljava/lang/Integer;->rotateRight(II)I
154
155    move-result v0
156
157    return v0
158
159    :cond_8
160    const/4 v0, 0x0
161
162    goto :goto_3
163.end method
164