# Copyright (C) 2017 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

.class public LSmaliTests;
.super Ljava/lang/Object;

# static fields
.field public static booleanField:Z

.method static constructor <clinit>()V
    .registers 1

    .prologue
    const/4 v0, 0x1

    # booleanField = true
    sput-boolean v0, LSmaliTests;->booleanField:Z

    return-void
.end method

##  CHECK-START: byte SmaliTests.booleanToByte(boolean) builder (after)
##  CHECK:         <<Arg:z\d+>>           ParameterValue
##  CHECK-DAG:     <<Zero:i\d+>>          IntConstant 0
##  CHECK-DAG:     <<One:i\d+>>           IntConstant 1
##  CHECK-DAG:     <<Cond:z\d+>>          Equal [<<Arg>>,<<Zero>>]
##  CHECK-DAG:                            If [<<Cond>>]
##  CHECK-DAG:     <<Phi:i\d+>>           Phi [<<One>>,<<Zero>>]
##  CHECK-DAG:     <<IToS:b\d+>>          TypeConversion [<<Phi>>]
##  CHECK-DAG:                            Return [<<IToS>>]

##  CHECK-START: byte SmaliTests.booleanToByte(boolean) select_generator (after)
##  CHECK:         <<Arg:z\d+>>           ParameterValue
##  CHECK-DAG:     <<Zero:i\d+>>          IntConstant 0
##  CHECK-DAG:     <<One:i\d+>>           IntConstant 1
##  CHECK-DAG:     <<Sel:i\d+>>           Select [<<Zero>>,<<One>>,<<Arg>>]
##  CHECK-DAG:     <<IToS:b\d+>>          TypeConversion [<<Sel>>]
##  CHECK-DAG:                            Return [<<IToS>>]

##  CHECK-START: byte SmaliTests.booleanToByte(boolean) instruction_simplifier$after_bce (after)
##  CHECK:         <<Arg:z\d+>>           ParameterValue
##  CHECK-DAG:                            Return [<<Arg>>]
.method static booleanToByte(Z)B
    .registers 2
    if-eqz p0, :cond_5
    const/4 v0, 0x1

    :goto_3
    int-to-byte v0, v0
    return v0

    :cond_5
    const/4 v0, 0x0
    goto :goto_3
.end method

##  CHECK-START: short SmaliTests.booleanToShort(boolean) builder (after)
##  CHECK:         <<Arg:z\d+>>           ParameterValue
##  CHECK-DAG:     <<Zero:i\d+>>          IntConstant 0
##  CHECK-DAG:     <<One:i\d+>>           IntConstant 1
##  CHECK-DAG:     <<Cond:z\d+>>          Equal [<<Arg>>,<<Zero>>]
##  CHECK-DAG:                            If [<<Cond>>]
##  CHECK-DAG:     <<Phi:i\d+>>           Phi [<<One>>,<<Zero>>]
##  CHECK-DAG:     <<IToS:s\d+>>          TypeConversion [<<Phi>>]
##  CHECK-DAG:                            Return [<<IToS>>]

##  CHECK-START: short SmaliTests.booleanToShort(boolean) select_generator (after)
##  CHECK:         <<Arg:z\d+>>           ParameterValue
##  CHECK-DAG:     <<Zero:i\d+>>          IntConstant 0
##  CHECK-DAG:     <<One:i\d+>>           IntConstant 1
##  CHECK-DAG:     <<Sel:i\d+>>           Select [<<Zero>>,<<One>>,<<Arg>>]
##  CHECK-DAG:     <<IToS:s\d+>>          TypeConversion [<<Sel>>]
##  CHECK-DAG:                            Return [<<IToS>>]

##  CHECK-START: short SmaliTests.booleanToShort(boolean) instruction_simplifier$after_bce (after)
##  CHECK:         <<Arg:z\d+>>           ParameterValue
##  CHECK-DAG:                            Return [<<Arg>>]
.method static booleanToShort(Z)S
    .registers 2
    if-eqz p0, :cond_5
    const/4 v0, 0x1

    :goto_3
    int-to-short v0, v0
    return v0

    :cond_5
    const/4 v0, 0x0
    goto :goto_3
