118452d1fSValentin Clement //===- TransformationalTest.cpp -- Transformational intrinsic generation --===//
218452d1fSValentin Clement //
318452d1fSValentin Clement // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
418452d1fSValentin Clement // See https://llvm.org/LICENSE.txt for license information.
518452d1fSValentin Clement // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
618452d1fSValentin Clement //
718452d1fSValentin Clement //===----------------------------------------------------------------------===//
818452d1fSValentin Clement
918452d1fSValentin Clement #include "flang/Optimizer/Builder/Runtime/Transformational.h"
1018452d1fSValentin Clement #include "RuntimeCallTestBase.h"
1118452d1fSValentin Clement #include "gtest/gtest.h"
1218452d1fSValentin Clement
testGenBesselJn(fir::FirOpBuilder & builder,mlir::Type realTy,llvm::StringRef fctName)13bef2bb34STarun Prabhu void testGenBesselJn(
14bef2bb34STarun Prabhu fir::FirOpBuilder &builder, mlir::Type realTy, llvm::StringRef fctName) {
15bef2bb34STarun Prabhu mlir::Location loc = builder.getUnknownLoc();
16bef2bb34STarun Prabhu mlir::Type i32Ty = builder.getIntegerType(32);
17bef2bb34STarun Prabhu mlir::Type seqTy =
18bef2bb34STarun Prabhu fir::SequenceType::get(fir::SequenceType::Shape(1, 10), realTy);
19bef2bb34STarun Prabhu mlir::Value result = builder.create<fir::UndefOp>(loc, seqTy);
20bef2bb34STarun Prabhu mlir::Value n1 = builder.create<fir::UndefOp>(loc, i32Ty);
21bef2bb34STarun Prabhu mlir::Value n2 = builder.create<fir::UndefOp>(loc, i32Ty);
22bef2bb34STarun Prabhu mlir::Value x = builder.create<fir::UndefOp>(loc, realTy);
23bef2bb34STarun Prabhu mlir::Value bn1 = builder.create<fir::UndefOp>(loc, realTy);
24bef2bb34STarun Prabhu mlir::Value bn2 = builder.create<fir::UndefOp>(loc, realTy);
25bef2bb34STarun Prabhu fir::runtime::genBesselJn(builder, loc, result, n1, n2, x, bn1, bn2);
26bef2bb34STarun Prabhu checkCallOpFromResultBox(result, fctName, 6);
27bef2bb34STarun Prabhu }
28bef2bb34STarun Prabhu
TEST_F(RuntimeCallTest,genBesselJnTest)29bef2bb34STarun Prabhu TEST_F(RuntimeCallTest, genBesselJnTest) {
30bef2bb34STarun Prabhu testGenBesselJn(*firBuilder, f32Ty, "_FortranABesselJn_4");
31bef2bb34STarun Prabhu testGenBesselJn(*firBuilder, f64Ty, "_FortranABesselJn_8");
32bef2bb34STarun Prabhu testGenBesselJn(*firBuilder, f80Ty, "_FortranABesselJn_10");
33bef2bb34STarun Prabhu testGenBesselJn(*firBuilder, f128Ty, "_FortranABesselJn_16");
34bef2bb34STarun Prabhu }
35bef2bb34STarun Prabhu
testGenBesselJnX0(fir::FirOpBuilder & builder,mlir::Type realTy,llvm::StringRef fctName)36bef2bb34STarun Prabhu void testGenBesselJnX0(
37bef2bb34STarun Prabhu fir::FirOpBuilder &builder, mlir::Type realTy, llvm::StringRef fctName) {
38bef2bb34STarun Prabhu mlir::Location loc = builder.getUnknownLoc();
39bef2bb34STarun Prabhu mlir::Type i32Ty = builder.getIntegerType(32);
40bef2bb34STarun Prabhu mlir::Type seqTy =
41bef2bb34STarun Prabhu fir::SequenceType::get(fir::SequenceType::Shape(1, 10), realTy);
42bef2bb34STarun Prabhu mlir::Value result = builder.create<fir::UndefOp>(loc, seqTy);
43bef2bb34STarun Prabhu mlir::Value n1 = builder.create<fir::UndefOp>(loc, i32Ty);
44bef2bb34STarun Prabhu mlir::Value n2 = builder.create<fir::UndefOp>(loc, i32Ty);
45bef2bb34STarun Prabhu fir::runtime::genBesselJnX0(builder, loc, realTy, result, n1, n2);
46bef2bb34STarun Prabhu checkCallOpFromResultBox(result, fctName, 3);
47bef2bb34STarun Prabhu }
48bef2bb34STarun Prabhu
TEST_F(RuntimeCallTest,genBesselJnX0Test)49bef2bb34STarun Prabhu TEST_F(RuntimeCallTest, genBesselJnX0Test) {
50bef2bb34STarun Prabhu testGenBesselJnX0(*firBuilder, f32Ty, "_FortranABesselJnX0_4");
51bef2bb34STarun Prabhu testGenBesselJnX0(*firBuilder, f64Ty, "_FortranABesselJnX0_8");
52bef2bb34STarun Prabhu testGenBesselJnX0(*firBuilder, f80Ty, "_FortranABesselJnX0_10");
53bef2bb34STarun Prabhu testGenBesselJnX0(*firBuilder, f128Ty, "_FortranABesselJnX0_16");
54bef2bb34STarun Prabhu }
55bef2bb34STarun Prabhu
testGenBesselYn(fir::FirOpBuilder & builder,mlir::Type realTy,llvm::StringRef fctName)56bef2bb34STarun Prabhu void testGenBesselYn(
57bef2bb34STarun Prabhu fir::FirOpBuilder &builder, mlir::Type realTy, llvm::StringRef fctName) {
58bef2bb34STarun Prabhu mlir::Location loc = builder.getUnknownLoc();
59bef2bb34STarun Prabhu mlir::Type i32Ty = builder.getIntegerType(32);
60bef2bb34STarun Prabhu mlir::Type seqTy =
61bef2bb34STarun Prabhu fir::SequenceType::get(fir::SequenceType::Shape(1, 10), realTy);
62bef2bb34STarun Prabhu mlir::Value result = builder.create<fir::UndefOp>(loc, seqTy);
63bef2bb34STarun Prabhu mlir::Value n1 = builder.create<fir::UndefOp>(loc, i32Ty);
64bef2bb34STarun Prabhu mlir::Value n2 = builder.create<fir::UndefOp>(loc, i32Ty);
65bef2bb34STarun Prabhu mlir::Value x = builder.create<fir::UndefOp>(loc, realTy);
66bef2bb34STarun Prabhu mlir::Value bn1 = builder.create<fir::UndefOp>(loc, realTy);
67bef2bb34STarun Prabhu mlir::Value bn2 = builder.create<fir::UndefOp>(loc, realTy);
68bef2bb34STarun Prabhu fir::runtime::genBesselYn(builder, loc, result, n1, n2, x, bn1, bn2);
69bef2bb34STarun Prabhu checkCallOpFromResultBox(result, fctName, 6);
70bef2bb34STarun Prabhu }
71bef2bb34STarun Prabhu
TEST_F(RuntimeCallTest,genBesselYnTest)72bef2bb34STarun Prabhu TEST_F(RuntimeCallTest, genBesselYnTest) {
73bef2bb34STarun Prabhu testGenBesselYn(*firBuilder, f32Ty, "_FortranABesselYn_4");
74bef2bb34STarun Prabhu testGenBesselYn(*firBuilder, f64Ty, "_FortranABesselYn_8");
75bef2bb34STarun Prabhu testGenBesselYn(*firBuilder, f80Ty, "_FortranABesselYn_10");
76bef2bb34STarun Prabhu testGenBesselYn(*firBuilder, f128Ty, "_FortranABesselYn_16");
77bef2bb34STarun Prabhu }
78bef2bb34STarun Prabhu
testGenBesselYnX0(fir::FirOpBuilder & builder,mlir::Type realTy,llvm::StringRef fctName)79bef2bb34STarun Prabhu void testGenBesselYnX0(
80bef2bb34STarun Prabhu fir::FirOpBuilder &builder, mlir::Type realTy, llvm::StringRef fctName) {
81bef2bb34STarun Prabhu mlir::Location loc = builder.getUnknownLoc();
82bef2bb34STarun Prabhu mlir::Type i32Ty = builder.getIntegerType(32);
83bef2bb34STarun Prabhu mlir::Type seqTy =
84bef2bb34STarun Prabhu fir::SequenceType::get(fir::SequenceType::Shape(1, 10), realTy);
85bef2bb34STarun Prabhu mlir::Value result = builder.create<fir::UndefOp>(loc, seqTy);
86bef2bb34STarun Prabhu mlir::Value n1 = builder.create<fir::UndefOp>(loc, i32Ty);
87bef2bb34STarun Prabhu mlir::Value n2 = builder.create<fir::UndefOp>(loc, i32Ty);
88bef2bb34STarun Prabhu fir::runtime::genBesselYnX0(builder, loc, realTy, result, n1, n2);
89bef2bb34STarun Prabhu checkCallOpFromResultBox(result, fctName, 3);
90bef2bb34STarun Prabhu }
91bef2bb34STarun Prabhu
TEST_F(RuntimeCallTest,genBesselYnX0Test)92bef2bb34STarun Prabhu TEST_F(RuntimeCallTest, genBesselYnX0Test) {
93bef2bb34STarun Prabhu testGenBesselYnX0(*firBuilder, f32Ty, "_FortranABesselYnX0_4");
94bef2bb34STarun Prabhu testGenBesselYnX0(*firBuilder, f64Ty, "_FortranABesselYnX0_8");
95bef2bb34STarun Prabhu testGenBesselYnX0(*firBuilder, f80Ty, "_FortranABesselYnX0_10");
96bef2bb34STarun Prabhu testGenBesselYnX0(*firBuilder, f128Ty, "_FortranABesselYnX0_16");
97bef2bb34STarun Prabhu }
98bef2bb34STarun Prabhu
TEST_F(RuntimeCallTest,genCshiftTest)9918452d1fSValentin Clement TEST_F(RuntimeCallTest, genCshiftTest) {
10018452d1fSValentin Clement auto loc = firBuilder->getUnknownLoc();
10118452d1fSValentin Clement mlir::Type seqTy =
10218452d1fSValentin Clement fir::SequenceType::get(fir::SequenceType::Shape(1, 10), i32Ty);
10318452d1fSValentin Clement mlir::Value result = firBuilder->create<fir::UndefOp>(loc, seqTy);
10418452d1fSValentin Clement mlir::Value array = firBuilder->create<fir::UndefOp>(loc, seqTy);
10518452d1fSValentin Clement mlir::Value shift = firBuilder->create<fir::UndefOp>(loc, seqTy);
10618452d1fSValentin Clement mlir::Value dim = firBuilder->create<fir::UndefOp>(loc, seqTy);
10718452d1fSValentin Clement fir::runtime::genCshift(*firBuilder, loc, result, array, shift, dim);
10818452d1fSValentin Clement checkCallOpFromResultBox(result, "_FortranACshift", 4);
10918452d1fSValentin Clement }
11018452d1fSValentin Clement
TEST_F(RuntimeCallTest,genCshiftVectorTest)11118452d1fSValentin Clement TEST_F(RuntimeCallTest, genCshiftVectorTest) {
11218452d1fSValentin Clement auto loc = firBuilder->getUnknownLoc();
11318452d1fSValentin Clement mlir::Type seqTy =
11418452d1fSValentin Clement fir::SequenceType::get(fir::SequenceType::Shape(1, 10), i32Ty);
11518452d1fSValentin Clement mlir::Value result = firBuilder->create<fir::UndefOp>(loc, seqTy);
11618452d1fSValentin Clement mlir::Value array = firBuilder->create<fir::UndefOp>(loc, seqTy);
11718452d1fSValentin Clement mlir::Value shift = firBuilder->create<fir::UndefOp>(loc, seqTy);
11818452d1fSValentin Clement fir::runtime::genCshiftVector(*firBuilder, loc, result, array, shift);
11918452d1fSValentin Clement checkCallOpFromResultBox(result, "_FortranACshiftVector", 3);
12018452d1fSValentin Clement }
12118452d1fSValentin Clement
TEST_F(RuntimeCallTest,genEoshiftTest)12218452d1fSValentin Clement TEST_F(RuntimeCallTest, genEoshiftTest) {
12318452d1fSValentin Clement auto loc = firBuilder->getUnknownLoc();
12418452d1fSValentin Clement mlir::Type seqTy =
12518452d1fSValentin Clement fir::SequenceType::get(fir::SequenceType::Shape(1, 10), i32Ty);
12618452d1fSValentin Clement mlir::Value result = firBuilder->create<fir::UndefOp>(loc, seqTy);
12718452d1fSValentin Clement mlir::Value array = firBuilder->create<fir::UndefOp>(loc, seqTy);
12818452d1fSValentin Clement mlir::Value shift = firBuilder->create<fir::UndefOp>(loc, seqTy);
12918452d1fSValentin Clement mlir::Value bound = firBuilder->create<fir::UndefOp>(loc, seqTy);
13018452d1fSValentin Clement mlir::Value dim = firBuilder->create<fir::UndefOp>(loc, seqTy);
13118452d1fSValentin Clement fir::runtime::genEoshift(*firBuilder, loc, result, array, shift, bound, dim);
13218452d1fSValentin Clement checkCallOpFromResultBox(result, "_FortranAEoshift", 5);
13318452d1fSValentin Clement }
13418452d1fSValentin Clement
TEST_F(RuntimeCallTest,genEoshiftVectorTest)13518452d1fSValentin Clement TEST_F(RuntimeCallTest, genEoshiftVectorTest) {
13618452d1fSValentin Clement auto loc = firBuilder->getUnknownLoc();
13718452d1fSValentin Clement mlir::Type seqTy =
13818452d1fSValentin Clement fir::SequenceType::get(fir::SequenceType::Shape(1, 10), i32Ty);
13918452d1fSValentin Clement mlir::Value result = firBuilder->create<fir::UndefOp>(loc, seqTy);
14018452d1fSValentin Clement mlir::Value array = firBuilder->create<fir::UndefOp>(loc, seqTy);
14118452d1fSValentin Clement mlir::Value shift = firBuilder->create<fir::UndefOp>(loc, seqTy);
14218452d1fSValentin Clement mlir::Value bound = firBuilder->create<fir::UndefOp>(loc, seqTy);
14318452d1fSValentin Clement fir::runtime::genEoshiftVector(*firBuilder, loc, result, array, shift, bound);
14418452d1fSValentin Clement checkCallOpFromResultBox(result, "_FortranAEoshiftVector", 4);
14518452d1fSValentin Clement }
14618452d1fSValentin Clement
testGenMatmul(fir::FirOpBuilder & builder,mlir::Type eleTy1,mlir::Type eleTy2,llvm::StringRef funcName)147*8ce1aed5SSlava Zakharin void testGenMatmul(fir::FirOpBuilder &builder, mlir::Type eleTy1,
148*8ce1aed5SSlava Zakharin mlir::Type eleTy2, llvm::StringRef funcName) {
149*8ce1aed5SSlava Zakharin auto loc = builder.getUnknownLoc();
150*8ce1aed5SSlava Zakharin mlir::Type resultTy =
151*8ce1aed5SSlava Zakharin fir::ReferenceType::get(fir::BoxType::get(builder.getNoneType()));
152*8ce1aed5SSlava Zakharin mlir::Type seqTy1 =
153*8ce1aed5SSlava Zakharin fir::SequenceType::get(fir::SequenceType::Shape(2, 10), eleTy1);
154*8ce1aed5SSlava Zakharin mlir::Type seqTy2 =
155*8ce1aed5SSlava Zakharin fir::SequenceType::get(fir::SequenceType::Shape(2, 10), eleTy2);
156*8ce1aed5SSlava Zakharin mlir::Type boxTy1 = fir::BoxType::get(seqTy1);
157*8ce1aed5SSlava Zakharin mlir::Type boxTy2 = fir::BoxType::get(seqTy2);
158*8ce1aed5SSlava Zakharin mlir::Value result = builder.create<fir::UndefOp>(loc, resultTy);
159*8ce1aed5SSlava Zakharin mlir::Value matrixA = builder.create<fir::UndefOp>(loc, boxTy1);
160*8ce1aed5SSlava Zakharin mlir::Value matrixB = builder.create<fir::UndefOp>(loc, boxTy2);
161*8ce1aed5SSlava Zakharin fir::runtime::genMatmul(builder, loc, result, matrixA, matrixB);
162*8ce1aed5SSlava Zakharin checkCallOpFromResultBox(result, funcName, 3);
163*8ce1aed5SSlava Zakharin }
164*8ce1aed5SSlava Zakharin
TEST_F(RuntimeCallTest,genMatmulTest)16518452d1fSValentin Clement TEST_F(RuntimeCallTest, genMatmulTest) {
166*8ce1aed5SSlava Zakharin testGenMatmul(*firBuilder, i32Ty, i16Ty, "_FortranAMatmulInteger4Integer2");
167*8ce1aed5SSlava Zakharin testGenMatmul(*firBuilder, i32Ty, f64Ty, "_FortranAMatmulInteger4Real8");
168*8ce1aed5SSlava Zakharin testGenMatmul(*firBuilder, i32Ty, c8Ty, "_FortranAMatmulInteger4Complex8");
169*8ce1aed5SSlava Zakharin testGenMatmul(*firBuilder, f32Ty, i16Ty, "_FortranAMatmulReal4Integer2");
170*8ce1aed5SSlava Zakharin testGenMatmul(*firBuilder, f32Ty, f64Ty, "_FortranAMatmulReal4Real8");
171*8ce1aed5SSlava Zakharin testGenMatmul(*firBuilder, f32Ty, c8Ty, "_FortranAMatmulReal4Complex8");
172*8ce1aed5SSlava Zakharin testGenMatmul(*firBuilder, c4Ty, i16Ty, "_FortranAMatmulComplex4Integer2");
173*8ce1aed5SSlava Zakharin testGenMatmul(*firBuilder, c4Ty, f64Ty, "_FortranAMatmulComplex4Real8");
174*8ce1aed5SSlava Zakharin testGenMatmul(*firBuilder, c4Ty, c8Ty, "_FortranAMatmulComplex4Complex8");
175*8ce1aed5SSlava Zakharin testGenMatmul(*firBuilder, f80Ty, f128Ty, "_FortranAMatmulReal10Real16");
176*8ce1aed5SSlava Zakharin testGenMatmul(*firBuilder, f80Ty, i128Ty, "_FortranAMatmulReal10Integer16");
177*8ce1aed5SSlava Zakharin testGenMatmul(*firBuilder, f128Ty, i128Ty, "_FortranAMatmulReal16Integer16");
178*8ce1aed5SSlava Zakharin testGenMatmul(
179*8ce1aed5SSlava Zakharin *firBuilder, logical1Ty, logical2Ty, "_FortranAMatmulLogical1Logical2");
180*8ce1aed5SSlava Zakharin testGenMatmul(
181*8ce1aed5SSlava Zakharin *firBuilder, logical4Ty, logical8Ty, "_FortranAMatmulLogical4Logical8");
18218452d1fSValentin Clement }
18318452d1fSValentin Clement
TEST_F(RuntimeCallTest,genPackTest)18418452d1fSValentin Clement TEST_F(RuntimeCallTest, genPackTest) {
18518452d1fSValentin Clement auto loc = firBuilder->getUnknownLoc();
18618452d1fSValentin Clement mlir::Type seqTy =
18718452d1fSValentin Clement fir::SequenceType::get(fir::SequenceType::Shape(1, 10), i32Ty);
18818452d1fSValentin Clement mlir::Value result = firBuilder->create<fir::UndefOp>(loc, seqTy);
18918452d1fSValentin Clement mlir::Value array = firBuilder->create<fir::UndefOp>(loc, seqTy);
19018452d1fSValentin Clement mlir::Value mask = firBuilder->create<fir::UndefOp>(loc, seqTy);
19118452d1fSValentin Clement mlir::Value vector = firBuilder->create<fir::UndefOp>(loc, seqTy);
19218452d1fSValentin Clement fir::runtime::genPack(*firBuilder, loc, result, array, mask, vector);
19318452d1fSValentin Clement checkCallOpFromResultBox(result, "_FortranAPack", 4);
19418452d1fSValentin Clement }
19518452d1fSValentin Clement
TEST_F(RuntimeCallTest,genReshapeTest)19618452d1fSValentin Clement TEST_F(RuntimeCallTest, genReshapeTest) {
19718452d1fSValentin Clement auto loc = firBuilder->getUnknownLoc();
19818452d1fSValentin Clement mlir::Type seqTy =
19918452d1fSValentin Clement fir::SequenceType::get(fir::SequenceType::Shape(1, 10), i32Ty);
20018452d1fSValentin Clement mlir::Value result = firBuilder->create<fir::UndefOp>(loc, seqTy);
20118452d1fSValentin Clement mlir::Value source = firBuilder->create<fir::UndefOp>(loc, seqTy);
20218452d1fSValentin Clement mlir::Value shape = firBuilder->create<fir::UndefOp>(loc, seqTy);
20318452d1fSValentin Clement mlir::Value pad = firBuilder->create<fir::UndefOp>(loc, seqTy);
20418452d1fSValentin Clement mlir::Value order = firBuilder->create<fir::UndefOp>(loc, seqTy);
20518452d1fSValentin Clement fir::runtime::genReshape(*firBuilder, loc, result, source, shape, pad, order);
20618452d1fSValentin Clement checkCallOpFromResultBox(result, "_FortranAReshape", 5);
20718452d1fSValentin Clement }
20818452d1fSValentin Clement
TEST_F(RuntimeCallTest,genSpreadTest)20918452d1fSValentin Clement TEST_F(RuntimeCallTest, genSpreadTest) {
21018452d1fSValentin Clement auto loc = firBuilder->getUnknownLoc();
21118452d1fSValentin Clement mlir::Type seqTy =
21218452d1fSValentin Clement fir::SequenceType::get(fir::SequenceType::Shape(1, 10), i32Ty);
21318452d1fSValentin Clement mlir::Value result = firBuilder->create<fir::UndefOp>(loc, seqTy);
21418452d1fSValentin Clement mlir::Value source = firBuilder->create<fir::UndefOp>(loc, seqTy);
21518452d1fSValentin Clement mlir::Value dim = firBuilder->create<fir::UndefOp>(loc, seqTy);
21618452d1fSValentin Clement mlir::Value ncopies = firBuilder->create<fir::UndefOp>(loc, seqTy);
21718452d1fSValentin Clement fir::runtime::genSpread(*firBuilder, loc, result, source, dim, ncopies);
21818452d1fSValentin Clement checkCallOpFromResultBox(result, "_FortranASpread", 4);
21918452d1fSValentin Clement }
22018452d1fSValentin Clement
TEST_F(RuntimeCallTest,genTransposeTest)22118452d1fSValentin Clement TEST_F(RuntimeCallTest, genTransposeTest) {
22218452d1fSValentin Clement auto loc = firBuilder->getUnknownLoc();
22318452d1fSValentin Clement mlir::Type seqTy =
22418452d1fSValentin Clement fir::SequenceType::get(fir::SequenceType::Shape(1, 10), i32Ty);
22518452d1fSValentin Clement mlir::Value result = firBuilder->create<fir::UndefOp>(loc, seqTy);
22618452d1fSValentin Clement mlir::Value source = firBuilder->create<fir::UndefOp>(loc, seqTy);
22718452d1fSValentin Clement fir::runtime::genTranspose(*firBuilder, loc, result, source);
22818452d1fSValentin Clement checkCallOpFromResultBox(result, "_FortranATranspose", 2);
22918452d1fSValentin Clement }
23018452d1fSValentin Clement
TEST_F(RuntimeCallTest,genUnpack)23118452d1fSValentin Clement TEST_F(RuntimeCallTest, genUnpack) {
23218452d1fSValentin Clement auto loc = firBuilder->getUnknownLoc();
23318452d1fSValentin Clement mlir::Type seqTy =
23418452d1fSValentin Clement fir::SequenceType::get(fir::SequenceType::Shape(1, 10), i32Ty);
23518452d1fSValentin Clement mlir::Value result = firBuilder->create<fir::UndefOp>(loc, seqTy);
23618452d1fSValentin Clement mlir::Value vector = firBuilder->create<fir::UndefOp>(loc, seqTy);
23718452d1fSValentin Clement mlir::Value mask = firBuilder->create<fir::UndefOp>(loc, seqTy);
23818452d1fSValentin Clement mlir::Value field = firBuilder->create<fir::UndefOp>(loc, seqTy);
23918452d1fSValentin Clement fir::runtime::genUnpack(*firBuilder, loc, result, vector, mask, field);
24018452d1fSValentin Clement checkCallOpFromResultBox(result, "_FortranAUnpack", 4);
24118452d1fSValentin Clement }
242