@@ -412,6 +412,66 @@ static void BlitRGBtoRGBPixelAlphaMMX(SDL_BlitInfo *info)
412412
413413#endif /* __MMX__ */
414414
415+ #if defined(__loongarch_sx )
416+
417+ static void
418+ BlitRGBtoRGBPixelAlphaLSX (SDL_BlitInfo * info )
419+ {
420+ int width = info -> dst_w ;
421+ int height = info -> dst_h ;
422+ Uint32 * srcp = (Uint32 * ) info -> src ;
423+ int srcskip = info -> src_skip >> 2 ;
424+ Uint32 * dstp = (Uint32 * ) info -> dst ;
425+ int dstskip = info -> dst_skip >> 2 ;
426+ SDL_PixelFormat * sf = info -> src_fmt ;
427+ Uint32 amask = sf -> Amask ;
428+ Uint32 ashift = sf -> Ashift ;
429+ Uint64 multmask , multmask2 ;
430+
431+ __m128i src1 , src2 , src3 , dst1 , alpha , alpha2 ;
432+ multmask = 0x00FF ;
433+ multmask <<= (ashift * 2 );
434+ multmask2 = 0x00FF00FF00FF00FFULL ;
435+
436+ while (height -- ) {
437+ /* *INDENT-OFF* */
438+ DUFFS_LOOP4 ({
439+ Uint32 alpha1 = * srcp & amask ;
440+ if (alpha1 == 0 ) {
441+ /* do nothing */
442+ } else if (alpha1 == amask ) {
443+ * dstp = * srcp ;
444+ } else {
445+ src1 = __lsx_vreplgr2vr_w (* srcp );
446+ src1 = __lsx_vinsgr2vr_w (src1 , * dstp , 1 );
447+ src2 = __lsx_vsllwil_hu_bu (src1 , 0 );
448+
449+ alpha = __lsx_vreplgr2vr_w (alpha1 );
450+ alpha = __lsx_vsrl_d (alpha , __lsx_vreplgr2vr_d (ashift ));
451+ alpha = __lsx_vilvl_h (alpha , alpha );
452+ alpha2 = __lsx_vilvl_w (alpha , alpha );
453+ alpha = __lsx_vor_v (alpha2 , __lsx_vreplgr2vr_d (multmask ));
454+ alpha2 = __lsx_vxor_v (alpha2 , __lsx_vreplgr2vr_d (multmask2 ));
455+
456+ src3 = __lsx_vilvl_d (alpha2 , alpha );
457+ src1 = __lsx_vmul_h (src2 , src3 );
458+ src1 = __lsx_vsrli_h (src1 , 8 );
459+ src2 = __lsx_vilvh_d (src1 , src1 );
460+ src1 = __lsx_vadd_h (src1 , src2 );
461+ dst1 = __lsx_vssrlni_bu_h (src1 , src1 , 0 );
462+ __lsx_vstelm_w (dst1 , dstp , 0 , 0 );
463+ }
464+ ++ srcp ;
465+ ++ dstp ;
466+ }, width );
467+ /* *INDENT-ON* */
468+ srcp += srcskip ;
469+ dstp += dstskip ;
470+ }
471+ }
472+
473+ #endif /* __loongarch_sx */
474+
415475#ifdef SDL_ARM_SIMD_BLITTERS
416476void BlitARGBto565PixelAlphaARMSIMDAsm (int32_t w , int32_t h , uint16_t * dst , int32_t dst_stride , uint32_t * src , int32_t src_stride );
417477
@@ -1456,7 +1516,7 @@ SDL_BlitFunc SDL_CalculateBlitA(SDL_Surface *surface)
14561516
14571517 case 4 :
14581518 if (sf -> Rmask == df -> Rmask && sf -> Gmask == df -> Gmask && sf -> Bmask == df -> Bmask && sf -> BytesPerPixel == 4 ) {
1459- #if defined(__MMX__ ) || defined(__3dNOW__ )
1519+ #if defined(__MMX__ ) || defined(__3dNOW__ ) || defined( __loongarch_sx )
14601520 if (sf -> Rshift % 8 == 0 && sf -> Gshift % 8 == 0 && sf -> Bshift % 8 == 0 && sf -> Ashift % 8 == 0 && sf -> Aloss == 0 ) {
14611521#ifdef __3dNOW__
14621522 if (SDL_Has3DNow ()) {
@@ -1467,9 +1527,14 @@ SDL_BlitFunc SDL_CalculateBlitA(SDL_Surface *surface)
14671527 if (SDL_HasMMX ()) {
14681528 return BlitRGBtoRGBPixelAlphaMMX ;
14691529 }
1530+ #endif
1531+ #ifdef __loongarch_sx
1532+ if (SDL_HasLSX ()) {
1533+ return BlitRGBtoRGBPixelAlphaLSX ;
1534+ }
14701535#endif
14711536 }
1472- #endif /* __MMX__ || __3dNOW__ */
1537+ #endif /* __MMX__ || __3dNOW__ || __loongarch_sx */
14731538 if (sf -> Amask == 0xff000000 ) {
14741539#ifdef SDL_ARM_NEON_BLITTERS
14751540 if (SDL_HasNEON ()) {
0 commit comments