.end method

##  CHECK-START: char SmaliTests.booleanToChar(boolean) builder (after)
##  CHECK:         <<Arg:z\d+>>           ParameterValue
##  CHECK-DAG:     <<Zero:i\d+>>          IntConstant 0
##  CHECK-DAG:     <<One:i\d+>>           IntConstant 1
##  CHECK-DAG:     <<Cond:z\d+>>          Equal [<<Arg>>,<<Zero>>]
##  CHECK-DAG:                            If [<<Cond>>]
##  CHECK-DAG:     <<Phi:i\d+>>           Phi [<<One>>,<<Zero>>]
##  CHECK-DAG:     <<IToC:c\d+>>          TypeConversion [<<Phi>>]
##  CHECK-DAG:                            Return [<<IToC>>]

##  CHECK-START: char SmaliTests.booleanToChar(boolean) select_generator (after)
##  CHECK:         <<Arg:z\d+>>           ParameterValue
##  CHECK-DAG:     <<Zero:i\d+>>          IntConstant 0
##  CHECK-DAG:     <<One:i\d+>>           IntConstant 1
##  CHECK-DAG:     <<Sel:i\d+>>           Select [<<Zero>>,<<One>>,<<Arg>>]
##  CHECK-DAG:     <<IToC:c\d+>>          TypeConversion [<<Sel>>]
##  CHECK-DAG:                            Return [<<IToC>>]

##  CHECK-START: char SmaliTests.booleanToChar(boolean) instruction_simplifier$after_bce (after)
##  CHECK:         <<Arg:z\d+>>           ParameterValue
##  CHECK-DAG:                            Return [<<Arg>>]
.method static booleanToChar(Z)C
    .registers 2
    if-eqz p0, :cond_5
    const/4 v0, 0x1

    :goto_3
    int-to-char v0, v0
    return v0

    :cond_5
    const/4 v0, 0x0
    goto :goto_3
.end method

##  CHECK-START: int SmaliTests.booleanToInt(boolean) builder (after)
##  CHECK:         <<Arg:z\d+>>           ParameterValue
##  CHECK-DAG:     <<Zero:i\d+>>          IntConstant 0
##  CHECK-DAG:     <<One:i\d+>>           IntConstant 1
##  CHECK-DAG:     <<Cond:z\d+>>          Equal [<<Arg>>,<<Zero>>]
##  CHECK-DAG:                            If [<<Cond>>]
##  CHECK-DAG:     <<Phi:i\d+>>           Phi [<<One>>,<<Zero>>]
##  CHECK-DAG:                            Return [<<Phi>>]

##  CHECK-START: int SmaliTests.booleanToInt(boolean) select_generator (after)
##  CHECK:         <<Arg:z\d+>>           ParameterValue
##  CHECK-DAG:     <<Zero:i\d+>>          IntConstant 0
##  CHECK-DAG:     <<One:i\d+>>           IntConstant 1
##  CHECK-DAG:     <<Sel:i\d+>>           Select [<<Zero>>,<<One>>,<<Arg>>]
##  CHECK-DAG:                            Return [<<Sel>>]

##  CHECK-START: int SmaliTests.booleanToInt(boolean) instruction_simplifier$after_bce (after)
##  CHECK:         <<Arg:z\d+>>           ParameterValue
##  CHECK-DAG:                            Return [<<Arg>>]
.method static booleanToInt(Z)I
    .registers 2
    if-eqz p0, :cond_4
    const/4 v0, 0x1

    :goto_3
    return v0

    :cond_4
    const/4 v0, 0x0
    goto :goto_3
.end method

## CHECK-START: long SmaliTests.booleanToLong(boolean) builder (after)
## CHECK-DAG:     <<Arg:z\d+>>           ParameterValue
## CHECK-DAG:     <<Zero:i\d+>>          IntConstant 0
## CHECK-DAG:     <<One:i\d+>>           IntConstant 1
## CHECK-DAG:     <<Cond:z\d+>>          Equal [<<Arg>>,<<Zero>>]
## CHECK-DAG:                            If [<<Cond>>]
## CHECK-DAG:     <<Phi:i\d+>>           Phi [<<One>>,<<Zero>>]
## CHECK-DAG:     <<IToJ:j\d+>>          TypeConversion [<<Phi>>]
## CHECK-DAG:                            Return [<<IToJ>>]

