Mont256.smali

.class public abstract Lorg/spongycastle/math/raw/Mont256;
.super Ljava/lang/Object;
.source "Mont256.java"


# static fields
.field private static final M:J = 0xffffffffL


# direct methods
.method public constructor <init>()V
    .registers 1

    .prologue
    .line 3
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V

    return-void
.end method

.method public static inverse32(I)I
    .registers 3

    .prologue
    .line 11
    mul-int v0, p0, p0

    rsub-int/lit8 v0, v0, 0x2

    mul-int/2addr v0, p0

    .line 12
    mul-int v1, p0, v0

    rsub-int/lit8 v1, v1, 0x2

    mul-int/2addr v0, v1

    .line 13
    mul-int v1, p0, v0

    rsub-int/lit8 v1, v1, 0x2

    mul-int/2addr v0, v1

    .line 14
    mul-int v1, p0, v0

    rsub-int/lit8 v1, v1, 0x2

    mul-int/2addr v0, v1

    .line 16
    return v0
.end method

.method public static multAdd([I[I[I[II)V
    .registers 31

    .prologue
    .line 21
    const/4 v5, 0x0

    .line 22
    const/4 v4, 0x0

    aget v4, p1, v4

    int-to-long v6, v4

    const-wide v8, 0xffffffffL

    and-long v10, v6, v8

    .line 24
    const/4 v4, 0x0

    move v7, v4

    move v8, v5

    :goto_f
    const/16 v4, 0x8

    if-ge v7, v4, :cond_cc

    .line 26
    const/4 v4, 0x0

    aget v4, p2, v4

    int-to-long v4, v4

    const-wide v12, 0xffffffffL

    and-long/2addr v4, v12

    .line 27
    aget v6, p0, v7

    int-to-long v12, v6

    const-wide v14, 0xffffffffL

    and-long/2addr v12, v14

    .line 29
    mul-long v14, v12, v10

    .line 30
    const-wide v16, 0xffffffffL

    and-long v16, v16, v14

    add-long v4, v4, v16

    .line 32
    long-to-int v6, v4

    mul-int v6, v6, p4

    int-to-long v0, v6

    move-wide/from16 v16, v0

    const-wide v18, 0xffffffffL

    and-long v16, v16, v18

    .line 34
    const/4 v6, 0x0

    aget v6, p3, v6

    int-to-long v0, v6

    move-wide/from16 v18, v0

    const-wide v20, 0xffffffffL

    and-long v18, v18, v20

    mul-long v18, v18, v16

    .line 35
    const-wide v20, 0xffffffffL

    and-long v20, v20, v18

    add-long v4, v4, v20

    .line 37
    const/16 v6, 0x20

    ushr-long/2addr v4, v6

    const/16 v6, 0x20

    ushr-long/2addr v14, v6

    add-long/2addr v4, v14

    const/16 v6, 0x20

    ushr-long v14, v18, v6

    add-long/2addr v4, v14

    .line 39
    const/4 v6, 0x1

    :goto_63
    const/16 v9, 0x8

    if-ge v6, v9, :cond_b6

    .line 41
    aget v9, p1, v6

    int-to-long v14, v9

    const-wide v18, 0xffffffffL

    and-long v14, v14, v18

    mul-long/2addr v14, v12

    .line 42
    aget v9, p3, v6

    int-to-long v0, v9

    move-wide/from16 v18, v0

    const-wide v20, 0xffffffffL

    and-long v18, v18, v20

    mul-long v18, v18, v16

    .line 44
    const-wide v20, 0xffffffffL

    and-long v20, v20, v14

    const-wide v22, 0xffffffffL

    and-long v22, v22, v18

    add-long v20, v20, v22

    aget v9, p2, v6

    int-to-long v0, v9

    move-wide/from16 v22, v0

    const-wide v24, 0xffffffffL

    and-long v22, v22, v24

    add-long v20, v20, v22

    add-long v4, v4, v20

    .line 45
    add-int/lit8 v9, v6, -0x1

    long-to-int v0, v4

    move/from16 v20, v0

    aput v20, p2, v9

    .line 46
    const/16 v9, 0x20

    ushr-long/2addr v4, v9

    const/16 v9, 0x20

    ushr-long/2addr v14, v9

    add-long/2addr v4, v14

    const/16 v9, 0x20

    ushr-long v14, v18, v9

    add-long/2addr v4, v14

    .line 39
    add-int/lit8 v6, v6, 0x1

    goto :goto_63

    .line 49
    :cond_b6
    int-to-long v8, v8

    const-wide v12, 0xffffffffL

    and-long/2addr v8, v12

    add-long/2addr v4, v8

    .line 50
    const/4 v6, 0x7

    long-to-int v8, v4

    aput v8, p2, v6

    .line 51
    const/16 v6, 0x20

    ushr-long/2addr v4, v6

    long-to-int v5, v4

    .line 24
    add-int/lit8 v4, v7, 0x1

    move v7, v4

    move v8, v5

    goto/16 :goto_f

    .line 54
    :cond_cc
    if-nez v8, :cond_d4

    invoke-static/range {p2 .. p3}, Lorg/spongycastle/math/raw/Nat256;->gte([I[I)Z

    move-result v4

    if-eqz v4, :cond_dd

    .line 56
    :cond_d4
    move-object/from16 v0, p2

    move-object/from16 v1, p3

    move-object/from16 v2, p2

    invoke-static {v0, v1, v2}, Lorg/spongycastle/math/raw/Nat256;->sub([I[I[I)I

    .line 58
    :cond_dd
    return-void
.end method

.method public static multAddXF([I[I[I[I)V
    .registers 30

    .prologue
    .line 64
    const/4 v5, 0x0

    .line 65
    const/4 v4, 0x0

    aget v4, p1, v4

    int-to-long v6, v4

    const-wide v8, 0xffffffffL

    and-long v10, v6, v8

    .line 67
    const/4 v4, 0x0

    move v8, v5

    move v5, v4

    :goto_f
    const/16 v4, 0x8

    if-ge v5, v4, :cond_a4

    .line 69
    aget v4, p0, v5

    int-to-long v6, v4

    const-wide v12, 0xffffffffL

    and-long/2addr v12, v6

    .line 71
    mul-long v6, v12, v10

    const/4 v4, 0x0

    aget v4, p2, v4

    int-to-long v14, v4

    const-wide v16, 0xffffffffL

    and-long v14, v14, v16

    add-long/2addr v6, v14

    .line 72
    const-wide v14, 0xffffffffL

    and-long/2addr v14, v6

    .line 73
    const/16 v4, 0x20

    ushr-long/2addr v6, v4

    add-long/2addr v6, v14

    .line 75
    const/4 v4, 0x1

    :goto_35
    const/16 v9, 0x8

    if-ge v4, v9, :cond_8e

    .line 77
    aget v9, p1, v4

    int-to-long v0, v9

    move-wide/from16 v16, v0

    const-wide v18, 0xffffffffL

    and-long v16, v16, v18

    mul-long v16, v16, v12

    .line 78
    aget v9, p3, v4

    int-to-long v0, v9

    move-wide/from16 v18, v0

    const-wide v20, 0xffffffffL

    and-long v18, v18, v20

    mul-long v18, v18, v14

    .line 80
    const-wide v20, 0xffffffffL

    and-long v20, v20, v16

    const-wide v22, 0xffffffffL

    and-long v22, v22, v18

    add-long v20, v20, v22

    aget v9, p2, v4

    int-to-long v0, v9

    move-wide/from16 v22, v0

    const-wide v24, 0xffffffffL

    and-long v22, v22, v24

    add-long v20, v20, v22

    add-long v6, v6, v20

    .line 81
    add-int/lit8 v9, v4, -0x1

    long-to-int v0, v6

    move/from16 v20, v0

    aput v20, p2, v9

    .line 82
    const/16 v9, 0x20

    ushr-long/2addr v6, v9

    const/16 v9, 0x20

    ushr-long v16, v16, v9

    add-long v6, v6, v16

    const/16 v9, 0x20

    ushr-long v16, v18, v9

    add-long v6, v6, v16

    .line 75
    add-int/lit8 v4, v4, 0x1

    goto :goto_35

    .line 85
    :cond_8e
    int-to-long v8, v8

    const-wide v12, 0xffffffffL

    and-long/2addr v8, v12

    add-long/2addr v6, v8

    .line 86
    const/4 v4, 0x7

    long-to-int v8, v6

    aput v8, p2, v4

    .line 87
    const/16 v4, 0x20

    ushr-long/2addr v6, v4

    long-to-int v6, v6

    .line 67
    add-int/lit8 v4, v5, 0x1

    move v5, v4

    move v8, v6

    goto/16 :goto_f

    .line 90
    :cond_a4
    if-nez v8, :cond_ac

    invoke-static/range {p2 .. p3}, Lorg/spongycastle/math/raw/Nat256;->gte([I[I)Z

    move-result v4

    if-eqz v4, :cond_b5

    .line 92
    :cond_ac
    move-object/from16 v0, p2

    move-object/from16 v1, p3

    move-object/from16 v2, p2

    invoke-static {v0, v1, v2}, Lorg/spongycastle/math/raw/Nat256;->sub([I[I[I)I

    .line 94
    :cond_b5
    return-void
.end method

.method public static reduce([I[II)V
    .registers 15

    .prologue
    .line 98
    const/4 v0, 0x0

    move v3, v0

    :goto_2
    const/16 v0, 0x8

    if-ge v3, v0, :cond_55

    .line 100
    const/4 v0, 0x0

    aget v0, p0, v0

    .line 102
    mul-int v1, v0, p2

    int-to-long v4, v1

    const-wide v6, 0xffffffffL

    and-long/2addr v4, v6

    .line 104
    const/4 v1, 0x0

    aget v1, p1, v1

    int-to-long v6, v1

    const-wide v8, 0xffffffffL

    and-long/2addr v6, v8

    mul-long/2addr v6, v4

    int-to-long v0, v0

    const-wide v8, 0xffffffffL

    and-long/2addr v0, v8

    add-long/2addr v0, v6

    .line 106
    const/16 v2, 0x20

    ushr-long/2addr v0, v2

    .line 108
    const/4 v2, 0x1

    :goto_29
    const/16 v6, 0x8

    if-ge v2, v6, :cond_4d

    .line 110
    aget v6, p1, v2

    int-to-long v6, v6

    const-wide v8, 0xffffffffL

    and-long/2addr v6, v8

    mul-long/2addr v6, v4

    aget v8, p0, v2

    int-to-long v8, v8

    const-wide v10, 0xffffffffL

    and-long/2addr v8, v10

    add-long/2addr v6, v8

    add-long/2addr v0, v6

    .line 111
    add-int/lit8 v6, v2, -0x1

    long-to-int v7, v0

    aput v7, p0, v6

    .line 112
    const/16 v6, 0x20

    ushr-long/2addr v0, v6

    .line 108
    add-int/lit8 v2, v2, 0x1

    goto :goto_29

    .line 115
    :cond_4d
    const/4 v2, 0x7

    long-to-int v0, v0

    aput v0, p0, v2

    .line 98
    add-int/lit8 v0, v3, 0x1

    move v3, v0

    goto :goto_2

    .line 119
    :cond_55
    invoke-static {p0, p1}, Lorg/spongycastle/math/raw/Nat256;->gte([I[I)Z

    move-result v0

    if-eqz v0, :cond_5e

    .line 121
    invoke-static {p0, p1, p0}, Lorg/spongycastle/math/raw/Nat256;->sub([I[I[I)I

    .line 123
    :cond_5e
    return-void
.end method

.method public static reduceXF([I[I)V
    .registers 14

    .prologue
    .line 129
    const/4 v0, 0x0

    move v5, v0

    :goto_2
    const/16 v0, 0x8

    if-ge v5, v0, :cond_3f

    .line 131
    const/4 v0, 0x0

    aget v0, p0, v0

    .line 133
    int-to-long v0, v0

    const-wide v2, 0xffffffffL

    and-long/2addr v2, v0

    .line 136
    const/4 v0, 0x1

    move v4, v0

    move-wide v0, v2

    :goto_13
    const/16 v6, 0x8

    if-ge v4, v6, :cond_37

    .line 138
    aget v6, p1, v4

    int-to-long v6, v6

    const-wide v8, 0xffffffffL

    and-long/2addr v6, v8

    mul-long/2addr v6, v2

    aget v8, p0, v4

    int-to-long v8, v8

    const-wide v10, 0xffffffffL

    and-long/2addr v8, v10

    add-long/2addr v6, v8

    add-long/2addr v0, v6

    .line 139
    add-int/lit8 v6, v4, -0x1

    long-to-int v7, v0

    aput v7, p0, v6

    .line 140
    const/16 v6, 0x20

    ushr-long/2addr v0, v6

    .line 136
    add-int/lit8 v4, v4, 0x1

    goto :goto_13

    .line 143
    :cond_37
    const/4 v2, 0x7

    long-to-int v0, v0

    aput v0, p0, v2

    .line 129
    add-int/lit8 v0, v5, 0x1

    move v5, v0

    goto :goto_2

    .line 147
    :cond_3f
    invoke-static {p0, p1}, Lorg/spongycastle/math/raw/Nat256;->gte([I[I)Z

    move-result v0

    if-eqz v0, :cond_48

    .line 149
    invoke-static {p0, p1, p0}, Lorg/spongycastle/math/raw/Nat256;->sub([I[I[I)I

    .line 151
    :cond_48
    return-void
.end method