diff --git a/emscripten-version.txt b/emscripten-version.txt index 5f96aa7b346..f2c16746929 100644 --- a/emscripten-version.txt +++ b/emscripten-version.txt @@ -1,2 +1,2 @@ -1.23.0 +1.23.1 diff --git a/lib/Target/JSBackend/CallHandlers.h b/lib/Target/JSBackend/CallHandlers.h index 9b5c5e33946..bcfadc8e231 100644 --- a/lib/Target/JSBackend/CallHandlers.h +++ b/lib/Target/JSBackend/CallHandlers.h @@ -450,7 +450,7 @@ DEF_CALL_HANDLER(llvm_cttz_i32, { // vector ops DEF_CALL_HANDLER(emscripten_float32x4_signmask, { - return getAssign(CI) + "SIMD.float32x4.bitsToInt32x4(" + getValueAsStr(CI->getOperand(0)) + ").signMask"; + return getAssign(CI) + getValueAsStr(CI->getOperand(0)) + ".signMask"; }) DEF_CALL_HANDLER(emscripten_float32x4_min, { return CH___default__(CI, "SIMD.float32x4.min"); @@ -477,32 +477,32 @@ DEF_CALL_HANDLER(emscripten_float32x4_greaterThan, { return CH___default__(CI, "SIMD.float32x4.greaterThan"); }) DEF_CALL_HANDLER(emscripten_float32x4_and, { - return getAssign(CI) + "SIMD.int32x4.bitsToFloat32x4(SIMD.int32x4.and(SIMD.float32x4.bitsToInt32x4(" + - getValueAsStr(CI->getOperand(0)) + "),SIMD.float32x4.bitsToInt32x4(" + getValueAsStr(CI->getOperand(1)) + ")))"; + return getAssign(CI) + "SIMD.float32x4.fromInt32x4Bits(SIMD.float32x4.and(" + + getValueAsStr(CI->getOperand(0)) + ", " + getValueAsStr(CI->getOperand(1)) + "))"; }) DEF_CALL_HANDLER(emscripten_float32x4_andNot, { - return getAssign(CI) + "SIMD.int32x4.bitsToFloat32x4(SIMD.int32x4.and(SIMD.int32x4.not(SIMD.float32x4.bitsToInt32x4(" + - getValueAsStr(CI->getOperand(0)) + ")),SIMD.float32x4.bitsToInt32x4(" + getValueAsStr(CI->getOperand(1)) + ")))"; + return getAssign(CI) + "SIMD.float32x4.fromInt32x4Bits(SIMD.float32x4.and(SIMD.float32x4.not(" + + getValueAsStr(CI->getOperand(0)) + "), " + getValueAsStr(CI->getOperand(1)) + "))"; }) DEF_CALL_HANDLER(emscripten_float32x4_or, { - return getAssign(CI) + "SIMD.int32x4.bitsToFloat32x4(SIMD.int32x4.or(SIMD.float32x4.bitsToInt32x4(" + - getValueAsStr(CI->getOperand(0)) + "),SIMD.float32x4.bitsToInt32x4(" + getValueAsStr(CI->getOperand(1)) + ")))"; + return getAssign(CI) + "SIMD.float32x4.fromInt32x4Bits(SIMD.float32x4.or(" + + getValueAsStr(CI->getOperand(0)) + ", " + getValueAsStr(CI->getOperand(1)) + "))"; }) DEF_CALL_HANDLER(emscripten_float32x4_xor, { - return getAssign(CI) + "SIMD.int32x4.bitsToFloat32x4(SIMD.int32x4.xor(SIMD.float32x4.bitsToInt32x4(" + - getValueAsStr(CI->getOperand(0)) + "),SIMD.float32x4.bitsToInt32x4(" + getValueAsStr(CI->getOperand(1)) + ")))"; + return getAssign(CI) + "SIMD.float32x4.fromInt32x4Bits(SIMD.float32x4.xor(" + + getValueAsStr(CI->getOperand(0)) + ", " + getValueAsStr(CI->getOperand(1)) + "))"; }) -DEF_CALL_HANDLER(emscripten_int32x4_bitsToFloat32x4, { - return CH___default__(CI, "SIMD.int32x4.bitsToFloat32x4"); +DEF_CALL_HANDLER(emscripten_float32x4_fromInt32x4Bits, { + return CH___default__(CI, "SIMD.float32x4.fromInt32x4Bits"); }) -DEF_CALL_HANDLER(emscripten_int32x4_toFloat32x4, { - return CH___default__(CI, "SIMD.int32x4.toFloat32x4"); +DEF_CALL_HANDLER(emscripten_float32x4_fromInt32x4, { + return CH___default__(CI, "SIMD.float32x4.fromInt32x4"); }) -DEF_CALL_HANDLER(emscripten_float32x4_bitsToInt32x4, { - return CH___default__(CI, "SIMD.float32x4.bitsToInt32x4"); +DEF_CALL_HANDLER(emscripten_int32x4_fromFloat32x4Bits, { + return CH___default__(CI, "SIMD.int32x4.fromFloat32x4Bits"); }) -DEF_CALL_HANDLER(emscripten_float32x4_toInt32x4, { - return CH___default__(CI, "SIMD.float32x4.toInt32x4"); +DEF_CALL_HANDLER(emscripten_int32x4_fromFloat32x4, { + return CH___default__(CI, "SIMD.int32x4.fromFloat32x4"); }) #define DEF_BUILTIN_HANDLER(name, to) \ @@ -631,10 +631,10 @@ void setupCallHandlers() { SETUP_CALL_HANDLER(emscripten_float32x4_andNot); SETUP_CALL_HANDLER(emscripten_float32x4_or); SETUP_CALL_HANDLER(emscripten_float32x4_xor); - SETUP_CALL_HANDLER(emscripten_int32x4_bitsToFloat32x4); - SETUP_CALL_HANDLER(emscripten_int32x4_toFloat32x4); - SETUP_CALL_HANDLER(emscripten_float32x4_bitsToInt32x4); - SETUP_CALL_HANDLER(emscripten_float32x4_toInt32x4); + SETUP_CALL_HANDLER(emscripten_float32x4_fromInt32x4Bits); + SETUP_CALL_HANDLER(emscripten_float32x4_fromInt32x4); + SETUP_CALL_HANDLER(emscripten_int32x4_fromFloat32x4Bits); + SETUP_CALL_HANDLER(emscripten_int32x4_fromFloat32x4); SETUP_CALL_HANDLER(abs); SETUP_CALL_HANDLER(labs); diff --git a/lib/Target/JSBackend/JSBackend.cpp b/lib/Target/JSBackend/JSBackend.cpp index 9ab38b8272c..97b7d5f193f 100644 --- a/lib/Target/JSBackend/JSBackend.cpp +++ b/lib/Target/JSBackend/JSBackend.cpp @@ -1019,9 +1019,18 @@ std::string JSWriter::getConstant(const Constant* CV, AsmCast sign) { } return CI->getValue().toString(10, sign != ASM_UNSIGNED); } else if (isa(CV)) { - std::string S = CV->getType()->isFloatingPointTy() ? "+0" : "0"; // XXX refactor this - if (PreciseF32 && CV->getType()->isFloatTy() && !(sign & ASM_FFI_OUT)) { - S = "Math_fround(" + S + ")"; + std::string S; + if (VectorType *VT = dyn_cast(CV->getType())) { + if (VT->getElementType()->isIntegerTy()) { + S = "SIMD.int32x4.splat(0)"; + } else { + S = "SIMD.float32x4.splat(0.0)"; + } + } else { + S = CV->getType()->isFloatingPointTy() ? "+0" : "0"; // XXX refactor this + if (PreciseF32 && CV->getType()->isFloatTy() && !(sign & ASM_FFI_OUT)) { + S = "Math_fround(" + S + ")"; + } } return S; } else if (isa(CV)) { @@ -1145,9 +1154,9 @@ bool JSWriter::generateSIMDExpression(const User *I, raw_string_ostream& Code) { case Instruction::BitCast: { Code << getAssignIfNeeded(I); if (cast(I->getType())->getElementType()->isIntegerTy()) { - Code << "SIMD.float32x4.bitsToInt32x4(" << getValueAsStr(I->getOperand(0)) << ')'; + Code << "SIMD.int32x4.fromFloat32x4Bits(" << getValueAsStr(I->getOperand(0)) << ')'; } else { - Code << "SIMD.int32x4.bitsToInt32x4(" << getValueAsStr(I->getOperand(0)) << ')'; + Code << "SIMD.float32x4.fromInt32x4Bits(" << getValueAsStr(I->getOperand(0)) << ')'; } break; }