| # Copyright (c) 2016, the R8 project authors. Please see the AUTHORS file |
| # for details. All rights reserved. Use of this source code is governed by a |
| # BSD-style license that can be found in the LICENSE file. |
| |
| .class public LTest; |
| |
| .super Ljava/lang/Object; |
| |
| .method static addMinusOne(I)I |
| .locals 1 |
| |
| const/4 v0, -1 |
| add-int v0, p0, v0 |
| return v0 |
| .end method |
| |
| .method static addTwoConstants()I |
| .locals 2 |
| |
| const/4 v0, 1 |
| const/4 v1, 2 |
| add-int v0, v0, v1 |
| return v0 |
| .end method |
| |
| .method static addSameTwoConstants()I |
| .locals 2 |
| |
| const/4 v0, 1 |
| add-int v0, v0, v0 |
| return v0 |
| .end method |
| |
| .method static subMinusOne(I)I |
| .locals 1 |
| |
| const/4 v0, -1 |
| sub-int v0, p0, v0 |
| return v0 |
| .end method |
| |
| .method static subSameTwoConstants()I |
| .locals 2 |
| |
| const/4 v0, 1 |
| sub-int v0, v0, v0 |
| return v0 |
| .end method |
| |
| .method static subtractConstants()I |
| .locals 9 |
| |
| const/4 v0, 0 |
| |
| const v1, 127 # Max 8-bit signed integer. |
| const v2, -128 # Min 8-bit signed integer. |
| const v3, 128 # Max 8-bit signed integer plus one. |
| const v4, -129 # Min 8-bit signed integer minus one. |
| |
| const v5, 32767 # Max 16-bit signed integer. |
| const v6, -32768 # Min 16-bit signed integer. |
| const v7, 32768 # Max 16-bit signed integer plus one. |
| const v8, -32769 # Min 16-bit signed integer minus one. |
| |
| sub-int v0, v0, v1 |
| sub-int v0, v0, v2 |
| sub-int v0, v0, v3 |
| sub-int v0, v0, v4 |
| sub-int v0, v0, v5 |
| sub-int v0, v0, v6 |
| sub-int v0, v0, v7 |
| sub-int v0, v0, v8 |
| sub-int v0, v1, v0 |
| sub-int v0, v2, v0 |
| sub-int v0, v3, v0 |
| sub-int v0, v4, v0 |
| sub-int v0, v5, v0 |
| sub-int v0, v6, v0 |
| sub-int v0, v7, v0 |
| sub-int v0, v8, v0 |
| |
| return v0 |
| .end method |
| |
| .method static sixteenIntArgMethod(IIIIIIIIIIIIIIII)V |
| .locals 0 |
| return-void |
| .end method |
| |
| # Same code as subtractConstants, but try to force the register allocator to allocate registers for |
| # the arithmetic operations above 15. |
| .method static subtractConstants8bitRegisters()I |
| .locals 32 |
| |
| const/4 v0, 0 |
| |
| const v1, 127 # Max 8-bit signed integer. |
| const v2, -128 # Min 8-bit signed integer. |
| const v3, 128 # Max 8-bit signed integer plus one. |
| const v4, -129 # Min 8-bit signed integer minus one. |
| |
| const v5, 32767 # Max 16-bit signed integer. |
| const v6, -32768 # Min 16-bit signed integer. |
| const v7, 32768 # Max 16-bit signed integer plus one. |
| const v8, -32769 # Min 16-bit signed integer minus one. |
| |
| const v9, 9 |
| const v10, 10 |
| const v11, 11 |
| const v12, 12 |
| const v13, 13 |
| const v14, 14 |
| const v15, 15 |
| |
| sub-int v16, v0, v1 |
| sub-int v17, v16, v2 |
| sub-int v18, v17, v3 |
| sub-int v19, v18, v4 |
| sub-int v20, v19, v5 |
| sub-int v21, v20, v6 |
| sub-int v22, v21, v7 |
| sub-int v23, v22, v8 |
| sub-int v24, v1, v23 |
| sub-int v25, v2, v24 |
| sub-int v26, v3, v25 |
| sub-int v27, v4, v26 |
| sub-int v28, v5, v27 |
| sub-int v29, v6, v28 |
| sub-int v30, v7, v29 |
| sub-int v31, v8, v30 |
| |
| invoke-static/range {v16 .. v31}, LTest;->sixteenIntArgMethod(IIIIIIIIIIIIIIII)V |
| |
| return v31 |
| .end method |
| |
| .method static addConstantUsedTwice()I |
| .locals 4 |
| |
| const/4 v0, 0 |
| const/4 v1, 1 |
| add-int/2addr v0, v1 |
| add-int/2addr v0, v1 |
| return v0 |
| .end method |
| |
| .method static addTwoLongConstants()J |
| .locals 4 |
| |
| const-wide v0, 1 |
| const-wide v2, 2 |
| add-long v0, v0, v2 |
| return-wide v0 |
| .end method |
| |
| .method static addTwoDoubleConstants()D |
| .locals 4 |
| |
| const-wide v0, 0x3ff0000000000000L # 1.0 |
| const-wide v2, 0x4000000000000000L # 2.0 |
| add-double v0, v0, v2 |
| return-wide v0 |
| .end method |
| |
| .method static cmpFold()I |
| .locals 4 |
| |
| const-wide v0, 0 |
| const-wide v2, 0 |
| cmp-long v0, v0, v2 |
| return v0 |
| .end method |
| |
| .method static addFoldLeft(I)I |
| .locals 2 |
| |
| const/4 v0, 1 |
| const/4 v1, 2 |
| add-int/2addr v0, v1 |
| add-int/2addr v0, p0 |
| return v0 |
| .end method |
| |
| .method static subFoldLeft(I)I |
| .locals 2 |
| |
| const/4 v0, 1 |
| const/4 v1, 2 |
| sub-int/2addr v0, v1 |
| sub-int/2addr v0, p0 |
| return v0 |
| .end method |
| |
| .method public static main([Ljava/lang/String;)V |
| .locals 3 |
| |
| sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; |
| |
| # Calculate: 0 + (-1). |
| const/4 v1, 0 |
| invoke-static {v1}, LTest;->addMinusOne(I)I |
| move-result v1 |
| invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V |
| |
| invoke-static {}, LTest;->addTwoConstants()I |
| move-result v1 |
| invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V |
| |
| invoke-static {}, LTest;->addSameTwoConstants()I |
| move-result v1 |
| invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V |
| |
| invoke-static {}, LTest;->addTwoLongConstants()J |
| move-result-wide v1 |
| invoke-virtual {v0, v1, v2}, Ljava/io/PrintStream;->println(J)V |
| |
| invoke-static {}, LTest;->addTwoDoubleConstants()D |
| move-result-wide v1 |
| invoke-virtual {v0, v1, v2}, Ljava/io/PrintStream;->println(D)V |
| |
| # Calculate: 0 - (-1). |
| const/4 v1, 0 |
| invoke-static {v1}, LTest;->subMinusOne(I)I |
| move-result v1 |
| invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V |
| |
| invoke-static {}, LTest;->subSameTwoConstants()I |
| move-result v1 |
| invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V |
| |
| invoke-static {}, LTest;->subtractConstants()I |
| move-result v1 |
| invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V |
| |
| invoke-static {}, LTest;->subtractConstants8bitRegisters()I |
| move-result v1 |
| invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V |
| |
| invoke-static {}, LTest;->addConstantUsedTwice()I |
| move-result v1 |
| invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V |
| |
| const/4 v1, 1 |
| invoke-static {v1}, LTest;->addFoldLeft(I)I |
| move-result v1 |
| invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V |
| |
| const/4 v1, 1 |
| invoke-static {v1}, LTest;->subFoldLeft(I)I |
| move-result v1 |
| invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(I)V |
| |
| return-void |
| .end method |