|
3 | 3 | // RUN: --shared-libs="%mlir_lib_dir/libmlir_runner_utils%shlibext" > %t |
4 | 4 | // RUN: FileCheck %s --check-prefix=CHECK_TEST_OPS_IN_ORDER < %t |
5 | 5 |
|
| 6 | +// RUN: zkir-opt %s -elliptic-curve-to-llvm \ |
| 7 | +// RUN: | mlir-runner -e test_msm -entry-point-result=void \ |
| 8 | +// RUN: --shared-libs="%mlir_lib_dir/libmlir_runner_utils%shlibext" > %t |
| 9 | +// RUN: FileCheck %s --check-prefix=CHECK_TEST_MSM < %t |
| 10 | + |
| 11 | + |
6 | 12 | !PF = !field.pf<11:i32> |
7 | 13 |
|
8 | 14 | #1 = #field.pf_elem<1:i32> : !PF |
@@ -102,3 +108,50 @@ func.func @test_ops_in_order() { |
102 | 108 | // CHECK_TEST_OPS_IN_ORDER: [0, 0, 0] |
103 | 109 | // CHECK_TEST_OPS_IN_ORDER: [1, 1] |
104 | 110 | // CHECK_TEST_OPS_IN_ORDER: [4, 3, 0, 0] |
| 111 | + |
| 112 | + |
| 113 | +// CHECK-LABEL: @test_msm |
| 114 | +func.func @test_msm() { |
| 115 | + // 5*(5,3,2) + 7*(1,2,2) + 3*(7,5,1) + 2*(3,2,7) |
| 116 | + %var1 = field.pf.constant 1 : !PF |
| 117 | + %var2 = field.pf.constant 2 : !PF |
| 118 | + %var3 = field.pf.constant 3 : !PF |
| 119 | + %var5 = field.pf.constant 5 : !PF |
| 120 | + %var7 = field.pf.constant 7 : !PF |
| 121 | + |
| 122 | + %jacobian1 = elliptic_curve.point %var5, %var3, %var2 : !PF -> !jacobian |
| 123 | + %jacobian2 = elliptic_curve.point %var1, %var2, %var2 : !PF -> !jacobian |
| 124 | + %jacobian3 = elliptic_curve.point %var7, %var5, %var1 : !PF -> !jacobian |
| 125 | + %jacobian4 = elliptic_curve.point %var3, %var2, %var7 : !PF -> !jacobian |
| 126 | + |
| 127 | + // CALCULATING TRUE VALUE OF MSM |
| 128 | + %scalar_mul1 = elliptic_curve.scalar_mul %var5, %jacobian1 : !PF, !jacobian -> !jacobian |
| 129 | + %scalar_mul2 = elliptic_curve.scalar_mul %var7, %jacobian2 : !PF, !jacobian -> !jacobian |
| 130 | + %scalar_mul3 = elliptic_curve.scalar_mul %var3, %jacobian3 : !PF, !jacobian -> !jacobian |
| 131 | + %scalar_mul4 = elliptic_curve.scalar_mul %var2, %jacobian4 : !PF, !jacobian -> !jacobian |
| 132 | + |
| 133 | + %add1 = elliptic_curve.add %scalar_mul1, %scalar_mul2 : !jacobian, !jacobian -> !jacobian |
| 134 | + %add2 = elliptic_curve.add %scalar_mul3, %scalar_mul4 : !jacobian, !jacobian -> !jacobian |
| 135 | + %msm_true = elliptic_curve.add %add1, %add2 : !jacobian, !jacobian -> !jacobian |
| 136 | + |
| 137 | + %extract_point = elliptic_curve.extract %msm_true : !jacobian -> tensor<3x!PF> |
| 138 | + %extract = field.pf.extract %extract_point : tensor<3x!PF> -> tensor<3xi32> |
| 139 | + %mem = bufferization.to_memref %extract : tensor<3xi32> to memref<3xi32> |
| 140 | + %U = memref.cast %mem : memref<3xi32> to memref<*xi32> |
| 141 | + func.call @printMemrefI32(%U) : (memref<*xi32>) -> () |
| 142 | + |
| 143 | + // RUNNING MSM |
| 144 | + %scalars = tensor.from_elements %var5, %var7, %var3, %var2 : tensor<4x!PF> |
| 145 | + %points = elliptic_curve.point_set.from_elements %jacobian1, %jacobian2, %jacobian3, %jacobian4 : tensor<4x!jacobian> |
| 146 | + %msm_test = elliptic_curve.msm %scalars , %points: tensor<4x!PF>, tensor<4x!jacobian> -> !jacobian |
| 147 | + |
| 148 | + %extract_point1 = elliptic_curve.extract %msm_test : !jacobian -> tensor<3x!PF> |
| 149 | + %extract1 = field.pf.extract %extract_point1 : tensor<3x!PF> -> tensor<3xi32> |
| 150 | + %mem1 = bufferization.to_memref %extract1 : tensor<3xi32> to memref<3xi32> |
| 151 | + %U1 = memref.cast %mem1 : memref<3xi32> to memref<*xi32> |
| 152 | + func.call @printMemrefI32(%U1) : (memref<*xi32>) -> () |
| 153 | + return |
| 154 | +} |
| 155 | + |
| 156 | +// CHECK_TEST_MSM: [0, 0, 0] |
| 157 | +// CHECK_TEST_MSM: [0, 0, 0] |
0 commit comments