diff options
Diffstat (limited to 'test/example/c-api-kitchen-sink.c')
-rw-r--r-- | test/example/c-api-kitchen-sink.c | 196 |
1 files changed, 195 insertions, 1 deletions
diff --git a/test/example/c-api-kitchen-sink.c b/test/example/c-api-kitchen-sink.c index d056d0e75..cf2ce6c04 100644 --- a/test/example/c-api-kitchen-sink.c +++ b/test/example/c-api-kitchen-sink.c @@ -15,11 +15,14 @@ // helpers +static const uint8_t v128_bytes[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; + BinaryenExpressionRef makeUnary(BinaryenModuleRef module, BinaryenOp op, BinaryenType inputType) { if (inputType == BinaryenTypeInt32()) return BinaryenUnary(module, op, BinaryenConst(module, BinaryenLiteralInt32(-10))); if (inputType == BinaryenTypeInt64()) return BinaryenUnary(module, op, BinaryenConst(module, BinaryenLiteralInt64(-22))); if (inputType == BinaryenTypeFloat32()) return BinaryenUnary(module, op, BinaryenConst(module, BinaryenLiteralFloat32(-33.612f))); if (inputType == BinaryenTypeFloat64()) return BinaryenUnary(module, op, BinaryenConst(module, BinaryenLiteralFloat64(-9005.841))); + if (inputType == BinaryenTypeVec128()) return BinaryenUnary(module, op, BinaryenConst(module, BinaryenLiteralVec128(v128_bytes))); abort(); } @@ -41,6 +44,10 @@ BinaryenExpressionRef makeBinary(BinaryenModuleRef module, BinaryenOp op, Binary BinaryenExpressionRef temp = BinaryenConst(module, BinaryenLiteralFloat64(-9007.333)); return BinaryenBinary(module, op, BinaryenConst(module, BinaryenLiteralFloat64(-9005.841)), temp); } + if (type == BinaryenTypeVec128()) { + BinaryenExpressionRef temp = BinaryenConst(module, BinaryenLiteralVec128(v128_bytes)); + return BinaryenBinary(module, op, BinaryenConst(module, BinaryenLiteralVec128(v128_bytes)), temp); + } abort(); } @@ -60,6 +67,10 @@ BinaryenExpressionRef makeFloat64(BinaryenModuleRef module, double x) { return BinaryenConst(module, BinaryenLiteralFloat64(x)); } +BinaryenExpressionRef makeVec128(BinaryenModuleRef module, uint8_t const *bytes) { + return BinaryenConst(module, BinaryenLiteralVec128(bytes)); +} + BinaryenExpressionRef makeSomething(BinaryenModuleRef module) { return makeInt32(module, 1337); } @@ -68,6 +79,48 @@ BinaryenExpressionRef makeDroppedInt32(BinaryenModuleRef module, int x) { return BinaryenDrop(module, BinaryenConst(module, BinaryenLiteralInt32(x))); } +BinaryenExpressionRef makeSIMDExtract(BinaryenModuleRef module, BinaryenOp op) { + return BinaryenSIMDExtract(module, op, makeVec128(module, v128_bytes), 0); +} + +BinaryenExpressionRef makeSIMDReplace(BinaryenModuleRef module, BinaryenOp op, BinaryenType type) { + BinaryenExpressionRef val; + if (type == BinaryenTypeInt32()) { + val = makeInt32(module, 42); + } + if (type == BinaryenTypeInt64()) { + val = makeInt64(module, 42); + } + if (type == BinaryenTypeFloat32()) { + val = makeFloat32(module, 42.); + } + if (type == BinaryenTypeFloat64()) { + val = makeFloat64(module, 42.); + } + if (!val) { + abort(); + } + return BinaryenSIMDReplace(module, op, makeVec128(module, v128_bytes), 0, val); +} + +BinaryenExpressionRef makeSIMDShuffle(BinaryenModuleRef module) { + BinaryenExpressionRef left = makeVec128(module, v128_bytes); + BinaryenExpressionRef right = makeVec128(module, v128_bytes); + return BinaryenSIMDShuffle(module, left, right, (uint8_t[16]) {}); +} + +BinaryenExpressionRef makeSIMDBitselect(BinaryenModuleRef module) { + BinaryenExpressionRef left = makeVec128(module, v128_bytes); + BinaryenExpressionRef right = makeVec128(module, v128_bytes); + BinaryenExpressionRef cond = makeVec128(module, v128_bytes); + return BinaryenSIMDBitselect(module, left, right, cond); +} + +BinaryenExpressionRef makeSIMDShift(BinaryenModuleRef module, BinaryenOp op) { + BinaryenExpressionRef vec = makeVec128(module, v128_bytes); + return BinaryenSIMDShift(module, op, vec, makeInt32(module, 1)); +} + // tests void test_types() { @@ -94,7 +147,8 @@ void test_core() { constF32 = BinaryenConst(module, BinaryenLiteralFloat32(3.14f)), constF64 = BinaryenConst(module, BinaryenLiteralFloat64(2.1828)), constF32Bits = BinaryenConst(module, BinaryenLiteralFloat32Bits(0xffff1234)), - constF64Bits = BinaryenConst(module, BinaryenLiteralFloat64Bits(0xffff12345678abcdLL)); + constF64Bits = BinaryenConst(module, BinaryenLiteralFloat64Bits(0xffff12345678abcdLL)), + constV128 = BinaryenConst(module, BinaryenLiteralVec128(v128_bytes)); const char* switchValueNames[] = { "the-value" }; const char* switchBodyNames[] = { "the-nothing" }; @@ -160,6 +214,39 @@ void test_core() { makeUnary(module, BinaryenDemoteFloat64(), 4), makeUnary(module, BinaryenReinterpretInt32(), 1), makeUnary(module, BinaryenReinterpretInt64(), 2), + makeUnary(module, BinaryenSplatVecI8x16(), 1), + makeUnary(module, BinaryenSplatVecI16x8(), 1), + makeUnary(module, BinaryenSplatVecI32x4(), 1), + makeUnary(module, BinaryenSplatVecI64x2(), 2), + makeUnary(module, BinaryenSplatVecF32x4(), 3), + makeUnary(module, BinaryenSplatVecF64x2(), 4), + makeUnary(module, BinaryenNotVec128(), 5), + makeUnary(module, BinaryenNegVecI8x16(), 5), + makeUnary(module, BinaryenAnyTrueVecI8x16(), 5), + makeUnary(module, BinaryenAllTrueVecI8x16(), 5), + makeUnary(module, BinaryenNegVecI16x8(), 5), + makeUnary(module, BinaryenAnyTrueVecI16x8(), 5), + makeUnary(module, BinaryenAllTrueVecI16x8(), 5), + makeUnary(module, BinaryenNegVecI32x4(), 5), + makeUnary(module, BinaryenAnyTrueVecI32x4(), 5), + makeUnary(module, BinaryenAllTrueVecI32x4(), 5), + makeUnary(module, BinaryenNegVecI64x2(), 5), + makeUnary(module, BinaryenAnyTrueVecI64x2(), 5), + makeUnary(module, BinaryenAllTrueVecI64x2(), 5), + makeUnary(module, BinaryenAbsVecF32x4(), 5), + makeUnary(module, BinaryenNegVecF32x4(), 5), + makeUnary(module, BinaryenSqrtVecF32x4(), 5), + makeUnary(module, BinaryenAbsVecF64x2(), 5), + makeUnary(module, BinaryenNegVecF64x2(), 5), + makeUnary(module, BinaryenSqrtVecF64x2(), 5), + makeUnary(module, BinaryenTruncSatSVecF32x4ToVecI32x4(), 5), + makeUnary(module, BinaryenTruncSatUVecF32x4ToVecI32x4(), 5), + makeUnary(module, BinaryenTruncSatSVecF64x2ToVecI64x2(), 5), + makeUnary(module, BinaryenTruncSatUVecF64x2ToVecI64x2(), 5), + makeUnary(module, BinaryenConvertSVecI32x4ToVecF32x4(), 5), + makeUnary(module, BinaryenConvertUVecI32x4ToVecF32x4(), 5), + makeUnary(module, BinaryenConvertSVecI64x2ToVecF64x2(), 5), + makeUnary(module, BinaryenConvertUVecI64x2ToVecF64x2(), 5), // Binary makeBinary(module, BinaryenAddInt32(), 1), makeBinary(module, BinaryenSubFloat64(), 4), @@ -193,6 +280,113 @@ void test_core() { makeBinary(module, BinaryenLeFloat64(), 4), makeBinary(module, BinaryenGtFloat64(), 4), makeBinary(module, BinaryenGeFloat32(), 3), + makeBinary(module, BinaryenEqVecI8x16(), 5), + makeBinary(module, BinaryenNeVecI8x16(), 5), + makeBinary(module, BinaryenLtSVecI8x16(), 5), + makeBinary(module, BinaryenLtUVecI8x16(), 5), + makeBinary(module, BinaryenGtSVecI8x16(), 5), + makeBinary(module, BinaryenGtUVecI8x16(), 5), + makeBinary(module, BinaryenLeSVecI8x16(), 5), + makeBinary(module, BinaryenLeUVecI8x16(), 5), + makeBinary(module, BinaryenGeSVecI8x16(), 5), + makeBinary(module, BinaryenGeUVecI8x16(), 5), + makeBinary(module, BinaryenEqVecI16x8(), 5), + makeBinary(module, BinaryenNeVecI16x8(), 5), + makeBinary(module, BinaryenLtSVecI16x8(), 5), + makeBinary(module, BinaryenLtUVecI16x8(), 5), + makeBinary(module, BinaryenGtSVecI16x8(), 5), + makeBinary(module, BinaryenGtUVecI16x8(), 5), + makeBinary(module, BinaryenLeSVecI16x8(), 5), + makeBinary(module, BinaryenLeUVecI16x8(), 5), + makeBinary(module, BinaryenGeSVecI16x8(), 5), + makeBinary(module, BinaryenGeUVecI16x8(), 5), + makeBinary(module, BinaryenEqVecI32x4(), 5), + makeBinary(module, BinaryenNeVecI32x4(), 5), + makeBinary(module, BinaryenLtSVecI32x4(), 5), + makeBinary(module, BinaryenLtUVecI32x4(), 5), + makeBinary(module, BinaryenGtSVecI32x4(), 5), + makeBinary(module, BinaryenGtUVecI32x4(), 5), + makeBinary(module, BinaryenLeSVecI32x4(), 5), + makeBinary(module, BinaryenLeUVecI32x4(), 5), + makeBinary(module, BinaryenGeSVecI32x4(), 5), + makeBinary(module, BinaryenGeUVecI32x4(), 5), + makeBinary(module, BinaryenEqVecF32x4(), 5), + makeBinary(module, BinaryenNeVecF32x4(), 5), + makeBinary(module, BinaryenLtVecF32x4(), 5), + makeBinary(module, BinaryenGtVecF32x4(), 5), + makeBinary(module, BinaryenLeVecF32x4(), 5), + makeBinary(module, BinaryenGeVecF32x4(), 5), + makeBinary(module, BinaryenEqVecF64x2(), 5), + makeBinary(module, BinaryenNeVecF64x2(), 5), + makeBinary(module, BinaryenLtVecF64x2(), 5), + makeBinary(module, BinaryenGtVecF64x2(), 5), + makeBinary(module, BinaryenLeVecF64x2(), 5), + makeBinary(module, BinaryenGeVecF64x2(), 5), + makeBinary(module, BinaryenAndVec128(), 5), + makeBinary(module, BinaryenOrVec128(), 5), + makeBinary(module, BinaryenXorVec128(), 5), + makeBinary(module, BinaryenAddVecI8x16(), 5), + makeBinary(module, BinaryenAddSatSVecI8x16(), 5), + makeBinary(module, BinaryenAddSatUVecI8x16(), 5), + makeBinary(module, BinaryenSubVecI8x16(), 5), + makeBinary(module, BinaryenSubSatSVecI8x16(), 5), + makeBinary(module, BinaryenSubSatUVecI8x16(), 5), + makeBinary(module, BinaryenMulVecI8x16(), 5), + makeBinary(module, BinaryenAddVecI16x8(), 5), + makeBinary(module, BinaryenAddSatSVecI16x8(), 5), + makeBinary(module, BinaryenAddSatUVecI16x8(), 5), + makeBinary(module, BinaryenSubVecI16x8(), 5), + makeBinary(module, BinaryenSubSatSVecI16x8(), 5), + makeBinary(module, BinaryenSubSatUVecI16x8(), 5), + makeBinary(module, BinaryenMulVecI16x8(), 5), + makeBinary(module, BinaryenAddVecI32x4(), 5), + makeBinary(module, BinaryenSubVecI32x4(), 5), + makeBinary(module, BinaryenMulVecI32x4(), 5), + makeBinary(module, BinaryenAddVecI64x2(), 5), + makeBinary(module, BinaryenSubVecI64x2(), 5), + makeBinary(module, BinaryenAddVecF32x4(), 5), + makeBinary(module, BinaryenSubVecF32x4(), 5), + makeBinary(module, BinaryenMulVecF32x4(), 5), + makeBinary(module, BinaryenDivVecF32x4(), 5), + makeBinary(module, BinaryenMinVecF32x4(), 5), + makeBinary(module, BinaryenMaxVecF32x4(), 5), + makeBinary(module, BinaryenAddVecF64x2(), 5), + makeBinary(module, BinaryenSubVecF64x2(), 5), + makeBinary(module, BinaryenMulVecF64x2(), 5), + makeBinary(module, BinaryenDivVecF64x2(), 5), + makeBinary(module, BinaryenMinVecF64x2(), 5), + makeBinary(module, BinaryenMaxVecF64x2(), 5), + // SIMD lane manipulation + makeSIMDExtract(module, BinaryenExtractLaneSVecI8x16()), + makeSIMDExtract(module, BinaryenExtractLaneUVecI8x16()), + makeSIMDExtract(module, BinaryenExtractLaneSVecI16x8()), + makeSIMDExtract(module, BinaryenExtractLaneUVecI16x8()), + makeSIMDExtract(module, BinaryenExtractLaneVecI32x4()), + makeSIMDExtract(module, BinaryenExtractLaneVecI64x2()), + makeSIMDExtract(module, BinaryenExtractLaneVecF32x4()), + makeSIMDExtract(module, BinaryenExtractLaneVecF64x2()), + makeSIMDReplace(module, BinaryenReplaceLaneVecI8x16(), 1), + makeSIMDReplace(module, BinaryenReplaceLaneVecI16x8(), 1), + makeSIMDReplace(module, BinaryenReplaceLaneVecI32x4(), 1), + makeSIMDReplace(module, BinaryenReplaceLaneVecI64x2(), 2), + makeSIMDReplace(module, BinaryenReplaceLaneVecF32x4(), 3), + makeSIMDReplace(module, BinaryenReplaceLaneVecF64x2(), 4), + // SIMD shift + makeSIMDShift(module, BinaryenShlVecI8x16()), + makeSIMDShift(module, BinaryenShrSVecI8x16()), + makeSIMDShift(module, BinaryenShrUVecI8x16()), + makeSIMDShift(module, BinaryenShlVecI16x8()), + makeSIMDShift(module, BinaryenShrSVecI16x8()), + makeSIMDShift(module, BinaryenShrUVecI16x8()), + makeSIMDShift(module, BinaryenShlVecI32x4()), + makeSIMDShift(module, BinaryenShrSVecI32x4()), + makeSIMDShift(module, BinaryenShrUVecI32x4()), + makeSIMDShift(module, BinaryenShlVecI64x2()), + makeSIMDShift(module, BinaryenShrSVecI64x2()), + makeSIMDShift(module, BinaryenShrUVecI64x2()), + // Other SIMD + makeSIMDShuffle(module), + makeSIMDBitselect(module), // All the rest BinaryenBlock(module, NULL, NULL, 0, -1), // block with no name and no type BinaryenIf(module, temp1, temp2, temp3), |