| # Copyright (c) 2017, 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. |
| |
| # Some versions of dalvik had a bug where you cannot use the second half of an input long |
| # as the first part of an output long. This smali code explicitly has that issue so the |
| # generated dex file can be used to test art/dalvik versions. |
| # |
| # The issue was that if you have |
| # |
| # add-long v3, v0, v2 |
| # |
| # dalvik would add v0 and v2 and store the result in v3 before adding v1 and v3 (now clobbered). |
| |
| .class public LTest; |
| |
| .super Ljava/lang/Object; |
| |
| .method static add(JJ)J |
| .locals 5 |
| move-wide v0, p0 |
| move-wide v2, p2 |
| add-long v3, v0, v2 |
| return-wide v3 |
| .end method |
| |
| .method public static main([Ljava/lang/String;)V |
| .locals 10 |
| |
| sget-object v5, Ljava/lang/System;->out:Ljava/io/PrintStream; |
| |
| const-wide/high16 v0, 0x4000000000000000L |
| const-wide/high16 v2, 0x4100000000000000L |
| invoke-static {v0, v1, v2, v3}, LTest;->add(JJ)J |
| move-result-wide v6 |
| invoke-virtual {v5, v6, v7}, Ljava/io/PrintStream;->println(J)V |
| |
| # Adding loop in an attempt to get the jit to process the add method. |
| const v8, 1000000 |
| const v9, 1 |
| :loop |
| if-eqz v8, :exit |
| const-wide v0, 0x4000000000040000L |
| const-wide v2, 0x4100000000041000L |
| invoke-static {v0, v1, v2, v3}, LTest;->add(JJ)J |
| move-result-wide v6 |
| sub-int v8, v8, v9 |
| goto :loop |
| |
| :exit |
| invoke-virtual {v5, v6, v7}, Ljava/io/PrintStream;->println(J)V |
| return-void |
| .end method |