# Tests most/all DEX behaviors as of version 37. # Disassembled from dexdump test files. # Repo: https://android.googlesource.com/platform/art/ # File: test/dexdump/all.dex # Compile using smali: https://github.com/JesusFreke/smali # java -jar smali.jar assemble all.smali --api 25 .class public LA; .super Ljava/lang/Object; # static fields .field private static sB:B .field private static sC:C .field private static sI:I .field private static sJ:J .field private static sO:LA; .field private static sS:S .field private static sZ:Z # instance fields .field private mB:B .field private mC:C .field private mI:I .field private mJ:J .field private mO:LA; .field private mS:S .field private mZ:Z # direct methods .method public constructor ()V .registers 1 invoke-direct {p0}, Ljava/lang/Object;->()V return-void .end method .method public static arrays()V .registers 3 aget v0, v1, v2 aget-wide v0, v1, v2 aget-object v0, v1, v2 aget-boolean v0, v1, v2 aget-byte v0, v1, v2 aget-char v0, v1, v2 aget-short v0, v1, v2 aput v0, v1, v2 aput-wide v0, v1, v2 aput-object v0, v1, v2 aput-boolean v0, v1, v2 aput-byte v0, v1, v2 aput-char v0, v1, v2 aput-short v0, v1, v2 return-void .end method .method public static binary_ops()V .registers 3 add-int v0, v1, v2 sub-int v0, v1, v2 mul-int v0, v1, v2 div-int v0, v1, v2 rem-int v0, v1, v2 and-int v0, v1, v2 or-int v0, v1, v2 xor-int v0, v1, v2 shl-int v0, v1, v2 shr-int v0, v1, v2 ushr-int v0, v1, v2 add-long v0, v1, v2 sub-long v0, v1, v2 mul-long v0, v1, v2 div-long v0, v1, v2 rem-long v0, v1, v2 and-long v0, v1, v2 or-long v0, v1, v2 xor-long v0, v1, v2 shl-long v0, v1, v2 shr-long v0, v1, v2 ushr-long v0, v1, v2 add-float v0, v1, v2 sub-float v0, v1, v2 mul-float v0, v1, v2 div-float v0, v1, v2 rem-float v0, v1, v2 add-double v0, v1, v2 sub-double v0, v1, v2 mul-double v0, v1, v2 div-double v0, v1, v2 rem-double v0, v1, v2 return-void .end method .method public static binary_ops_2addr()V .registers 2 add-int/2addr v0, v1 sub-int/2addr v0, v1 mul-int/2addr v0, v1 div-int/2addr v0, v1 rem-int/2addr v0, v1 and-int/2addr v0, v1 or-int/2addr v0, v1 xor-int/2addr v0, v1 shl-int/2addr v0, v1 shr-int/2addr v0, v1 ushr-int/2addr v0, v1 add-long/2addr v0, v1 sub-long/2addr v0, v1 mul-long/2addr v0, v1 div-long/2addr v0, v1 rem-long/2addr v0, v1 and-long/2addr v0, v1 or-long/2addr v0, v1 xor-long/2addr v0, v1 shl-long/2addr v0, v1 shr-long/2addr v0, v1 ushr-long/2addr v0, v1 add-float/2addr v0, v1 sub-float/2addr v0, v1 mul-float/2addr v0, v1 div-float/2addr v0, v1 rem-float/2addr v0, v1 add-double/2addr v0, v1 sub-double/2addr v0, v1 mul-double/2addr v0, v1 div-double/2addr v0, v1 rem-double/2addr v0, v1 return-void .end method .method public static binary_ops_lit16()V .registers 2 add-int/lit16 v0, v1, 0x1234 rsub-int v0, v1, 0x1234 mul-int/lit16 v0, v1, 0x1234 div-int/lit16 v0, v1, 0x1234 rem-int/lit16 v0, v1, 0x1234 and-int/lit16 v0, v1, 0x1234 or-int/lit16 v0, v1, 0x1234 xor-int/lit16 v0, v1, 0x1234 return-void .end method .method public static binary_ops_lit8()V .registers 2 add-int/lit8 v0, v1, 0x12 rsub-int/lit8 v0, v1, 0x12 mul-int/lit8 v0, v1, 0x12 div-int/lit8 v0, v1, 0x12 rem-int/lit8 v0, v1, 0x12 and-int/lit8 v0, v1, 0x12 or-int/lit8 v0, v1, 0x12 xor-int/lit8 v0, v1, 0x12 shl-int/lit8 v0, v1, 0x12 shr-int/lit8 v0, v1, 0x12 ushr-int/lit8 v0, v1, 0x12 return-void .end method .method public static compares()V .registers 3 cmpl-float v0, v1, v2 cmpg-float v0, v1, v2 cmpl-double v0, v1, v2 cmpg-double v0, v1, v2 cmp-long v0, v1, v2 return-void .end method .method public static conditionals()V .registers 2 if-eq v0, v1, :cond_18 if-ne v0, v1, :cond_18 if-lt v0, v1, :cond_18 if-ge v0, v1, :cond_18 if-gt v0, v1, :cond_18 if-le v0, v1, :cond_18 if-eqz v0, :cond_18 if-nez v0, :cond_18 if-ltz v0, :cond_18 if-gez v0, :cond_18 if-gtz v0, :cond_18 if-lez v0, :cond_18 :cond_18 return-void .end method .method public static constants()V .registers 1 const/4 v0, 0x1 const/16 v0, 0x1234 const v0, 0x12345678 const/high16 v0, 0x12340000 const-wide/16 v0, 0x1234 const-wide/32 v0, 0x12345678 const-wide v0, 0x1234567890abcdefL # 5.626349108908516E-221 const-wide/high16 v0, 0x1234000000000000L const-string v0, "string" const-string/jumbo v0, "string" const-class v0, Ljava/lang/Object; return-void .end method .method public static misc()V .registers 5 nop monitor-enter v0 monitor-exit v0 check-cast v0, Ljava/lang/Object; instance-of v0, v1, Ljava/lang/Object; array-length v0, v1 new-instance v0, Ljava/lang/Object; new-array v0, v1, Ljava/lang/Object; filled-new-array {v0, v1, v2, v3, v4}, [Ljava/lang/Object; filled-new-array/range {v0 .. v4}, [Ljava/lang/Object; fill-array-data v0, :array_1e throw v0 goto :goto_1c goto/16 :goto_1c goto/32 :goto_1c :goto_1c return-void nop :array_1e .array-data 4 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0x0 .end array-data .end method .method public static moves()V .registers 2 move v0, v1 move/from16 v0, v1 move/16 v0, v1 move-wide v0, v1 move-wide/from16 v0, v1 move-wide/16 v0, v1 move-object v0, v1 move-object/from16 v0, v1 move-object/16 v0, v1 move-result v0 move-result-wide v0 move-result-object v0 move-exception v0 return-void .end method .method public static packed_switch()V .registers 1 packed-switch v0, :pswitch_data_8 :goto_3 return-void goto :goto_3 :pswitch_5 goto :goto_3 :pswitch_6 goto :goto_3 nop :pswitch_data_8 .packed-switch 0x7ffffffe :pswitch_5 :pswitch_6 .end packed-switch .end method .method public static return32()I .registers 1 return v0 .end method .method public static return64()I .registers 2 return-wide v0 .end method .method public static return_object()Ljava/lang/Object; .registers 1 return-object v0 .end method .method public static sparse_switch()V .registers 2 sparse-switch v0, :sswitch_data_4 :sswitch_3 return-void :sswitch_data_4 .sparse-switch 0x1111 -> :sswitch_3 0x2222 -> :sswitch_3 0x3333 -> :sswitch_3 0x4444 -> :sswitch_3 .end sparse-switch .end method .method public static static_fields()V .registers 1 sget v0, LA;->sI:I sget-wide v0, LA;->sJ:J sget-object v0, LA;->sO:LA; sget-boolean v0, LA;->sZ:Z sget-byte v0, LA;->sB:B sget-char v0, LA;->sC:C sget-short v0, LA;->sS:S sput v0, LA;->sI:I sput-wide v0, LA;->sJ:J sput-object v0, LA;->sO:LA; sput-boolean v0, LA;->sZ:Z sput-byte v0, LA;->sB:B sput-char v0, LA;->sC:C sput-short v0, LA;->mS:S return-void .end method .method public static unary_ops()V .registers 2 neg-int v0, v1 not-int v0, v1 neg-long v0, v1 not-long v0, v1 neg-float v0, v1 neg-double v0, v1 int-to-long v0, v1 int-to-float v0, v1 int-to-double v0, v1 long-to-int v0, v1 long-to-float v0, v1 long-to-double v0, v1 float-to-int v0, v1 float-to-long v0, v1 float-to-double v0, v1 double-to-int v0, v1 double-to-long v0, v1 double-to-float v0, v1 int-to-byte v0, v1 int-to-char v0, v1 int-to-short v0, v1 return-void .end method # virtual methods .method public instance_fields()V .registers 2 iget v0, p0, LA;->sI:I iget-wide v0, p0, LA;->sJ:J iget-object v0, p0, LA;->sO:LA; iget-boolean v0, p0, LA;->sZ:Z iget-byte v0, p0, LA;->sB:B iget-char v0, p0, LA;->sC:C iget-short v0, p0, LA;->sS:S iput v0, p0, LA;->sI:I iput-wide v0, p0, LA;->sJ:J iput-object v0, p0, LA;->sO:LA; iput-boolean v0, p0, LA;->sZ:Z iput-byte v0, p0, LA;->sB:B iput-char v0, p0, LA;->sC:C iput-short v0, p0, LA;->sS:S return-void .end method .method public invokes()V .registers 5 invoke-virtual {v0, v1, v2, v3, p0}, LA;->invokes()V invoke-super {v0, v1, v2, v3, p0}, LA;->invokes()V invoke-direct {v0, v1, v2, v3, p0}, LA;->invokes()V invoke-static {v0, v1, v2, v3, p0}, LA;->invokes()V invoke-interface {v0, v1, v2, v3, p0}, LA;->invokes()V .end method