Skip to content

Commit c15db22

Browse files
committed
Merge branch 'PHP-8.3'
* PHP-8.3: Fix GH-11992: utf_encodings.phpt fails on Windows 32-bit
2 parents a963b1f + 6176538 commit c15db22

File tree

2 files changed

+16
-8
lines changed

2 files changed

+16
-8
lines changed

ext/mbstring/mbstring.c

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4643,6 +4643,14 @@ MBSTRING_API bool php_mb_check_encoding(const char *input, size_t length, const
46434643
return true;
46444644
}
46454645

4646+
/* MSVC 32-bit has issues with 64-bit intrinsics.
4647+
* (Bad 7/8-byte UTF-8 strings would be wrongly passed through as 'valid')
4648+
* It seems this is caused by a bug in MS Visual C++
4649+
* Ref: https://stackoverflow.com/questions/37509129/potential-bug-in-visual-studio-c-compiler-or-in-intel-intrinsics-avx2-mm256-s */
4650+
#if defined(PHP_WIN32) && !defined(__clang__) && defined(_MSC_VER) && defined(_M_IX86)
4651+
# define MBSTRING_BROKEN_X86_MSVC_INTRINSICS
4652+
#endif
4653+
46464654
/* If we are building an AVX2-only binary, don't compile the next function */
46474655
#ifndef ZEND_INTRIN_AVX2_NATIVE
46484656

@@ -4808,7 +4816,11 @@ static bool mb_fast_check_utf8_default(zend_string *str)
48084816
goto check_operand;
48094817
case 7:
48104818
case 8:
4819+
#ifdef MBSTRING_BROKEN_X86_MSVC_INTRINSICS
4820+
operand = _mm_set_epi32(0, 0, ((int32_t*)p)[1], ((int32_t*)p)[0]);
4821+
#else
48114822
operand = _mm_set_epi64x(0, *((uint64_t*)p));
4823+
#endif
48124824
goto check_operand;
48134825
case 9:
48144826
operand = _mm_srli_si128(_mm_loadu_si128((__m128i*)(p - 6)), 6);
@@ -5201,12 +5213,11 @@ static bool mb_fast_check_utf8_avx2(zend_string *str)
52015213
goto check_operand;
52025214
case 7:
52035215
case 8:
5204-
/* This was originally: operand = _mm256_set_epi64x(0, 0, 0, *((int64_t*)p));
5205-
* However, that caused test failures on 32-bit MS Windows
5206-
* (Bad 7/8-byte UTF-8 strings would be wrongly passed through as 'valid')
5207-
* It seems this is caused by a bug in MS Visual C++
5208-
* Ref: https://stackoverflow.com/questions/37509129/potential-bug-in-visual-studio-c-compiler-or-in-intel-intrinsics-avx2-mm256-s */
5216+
#ifdef MBSTRING_BROKEN_X86_MSVC_INTRINSICS
52095217
operand = _mm256_set_epi32(0, 0, 0, 0, 0, 0, ((int32_t*)p)[1], ((int32_t*)p)[0]);
5218+
#else
5219+
operand = _mm256_set_epi64x(0, 0, 0, *((int64_t*)p));
5220+
#endif
52105221
goto check_operand;
52115222
case 9:
52125223
operand = _mm256_set_m128i(_mm_setzero_si128(), _mm_srli_si128(_mm_loadu_si128((__m128i*)(p - 6)), 6));

ext/mbstring/tests/utf_encodings.phpt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@ mbstring
55
--SKIPIF--
66
<?php
77
if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
8-
if (substr(PHP_OS, 0, 3) === 'WIN' && PHP_INT_SIZE === 4) {
9-
die('xfail Fails on 32-bit Windows');
10-
}
118
?>
129
--FILE--
1310
<?php

0 commit comments

Comments
 (0)