blob: 167eb1bceeebdbf6e21805b955afe7369292faaf [file] [log] [blame]
# 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