@@ -119,6 +119,15 @@ Name I32_CTTZ("i32_cttz"),
119119 ATOMICS_AND(" and" ),
120120 ATOMICS_OR(" or" ),
121121 ATOMICS_XOR(" xor" ),
122+ I64_ATOMICS_LOAD(" i64_atomics_load" ),
123+ I64_ATOMICS_STORE(" i64_atomics_store" ),
124+ I64_ATOMICS_AND(" i64_atomics_and" ),
125+ I64_ATOMICS_OR(" i64_atomics_or" ),
126+ I64_ATOMICS_XOR(" i64_atomics_xor" ),
127+ I64_ATOMICS_ADD(" i64_atomics_add" ),
128+ I64_ATOMICS_SUB(" i64_atomics_sub" ),
129+ I64_ATOMICS_EXCHANGE(" i64_atomics_exchange" ),
130+ I64_ATOMICS_COMPAREEXCHANGE(" i64_atomics_compareExchange" ),
122131 EMSCRIPTEN_DEBUGINFO(" emscripten_debuginfo" );
123132
124133// Utilities
@@ -1994,6 +2003,7 @@ Function* Asm2WasmBuilder::processFunction(Ref ast) {
19942003 if (name == I64_CTTZ) return builder.makeUnary (UnaryOp::CtzInt64, value);
19952004 if (name == I64_CTLZ) return builder.makeUnary (UnaryOp::ClzInt64, value);
19962005 if (name == I64_CTPOP) return builder.makeUnary (UnaryOp::PopcntInt64, value);
2006+ if (name == I64_ATOMICS_LOAD) return builder.makeAtomicLoad (8 , 0 , value, i64 );
19972007 } else if (num == 2 ) { // 2 params,binary
19982008 if (name == I64_CONST) return builder.makeConst (getLiteral (ast));
19992009 auto * left = process (ast[2 ][0 ]);
@@ -2035,6 +2045,40 @@ Function* Asm2WasmBuilder::processFunction(Ref ast) {
20352045 if (name == I64_SLT) return builder.makeBinary (BinaryOp::LtSInt64, left, right);
20362046 if (name == I64_UGT) return builder.makeBinary (BinaryOp::GtUInt64, left, right);
20372047 if (name == I64_SGT) return builder.makeBinary (BinaryOp::GtSInt64, left, right);
2048+ // atomics
2049+ if (name == I64_ATOMICS_STORE) {
2050+ wasm.memory .shared = true ;
2051+ return builder.makeAtomicStore (8 , 0 , left, right, i64 );
2052+ }
2053+ if (name == I64_ATOMICS_ADD) {
2054+ wasm.memory .shared = true ;
2055+ return builder.makeAtomicRMW (AtomicRMWOp::Add, 8 , 0 , left, right, i64 );
2056+ }
2057+ if (name == I64_ATOMICS_SUB) {
2058+ wasm.memory .shared = true ;
2059+ return builder.makeAtomicRMW (AtomicRMWOp::Sub, 8 , 0 , left, right, i64 );
2060+ }
2061+ if (name == I64_ATOMICS_AND) {
2062+ wasm.memory .shared = true ;
2063+ return builder.makeAtomicRMW (AtomicRMWOp::And, 8 , 0 , left, right, i64 );
2064+ }
2065+ if (name == I64_ATOMICS_OR) {
2066+ wasm.memory .shared = true ;
2067+ return builder.makeAtomicRMW (AtomicRMWOp::Or, 8 , 0 , left, right, i64 );
2068+ }
2069+ if (name == I64_ATOMICS_XOR) {
2070+ wasm.memory .shared = true ;
2071+ return builder.makeAtomicRMW (AtomicRMWOp::Xor, 8 , 0 , left, right, i64 );
2072+ }
2073+ if (name == I64_ATOMICS_EXCHANGE) {
2074+ wasm.memory .shared = true ;
2075+ return builder.makeAtomicRMW (AtomicRMWOp::Xchg, 8 , 0 , left, right, i64 );
2076+ }
2077+ } else if (num == 3 ) {
2078+ if (name == I64_ATOMICS_COMPAREEXCHANGE) {
2079+ wasm.memory .shared = true ;
2080+ return builder.makeAtomicCmpxchg (8 , 0 , process (ast[2 ][0 ]), process (ast[2 ][1 ]), process (ast[2 ][2 ]), i64 );
2081+ }
20382082 }
20392083 break ;
20402084 }
0 commit comments