## CHECK-START: long SmaliTests.booleanToLong(boolean) select_generator (after)
## CHECK-DAG:     <<Arg:z\d+>>           ParameterValue
## CHECK-DAG:     <<Zero:i\d+>>          IntConstant 0
## CHECK-DAG:     <<One:i\d+>>           IntConstant 1
## CHECK-DAG:     <<Sel:i\d+>>           Select [<<Zero>>,<<One>>,<<Arg>>]
## CHECK-DAG:     <<IToJ:j\d+>>          TypeConversion [<<Sel>>]
## CHECK-DAG:                            Return [<<IToJ>>]

## CHECK-START: long SmaliTests.booleanToLong(boolean) instruction_simplifier$after_bce (after)
## CHECK-DAG:     <<Arg:z\d+>>           ParameterValue
## CHECK-DAG:     <<ZToJ:j\d+>>          TypeConversion [<<Arg>>]
## CHECK-DAG:                            Return [<<ZToJ>>]
.method public static booleanToLong(Z)J
    .registers 3
    .param p0, "b"    # Z
    .prologue

    # return b ? 1 : 0;
    if-eqz p0, :b_is_zero

# :b_is_one
    const/4 v0, 0x1

  :l_return
    int-to-long v0, v0
    return-wide v0

  :b_is_zero
    const/4 v0, 0x0
    goto :l_return
.end method

## CHECK-START: int SmaliTests.longToIntOfBoolean() builder (after)
## CHECK-DAG:     <<Sget:z\d+>>          StaticFieldGet
## CHECK-DAG:     <<ZToJ:j\d+>>          InvokeStaticOrDirect [<<Sget>>{{(,[ij]\d+)?}}]
## CHECK-DAG:     <<JToI:i\d+>>          TypeConversion [<<ZToJ>>]
## CHECK-DAG:                            Return [<<JToI>>]

## CHECK-START: int SmaliTests.longToIntOfBoolean() inliner (after)
## CHECK-DAG:     <<Zero:i\d+>>          IntConstant 0
## CHECK-DAG:     <<One:i\d+>>           IntConstant 1
## CHECK-DAG:     <<Sget:z\d+>>          StaticFieldGet
## CHECK-DAG:                            If [<<Sget>>]
## CHECK-DAG:     <<Phi:i\d+>>           Phi [<<One>>,<<Zero>>]
## CHECK-DAG:     <<IToJ:j\d+>>          TypeConversion [<<Phi>>]
## CHECK-DAG:     <<JToI:i\d+>>          TypeConversion [<<IToJ>>]
## CHECK-DAG:                            Return [<<JToI>>]

## CHECK-START: int SmaliTests.longToIntOfBoolean() select_generator (after)
## CHECK-DAG:     <<Zero:i\d+>>          IntConstant 0
## CHECK-DAG:     <<One:i\d+>>           IntConstant 1
## CHECK-DAG:     <<Sget:z\d+>>          StaticFieldGet
## CHECK-DAG:     <<Sel:i\d+>>           Select [<<Zero>>,<<One>>,<<Sget>>]
## CHECK-DAG:                            Return [<<Sel>>]

## CHECK-START: int SmaliTests.longToIntOfBoolean() instruction_simplifier$after_bce (after)
## CHECK-DAG:     <<Sget:z\d+>>          StaticFieldGet
## CHECK-DAG:                            Return [<<Sget>>]
.method public static longToIntOfBoolean()I
    .registers 3
    .prologue

    # long l = booleanToLong(booleanField);
    sget-boolean v2, LSmaliTests;->booleanField:Z
    invoke-static {v2}, LSmaliTests;->booleanToLong(Z)J
    move-result-wide v0

    # return (int) l;
    long-to-int v2, v0
    return v2
.end method
