mirror of
https://github.com/zama-ai/concrete.git
synced 2026-02-09 03:55:04 -05:00
feat(compiler): h_add and h_mul
This commit is contained in:
committed by
Quentin Bourgerie
parent
8edf4a358e
commit
efae2a79d7
@@ -62,4 +62,29 @@ def KeySwitchOp : MidLFHE_Op<"keyswitch"> {
|
||||
let results = (outs CipherTextType);
|
||||
}
|
||||
|
||||
|
||||
def HAddOp : MidLFHE_Op<"h_add"> {
|
||||
let arguments = (ins GLWECipherTextType:$a, GLWECipherTextType:$b);
|
||||
let results = (outs GLWECipherTextType);
|
||||
|
||||
let builders = [
|
||||
OpBuilder<(ins "Value":$a, "Value":$b), [{
|
||||
build($_builder, $_state, a.getType(), a, b);
|
||||
}]>
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
def HMulOp : MidLFHE_Op<"h_mul"> {
|
||||
let arguments = (ins GLWECipherTextType:$a, GLWECipherTextType:$b);
|
||||
let results = (outs GLWECipherTextType);
|
||||
|
||||
let builders = [
|
||||
OpBuilder<(ins "Value":$a, "Value":$b), [{
|
||||
build($_builder, $_state, a.getType(), a, b);
|
||||
}]>
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,45 +1,45 @@
|
||||
// RUN: zamacompiler %s 2>&1| FileCheck %s
|
||||
|
||||
// CHECK-LABEL: func @mul_plain_ciphertext(%arg0: !MidLFHE.ciphertext) -> !MidLFHE.ciphertext
|
||||
func @mul_plain_ciphertext(%arg0: !MidLFHE.ciphertext) -> !MidLFHE.ciphertext {
|
||||
// CHECK-LABEL: func @add_plain_ciphertext(%arg0: !MidLFHE.ciphertext) -> !MidLFHE.ciphertext
|
||||
func @add_plain_ciphertext(%arg0: !MidLFHE.ciphertext) -> !MidLFHE.ciphertext {
|
||||
// CHECK-NEXT: %[[V1:.*]] = constant 1 : i32
|
||||
// CHECK-NEXT: %[[V2:.*]] = "MidLFHE.mul_plain"(%arg0, %[[V1]]) : (!MidLFHE.ciphertext, i32) -> !MidLFHE.ciphertext
|
||||
// CHECK-NEXT: %[[V2:.*]] = "MidLFHE.add_plain"(%arg0, %[[V1]]) : (!MidLFHE.ciphertext, i32) -> !MidLFHE.ciphertext
|
||||
// CHECK-NEXT: return %[[V2]] : !MidLFHE.ciphertext
|
||||
|
||||
%0 = constant 1 : i32
|
||||
%1 = "MidLFHE.mul_plain"(%arg0, %0): (!MidLFHE.ciphertext, i32) -> (!MidLFHE.ciphertext)
|
||||
%1 = "MidLFHE.add_plain"(%arg0, %0): (!MidLFHE.ciphertext, i32) -> (!MidLFHE.ciphertext)
|
||||
return %1: !MidLFHE.ciphertext
|
||||
}
|
||||
|
||||
// CHECK-LABEL: func @mul_plain_lwe(%arg0: !MidLFHE.lwe<1024>) -> !MidLFHE.lwe<1024>
|
||||
func @mul_plain_lwe(%arg0: !MidLFHE.lwe<1024>) -> !MidLFHE.lwe<1024> {
|
||||
// CHECK-LABEL: func @add_plain_lwe(%arg0: !MidLFHE.lwe<1024>) -> !MidLFHE.lwe<1024>
|
||||
func @add_plain_lwe(%arg0: !MidLFHE.lwe<1024>) -> !MidLFHE.lwe<1024> {
|
||||
// CHECK-NEXT: %[[V1:.*]] = constant 1 : i32
|
||||
// CHECK-NEXT: %[[V2:.*]] = "MidLFHE.mul_plain"(%arg0, %[[V1]]) : (!MidLFHE.lwe<1024>, i32) -> !MidLFHE.lwe<1024>
|
||||
// CHECK-NEXT: %[[V2:.*]] = "MidLFHE.add_plain"(%arg0, %[[V1]]) : (!MidLFHE.lwe<1024>, i32) -> !MidLFHE.lwe<1024>
|
||||
// CHECK-NEXT: return %[[V2]] : !MidLFHE.lwe<1024>
|
||||
|
||||
%0 = constant 1 : i32
|
||||
%1 = "MidLFHE.mul_plain"(%arg0, %0): (!MidLFHE.lwe<1024>, i32) -> (!MidLFHE.lwe<1024>)
|
||||
%1 = "MidLFHE.add_plain"(%arg0, %0): (!MidLFHE.lwe<1024>, i32) -> (!MidLFHE.lwe<1024>)
|
||||
return %1: !MidLFHE.lwe<1024>
|
||||
}
|
||||
|
||||
// CHECK-LABEL: func @mul_plain_glwe(%arg0: !MidLFHE.glwe<1024,12>) -> !MidLFHE.glwe<1024,12>
|
||||
func @mul_plain_glwe(%arg0: !MidLFHE.glwe<1024,12>) -> !MidLFHE.glwe<1024,12> {
|
||||
// CHECK-LABEL: func @add_plain_glwe(%arg0: !MidLFHE.glwe<1024,12>) -> !MidLFHE.glwe<1024,12>
|
||||
func @add_plain_glwe(%arg0: !MidLFHE.glwe<1024,12>) -> !MidLFHE.glwe<1024,12> {
|
||||
// CHECK-NEXT: %[[V1:.*]] = constant 1 : i32
|
||||
// CHECK-NEXT: %[[V2:.*]] = "MidLFHE.mul_plain"(%arg0, %[[V1]]) : (!MidLFHE.glwe<1024,12>, i32) -> !MidLFHE.glwe<1024,12>
|
||||
// CHECK-NEXT: %[[V2:.*]] = "MidLFHE.add_plain"(%arg0, %[[V1]]) : (!MidLFHE.glwe<1024,12>, i32) -> !MidLFHE.glwe<1024,12>
|
||||
// CHECK-NEXT: return %[[V2]] : !MidLFHE.glwe<1024,12>
|
||||
|
||||
%0 = constant 1 : i32
|
||||
%1 = "MidLFHE.mul_plain"(%arg0, %0): (!MidLFHE.glwe<1024,12>, i32) -> (!MidLFHE.glwe<1024,12>)
|
||||
%1 = "MidLFHE.add_plain"(%arg0, %0): (!MidLFHE.glwe<1024,12>, i32) -> (!MidLFHE.glwe<1024,12>)
|
||||
return %1: !MidLFHE.glwe<1024,12>
|
||||
}
|
||||
|
||||
// CHECK-LABEL: func @mul_plain_ggsw(%arg0: !MidLFHE.ggsw<1024,12,3,2>) -> !MidLFHE.ggsw<1024,12,3,2>
|
||||
func @mul_plain_ggsw(%arg0: !MidLFHE.ggsw<1024,12,3,2>) -> !MidLFHE.ggsw<1024,12,3,2> {
|
||||
// CHECK-LABEL: func @add_plain_ggsw(%arg0: !MidLFHE.ggsw<1024,12,3,2>) -> !MidLFHE.ggsw<1024,12,3,2>
|
||||
func @add_plain_ggsw(%arg0: !MidLFHE.ggsw<1024,12,3,2>) -> !MidLFHE.ggsw<1024,12,3,2> {
|
||||
// CHECK-NEXT: %[[V1:.*]] = constant 1 : i32
|
||||
// CHECK-NEXT: %[[V2:.*]] = "MidLFHE.mul_plain"(%arg0, %[[V1]]) : (!MidLFHE.ggsw<1024,12,3,2>, i32) -> !MidLFHE.ggsw<1024,12,3,2>
|
||||
// CHECK-NEXT: %[[V2:.*]] = "MidLFHE.add_plain"(%arg0, %[[V1]]) : (!MidLFHE.ggsw<1024,12,3,2>, i32) -> !MidLFHE.ggsw<1024,12,3,2>
|
||||
// CHECK-NEXT: return %[[V2]] : !MidLFHE.ggsw<1024,12,3,2>
|
||||
|
||||
%0 = constant 1 : i32
|
||||
%1 = "MidLFHE.mul_plain"(%arg0, %0): (!MidLFHE.ggsw<1024,12,3,2>, i32) -> (!MidLFHE.ggsw<1024,12,3,2>)
|
||||
%1 = "MidLFHE.add_plain"(%arg0, %0): (!MidLFHE.ggsw<1024,12,3,2>, i32) -> (!MidLFHE.ggsw<1024,12,3,2>)
|
||||
return %1: !MidLFHE.ggsw<1024,12,3,2>
|
||||
}
|
||||
11
compiler/tests/Dialect/MidLFHE/op_h_add.mlir
Normal file
11
compiler/tests/Dialect/MidLFHE/op_h_add.mlir
Normal file
@@ -0,0 +1,11 @@
|
||||
// RUN: zamacompiler %s 2>&1| FileCheck %s
|
||||
|
||||
|
||||
// CHECK-LABEL: func @add_plain_glwe(%arg0: !MidLFHE.glwe<1024,12>, %arg1: !MidLFHE.glwe<1024,12>) -> !MidLFHE.glwe<1024,12>
|
||||
func @add_plain_glwe(%arg0: !MidLFHE.glwe<1024,12>, %arg1: !MidLFHE.glwe<1024,12>) -> !MidLFHE.glwe<1024,12> {
|
||||
// CHECK-NEXT: %[[V1:.*]] = "MidLFHE.h_mul"(%arg0, %arg1) : (!MidLFHE.glwe<1024,12>, !MidLFHE.glwe<1024,12>) -> !MidLFHE.glwe<1024,12>
|
||||
// CHECK-NEXT: return %[[V1]] : !MidLFHE.glwe<1024,12>
|
||||
|
||||
%0 = "MidLFHE.h_mul"(%arg0, %arg1): (!MidLFHE.glwe<1024,12>, !MidLFHE.glwe<1024,12>) -> (!MidLFHE.glwe<1024,12>)
|
||||
return %0: !MidLFHE.glwe<1024,12>
|
||||
}
|
||||
11
compiler/tests/Dialect/MidLFHE/op_h_mul.mlir
Normal file
11
compiler/tests/Dialect/MidLFHE/op_h_mul.mlir
Normal file
@@ -0,0 +1,11 @@
|
||||
// RUN: zamacompiler %s 2>&1| FileCheck %s
|
||||
|
||||
|
||||
// CHECK-LABEL: func @add_plain_glwe(%arg0: !MidLFHE.glwe<1024,12>, %arg1: !MidLFHE.glwe<1024,12>) -> !MidLFHE.glwe<1024,12>
|
||||
func @add_plain_glwe(%arg0: !MidLFHE.glwe<1024,12>, %arg1: !MidLFHE.glwe<1024,12>) -> !MidLFHE.glwe<1024,12> {
|
||||
// CHECK-NEXT: %[[V1:.*]] = "MidLFHE.h_add"(%arg0, %arg1) : (!MidLFHE.glwe<1024,12>, !MidLFHE.glwe<1024,12>) -> !MidLFHE.glwe<1024,12>
|
||||
// CHECK-NEXT: return %[[V1]] : !MidLFHE.glwe<1024,12>
|
||||
|
||||
%0 = "MidLFHE.h_add"(%arg0, %arg1): (!MidLFHE.glwe<1024,12>, !MidLFHE.glwe<1024,12>) -> (!MidLFHE.glwe<1024,12>)
|
||||
return %0: !MidLFHE.glwe<1024,12>
|
||||
}
|
||||
@@ -1,45 +1,45 @@
|
||||
// RUN: zamacompiler %s 2>&1| FileCheck %s
|
||||
|
||||
// CHECK-LABEL: func @add_plain_ciphertext(%arg0: !MidLFHE.ciphertext) -> !MidLFHE.ciphertext
|
||||
func @add_plain_ciphertext(%arg0: !MidLFHE.ciphertext) -> !MidLFHE.ciphertext {
|
||||
// CHECK-LABEL: func @mul_plain_ciphertext(%arg0: !MidLFHE.ciphertext) -> !MidLFHE.ciphertext
|
||||
func @mul_plain_ciphertext(%arg0: !MidLFHE.ciphertext) -> !MidLFHE.ciphertext {
|
||||
// CHECK-NEXT: %[[V1:.*]] = constant 1 : i32
|
||||
// CHECK-NEXT: %[[V2:.*]] = "MidLFHE.add_plain"(%arg0, %[[V1]]) : (!MidLFHE.ciphertext, i32) -> !MidLFHE.ciphertext
|
||||
// CHECK-NEXT: %[[V2:.*]] = "MidLFHE.mul_plain"(%arg0, %[[V1]]) : (!MidLFHE.ciphertext, i32) -> !MidLFHE.ciphertext
|
||||
// CHECK-NEXT: return %[[V2]] : !MidLFHE.ciphertext
|
||||
|
||||
%0 = constant 1 : i32
|
||||
%1 = "MidLFHE.add_plain"(%arg0, %0): (!MidLFHE.ciphertext, i32) -> (!MidLFHE.ciphertext)
|
||||
%1 = "MidLFHE.mul_plain"(%arg0, %0): (!MidLFHE.ciphertext, i32) -> (!MidLFHE.ciphertext)
|
||||
return %1: !MidLFHE.ciphertext
|
||||
}
|
||||
|
||||
// CHECK-LABEL: func @add_plain_lwe(%arg0: !MidLFHE.lwe<1024>) -> !MidLFHE.lwe<1024>
|
||||
func @add_plain_lwe(%arg0: !MidLFHE.lwe<1024>) -> !MidLFHE.lwe<1024> {
|
||||
// CHECK-LABEL: func @mul_plain_lwe(%arg0: !MidLFHE.lwe<1024>) -> !MidLFHE.lwe<1024>
|
||||
func @mul_plain_lwe(%arg0: !MidLFHE.lwe<1024>) -> !MidLFHE.lwe<1024> {
|
||||
// CHECK-NEXT: %[[V1:.*]] = constant 1 : i32
|
||||
// CHECK-NEXT: %[[V2:.*]] = "MidLFHE.add_plain"(%arg0, %[[V1]]) : (!MidLFHE.lwe<1024>, i32) -> !MidLFHE.lwe<1024>
|
||||
// CHECK-NEXT: %[[V2:.*]] = "MidLFHE.mul_plain"(%arg0, %[[V1]]) : (!MidLFHE.lwe<1024>, i32) -> !MidLFHE.lwe<1024>
|
||||
// CHECK-NEXT: return %[[V2]] : !MidLFHE.lwe<1024>
|
||||
|
||||
%0 = constant 1 : i32
|
||||
%1 = "MidLFHE.add_plain"(%arg0, %0): (!MidLFHE.lwe<1024>, i32) -> (!MidLFHE.lwe<1024>)
|
||||
%1 = "MidLFHE.mul_plain"(%arg0, %0): (!MidLFHE.lwe<1024>, i32) -> (!MidLFHE.lwe<1024>)
|
||||
return %1: !MidLFHE.lwe<1024>
|
||||
}
|
||||
|
||||
// CHECK-LABEL: func @add_plain_glwe(%arg0: !MidLFHE.glwe<1024,12>) -> !MidLFHE.glwe<1024,12>
|
||||
func @add_plain_glwe(%arg0: !MidLFHE.glwe<1024,12>) -> !MidLFHE.glwe<1024,12> {
|
||||
// CHECK-LABEL: func @mul_plain_glwe(%arg0: !MidLFHE.glwe<1024,12>) -> !MidLFHE.glwe<1024,12>
|
||||
func @mul_plain_glwe(%arg0: !MidLFHE.glwe<1024,12>) -> !MidLFHE.glwe<1024,12> {
|
||||
// CHECK-NEXT: %[[V1:.*]] = constant 1 : i32
|
||||
// CHECK-NEXT: %[[V2:.*]] = "MidLFHE.add_plain"(%arg0, %[[V1]]) : (!MidLFHE.glwe<1024,12>, i32) -> !MidLFHE.glwe<1024,12>
|
||||
// CHECK-NEXT: %[[V2:.*]] = "MidLFHE.mul_plain"(%arg0, %[[V1]]) : (!MidLFHE.glwe<1024,12>, i32) -> !MidLFHE.glwe<1024,12>
|
||||
// CHECK-NEXT: return %[[V2]] : !MidLFHE.glwe<1024,12>
|
||||
|
||||
%0 = constant 1 : i32
|
||||
%1 = "MidLFHE.add_plain"(%arg0, %0): (!MidLFHE.glwe<1024,12>, i32) -> (!MidLFHE.glwe<1024,12>)
|
||||
%1 = "MidLFHE.mul_plain"(%arg0, %0): (!MidLFHE.glwe<1024,12>, i32) -> (!MidLFHE.glwe<1024,12>)
|
||||
return %1: !MidLFHE.glwe<1024,12>
|
||||
}
|
||||
|
||||
// CHECK-LABEL: func @add_plain_ggsw(%arg0: !MidLFHE.ggsw<1024,12,3,2>) -> !MidLFHE.ggsw<1024,12,3,2>
|
||||
func @add_plain_ggsw(%arg0: !MidLFHE.ggsw<1024,12,3,2>) -> !MidLFHE.ggsw<1024,12,3,2> {
|
||||
// CHECK-LABEL: func @mul_plain_ggsw(%arg0: !MidLFHE.ggsw<1024,12,3,2>) -> !MidLFHE.ggsw<1024,12,3,2>
|
||||
func @mul_plain_ggsw(%arg0: !MidLFHE.ggsw<1024,12,3,2>) -> !MidLFHE.ggsw<1024,12,3,2> {
|
||||
// CHECK-NEXT: %[[V1:.*]] = constant 1 : i32
|
||||
// CHECK-NEXT: %[[V2:.*]] = "MidLFHE.add_plain"(%arg0, %[[V1]]) : (!MidLFHE.ggsw<1024,12,3,2>, i32) -> !MidLFHE.ggsw<1024,12,3,2>
|
||||
// CHECK-NEXT: %[[V2:.*]] = "MidLFHE.mul_plain"(%arg0, %[[V1]]) : (!MidLFHE.ggsw<1024,12,3,2>, i32) -> !MidLFHE.ggsw<1024,12,3,2>
|
||||
// CHECK-NEXT: return %[[V2]] : !MidLFHE.ggsw<1024,12,3,2>
|
||||
|
||||
%0 = constant 1 : i32
|
||||
%1 = "MidLFHE.add_plain"(%arg0, %0): (!MidLFHE.ggsw<1024,12,3,2>, i32) -> (!MidLFHE.ggsw<1024,12,3,2>)
|
||||
%1 = "MidLFHE.mul_plain"(%arg0, %0): (!MidLFHE.ggsw<1024,12,3,2>, i32) -> (!MidLFHE.ggsw<1024,12,3,2>)
|
||||
return %1: !MidLFHE.ggsw<1024,12,3,2>
|
||||
}
|
||||
Reference in New Issue
Block a user