Skip to content

Commit cfda51c

Browse files
authored
[C API] Add relaxed SIMD operations (#5482)
Exposes the constants **Unary** * BinaryenRelaxedTruncSVecF32x4ToVecI32x4 * BinaryenRelaxedTruncSVecF32x4ToVecI32x4 * BinaryenRelaxedTruncZeroSVecF64x2ToVecI32x4 * BinaryenRelaxedTruncZeroUVecF64x2ToVecI32x4 **Binary** * BinaryenRelaxedSwizzleVecI8x16 * BinaryenRelaxedMinVecF32x4 * BinaryenRelaxedMaxVecF32x4 * BinaryenRelaxedMinVecF64x2 * BinaryenRelaxedMaxVecF64x2 * BinaryenRelaxedQ15MulrSVecI16x8 * BinaryenDotI8x16I7x16SToVecI16x8 **SIMDTernary** * BinaryenRelaxedFmaVecF32x4 * BinaryenRelaxedFmsVecF32x4 * BinaryenRelaxedFmaVecF64x2 * BinaryenRelaxedFmsVecF64x2 * BinaryenLaneselectI8x16 * BinaryenLaneselectI16x8 * BinaryenLaneselectI32x4 * BinaryenLaneselectI64x2 * BinaryenDotI8x16I7x16AddSToVecI32x4 so the respective instructions can be produced and inspected with the C API.
1 parent 90c726a commit cfda51c

File tree

5 files changed

+221
-0
lines changed

5 files changed

+221
-0
lines changed

src/binaryen-c.cpp

+36
Original file line numberDiff line numberDiff line change
@@ -788,6 +788,17 @@ BinaryenOp BinaryenOrVec128(void) { return OrVec128; }
788788
BinaryenOp BinaryenXorVec128(void) { return XorVec128; }
789789
BinaryenOp BinaryenAndNotVec128(void) { return AndNotVec128; }
790790
BinaryenOp BinaryenBitselectVec128(void) { return Bitselect; }
791+
BinaryenOp BinaryenRelaxedFmaVecF32x4(void) { return RelaxedFmaVecF32x4; }
792+
BinaryenOp BinaryenRelaxedFmsVecF32x4(void) { return RelaxedFmsVecF32x4; }
793+
BinaryenOp BinaryenRelaxedFmaVecF64x2(void) { return RelaxedFmaVecF64x2; }
794+
BinaryenOp BinaryenRelaxedFmsVecF64x2(void) { return RelaxedFmsVecF64x2; }
795+
BinaryenOp BinaryenLaneselectI8x16(void) { return LaneselectI8x16; }
796+
BinaryenOp BinaryenLaneselectI16x8(void) { return LaneselectI16x8; }
797+
BinaryenOp BinaryenLaneselectI32x4(void) { return LaneselectI32x4; }
798+
BinaryenOp BinaryenLaneselectI64x2(void) { return LaneselectI64x2; }
799+
BinaryenOp BinaryenDotI8x16I7x16AddSToVecI32x4(void) {
800+
return DotI8x16I7x16AddSToVecI32x4;
801+
}
791802
BinaryenOp BinaryenAnyTrueVec128(void) { return AnyTrueVec128; }
792803
BinaryenOp BinaryenAbsVecI8x16(void) { return AbsVecI8x16; }
793804
BinaryenOp BinaryenNegVecI8x16(void) { return NegVecI8x16; }
@@ -1007,7 +1018,32 @@ BinaryenOp BinaryenDemoteZeroVecF64x2ToVecF32x4(void) {
10071018
BinaryenOp BinaryenPromoteLowVecF32x4ToVecF64x2(void) {
10081019
return PromoteLowVecF32x4ToVecF64x2;
10091020
}
1021+
BinaryenOp BinaryenRelaxedTruncSVecF32x4ToVecI32x4(void) {
1022+
return RelaxedTruncSVecF32x4ToVecI32x4;
1023+
}
1024+
BinaryenOp BinaryenRelaxedTruncUVecF32x4ToVecI32x4(void) {
1025+
return RelaxedTruncUVecF32x4ToVecI32x4;
1026+
}
1027+
BinaryenOp BinaryenRelaxedTruncZeroSVecF64x2ToVecI32x4(void) {
1028+
return RelaxedTruncZeroSVecF64x2ToVecI32x4;
1029+
}
1030+
BinaryenOp BinaryenRelaxedTruncZeroUVecF64x2ToVecI32x4(void) {
1031+
return RelaxedTruncZeroUVecF64x2ToVecI32x4;
1032+
}
10101033
BinaryenOp BinaryenSwizzleVecI8x16(void) { return SwizzleVecI8x16; }
1034+
BinaryenOp BinaryenRelaxedSwizzleVecI8x16(void) {
1035+
return RelaxedSwizzleVecI8x16;
1036+
}
1037+
BinaryenOp BinaryenRelaxedMinVecF32x4(void) { return RelaxedMinVecF32x4; }
1038+
BinaryenOp BinaryenRelaxedMaxVecF32x4(void) { return RelaxedMaxVecF32x4; }
1039+
BinaryenOp BinaryenRelaxedMinVecF64x2(void) { return RelaxedMinVecF64x2; }
1040+
BinaryenOp BinaryenRelaxedMaxVecF64x2(void) { return RelaxedMaxVecF64x2; }
1041+
BinaryenOp BinaryenRelaxedQ15MulrSVecI16x8(void) {
1042+
return RelaxedQ15MulrSVecI16x8;
1043+
}
1044+
BinaryenOp BinaryenDotI8x16I7x16SToVecI16x8(void) {
1045+
return DotI8x16I7x16SToVecI16x8;
1046+
}
10111047
BinaryenOp BinaryenRefAsNonNull(void) { return RefAsNonNull; }
10121048
BinaryenOp BinaryenRefAsExternInternalize(void) { return ExternInternalize; }
10131049
BinaryenOp BinaryenRefAsExternExternalize(void) { return ExternExternalize; }

src/binaryen-c.h

+20
Original file line numberDiff line numberDiff line change
@@ -512,6 +512,15 @@ BINARYEN_API BinaryenOp BinaryenOrVec128(void);
512512
BINARYEN_API BinaryenOp BinaryenXorVec128(void);
513513
BINARYEN_API BinaryenOp BinaryenAndNotVec128(void);
514514
BINARYEN_API BinaryenOp BinaryenBitselectVec128(void);
515+
BINARYEN_API BinaryenOp BinaryenRelaxedFmaVecF32x4(void);
516+
BINARYEN_API BinaryenOp BinaryenRelaxedFmsVecF32x4(void);
517+
BINARYEN_API BinaryenOp BinaryenRelaxedFmaVecF64x2(void);
518+
BINARYEN_API BinaryenOp BinaryenRelaxedFmsVecF64x2(void);
519+
BINARYEN_API BinaryenOp BinaryenLaneselectI8x16(void);
520+
BINARYEN_API BinaryenOp BinaryenLaneselectI16x8(void);
521+
BINARYEN_API BinaryenOp BinaryenLaneselectI32x4(void);
522+
BINARYEN_API BinaryenOp BinaryenLaneselectI64x2(void);
523+
BINARYEN_API BinaryenOp BinaryenDotI8x16I7x16AddSToVecI32x4(void);
515524
BINARYEN_API BinaryenOp BinaryenAnyTrueVec128(void);
516525
BINARYEN_API BinaryenOp BinaryenPopcntVecI8x16(void);
517526
BINARYEN_API BinaryenOp BinaryenAbsVecI8x16(void);
@@ -669,7 +678,18 @@ BINARYEN_API BinaryenOp BinaryenTruncSatZeroSVecF64x2ToVecI32x4(void);
669678
BINARYEN_API BinaryenOp BinaryenTruncSatZeroUVecF64x2ToVecI32x4(void);
670679
BINARYEN_API BinaryenOp BinaryenDemoteZeroVecF64x2ToVecF32x4(void);
671680
BINARYEN_API BinaryenOp BinaryenPromoteLowVecF32x4ToVecF64x2(void);
681+
BINARYEN_API BinaryenOp BinaryenRelaxedTruncSVecF32x4ToVecI32x4(void);
682+
BINARYEN_API BinaryenOp BinaryenRelaxedTruncUVecF32x4ToVecI32x4(void);
683+
BINARYEN_API BinaryenOp BinaryenRelaxedTruncZeroSVecF64x2ToVecI32x4(void);
684+
BINARYEN_API BinaryenOp BinaryenRelaxedTruncZeroUVecF64x2ToVecI32x4(void);
672685
BINARYEN_API BinaryenOp BinaryenSwizzleVecI8x16(void);
686+
BINARYEN_API BinaryenOp BinaryenRelaxedSwizzleVecI8x16(void);
687+
BINARYEN_API BinaryenOp BinaryenRelaxedMinVecF32x4(void);
688+
BINARYEN_API BinaryenOp BinaryenRelaxedMaxVecF32x4(void);
689+
BINARYEN_API BinaryenOp BinaryenRelaxedMinVecF64x2(void);
690+
BINARYEN_API BinaryenOp BinaryenRelaxedMaxVecF64x2(void);
691+
BINARYEN_API BinaryenOp BinaryenRelaxedQ15MulrSVecI16x8(void);
692+
BINARYEN_API BinaryenOp BinaryenDotI8x16I7x16SToVecI16x8(void);
673693
BINARYEN_API BinaryenOp BinaryenRefAsNonNull(void);
674694
BINARYEN_API BinaryenOp BinaryenRefAsExternInternalize(void);
675695
BINARYEN_API BinaryenOp BinaryenRefAsExternExternalize(void);

src/js/binaryen.js-post.js

+20
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,15 @@ function initializeConstants() {
391391
'XorVec128',
392392
'AndNotVec128',
393393
'BitselectVec128',
394+
'RelaxedFmaVecF32x4',
395+
'RelaxedFmsVecF32x4',
396+
'RelaxedFmaVecF64x2',
397+
'RelaxedFmsVecF64x2',
398+
'LaneselectI8x16',
399+
'LaneselectI16x8',
400+
'LaneselectI32x4',
401+
'LaneselectI64x2',
402+
'DotI8x16I7x16AddSToVecI32x4',
394403
'AnyTrueVec128',
395404
'PopcntVecI8x16',
396405
'AbsVecI8x16',
@@ -548,7 +557,18 @@ function initializeConstants() {
548557
'TruncSatZeroUVecF64x2ToVecI32x4',
549558
'DemoteZeroVecF64x2ToVecF32x4',
550559
'PromoteLowVecF32x4ToVecF64x2',
560+
'RelaxedTruncSVecF32x4ToVecI32x4',
561+
'RelaxedTruncUVecF32x4ToVecI32x4',
562+
'RelaxedTruncZeroSVecF64x2ToVecI32x4',
563+
'RelaxedTruncZeroUVecF64x2ToVecI32x4',
551564
'SwizzleVecI8x16',
565+
'RelaxedSwizzleVecI8x16',
566+
'RelaxedMinVecF32x4',
567+
'RelaxedMaxVecF32x4',
568+
'RelaxedMinVecF64x2',
569+
'RelaxedMaxVecF64x2',
570+
'RelaxedQ15MulrSVecI16x8',
571+
'DotI8x16I7x16SToVecI16x8',
552572
'RefAsNonNull',
553573
'RefAsExternInternalize',
554574
'RefAsExternExternalize',

test/example/c-api-kitchen-sink.c

+20
Original file line numberDiff line numberDiff line change
@@ -647,6 +647,10 @@ void test_core() {
647647
makeUnary(module, BinaryenTruncSatZeroUVecF64x2ToVecI32x4(), v128),
648648
makeUnary(module, BinaryenDemoteZeroVecF64x2ToVecF32x4(), v128),
649649
makeUnary(module, BinaryenPromoteLowVecF32x4ToVecF64x2(), v128),
650+
makeUnary(module, BinaryenRelaxedTruncSVecF32x4ToVecI32x4(), v128),
651+
makeUnary(module, BinaryenRelaxedTruncUVecF32x4ToVecI32x4(), v128),
652+
makeUnary(module, BinaryenRelaxedTruncZeroSVecF64x2ToVecI32x4(), v128),
653+
makeUnary(module, BinaryenRelaxedTruncZeroUVecF64x2ToVecI32x4(), v128),
650654
// Binary
651655
makeBinary(module, BinaryenAddInt32(), i32),
652656
makeBinary(module, BinaryenSubFloat64(), f64),
@@ -812,6 +816,13 @@ void test_core() {
812816
makeBinary(module, BinaryenNarrowSVecI32x4ToVecI16x8(), v128),
813817
makeBinary(module, BinaryenNarrowUVecI32x4ToVecI16x8(), v128),
814818
makeBinary(module, BinaryenSwizzleVecI8x16(), v128),
819+
makeBinary(module, BinaryenRelaxedSwizzleVecI8x16(), v128),
820+
makeBinary(module, BinaryenRelaxedMinVecF32x4(), v128),
821+
makeBinary(module, BinaryenRelaxedMaxVecF32x4(), v128),
822+
makeBinary(module, BinaryenRelaxedMinVecF64x2(), v128),
823+
makeBinary(module, BinaryenRelaxedMaxVecF64x2(), v128),
824+
makeBinary(module, BinaryenRelaxedQ15MulrSVecI16x8(), v128),
825+
makeBinary(module, BinaryenDotI8x16I7x16SToVecI16x8(), v128),
815826
// SIMD lane manipulation
816827
makeSIMDExtract(module, BinaryenExtractLaneSVecI8x16()),
817828
makeSIMDExtract(module, BinaryenExtractLaneUVecI8x16()),
@@ -933,6 +944,15 @@ void test_core() {
933944
// Other SIMD
934945
makeSIMDShuffle(module),
935946
makeSIMDTernary(module, BinaryenBitselectVec128()),
947+
makeSIMDTernary(module, BinaryenRelaxedFmaVecF32x4()),
948+
makeSIMDTernary(module, BinaryenRelaxedFmsVecF32x4()),
949+
makeSIMDTernary(module, BinaryenRelaxedFmaVecF64x2()),
950+
makeSIMDTernary(module, BinaryenRelaxedFmsVecF64x2()),
951+
makeSIMDTernary(module, BinaryenLaneselectI8x16()),
952+
makeSIMDTernary(module, BinaryenLaneselectI16x8()),
953+
makeSIMDTernary(module, BinaryenLaneselectI32x4()),
954+
makeSIMDTernary(module, BinaryenLaneselectI64x2()),
955+
makeSIMDTernary(module, BinaryenDotI8x16I7x16AddSToVecI32x4()),
936956
// Bulk memory
937957
makeMemoryInit(module),
938958
makeDataDrop(module),

test/example/c-api-kitchen-sink.txt

+125
Original file line numberDiff line numberDiff line change
@@ -591,6 +591,26 @@ BinaryenFeatureAll: 126975
591591
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
592592
)
593593
)
594+
(drop
595+
(i32x4.relaxed_trunc_f32x4_s
596+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
597+
)
598+
)
599+
(drop
600+
(i32x4.relaxed_trunc_f32x4_u
601+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
602+
)
603+
)
604+
(drop
605+
(i32x4.relaxed_trunc_f64x2_s_zero
606+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
607+
)
608+
)
609+
(drop
610+
(i32x4.relaxed_trunc_f64x2_u_zero
611+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
612+
)
613+
)
594614
(drop
595615
(i32.add
596616
(i32.const -10)
@@ -1563,6 +1583,48 @@ BinaryenFeatureAll: 126975
15631583
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
15641584
)
15651585
)
1586+
(drop
1587+
(i8x16.relaxed_swizzle
1588+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1589+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1590+
)
1591+
)
1592+
(drop
1593+
(f32x4.relaxed_min
1594+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1595+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1596+
)
1597+
)
1598+
(drop
1599+
(f32x4.relaxed_max
1600+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1601+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1602+
)
1603+
)
1604+
(drop
1605+
(f64x2.relaxed_min
1606+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1607+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1608+
)
1609+
)
1610+
(drop
1611+
(f64x2.relaxed_max
1612+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1613+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1614+
)
1615+
)
1616+
(drop
1617+
(i16x8.relaxed_q15mulr_s
1618+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1619+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1620+
)
1621+
)
1622+
(drop
1623+
(i16x8.dot_i8x16_i7x16_s
1624+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1625+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1626+
)
1627+
)
15661628
(drop
15671629
(i8x16.extract_lane_s 0
15681630
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
@@ -1824,6 +1886,69 @@ BinaryenFeatureAll: 126975
18241886
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
18251887
)
18261888
)
1889+
(drop
1890+
(f32x4.relaxed_fma
1891+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1892+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1893+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1894+
)
1895+
)
1896+
(drop
1897+
(f32x4.relaxed_fms
1898+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1899+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1900+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1901+
)
1902+
)
1903+
(drop
1904+
(f64x2.relaxed_fma
1905+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1906+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1907+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1908+
)
1909+
)
1910+
(drop
1911+
(f64x2.relaxed_fms
1912+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1913+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1914+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1915+
)
1916+
)
1917+
(drop
1918+
(i8x16.laneselect
1919+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1920+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1921+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1922+
)
1923+
)
1924+
(drop
1925+
(i16x8.laneselect
1926+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1927+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1928+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1929+
)
1930+
)
1931+
(drop
1932+
(i32x4.laneselect
1933+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1934+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1935+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1936+
)
1937+
)
1938+
(drop
1939+
(i64x2.laneselect
1940+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1941+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1942+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1943+
)
1944+
)
1945+
(drop
1946+
(i32x4.dot_i8x16_i7x16_add_s
1947+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1948+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1949+
(v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d)
1950+
)
1951+
)
18271952
(memory.init 0
18281953
(i32.const 1024)
18291954
(i32.const 0)

0 commit comments

Comments
 (0)