编译libmp3lame支持SSE指令

碰到的编译错误如下:

lame/libmp3lame/vector/xmm_quantize_sub.c:72:18: warning: SSE vector return without SSE enabled changes the ABI [-Wpsabi]
   72 |     const __m128 vec_fabs_mask = _mm_loadu_ps(&fabs_mask._float[0]);
      |                  ^~~~~~~~~~~~~
In file included from lame/libmp3lame/vector/xmm_quantize_sub.c:37:
/usr/lib/gcc/x86_64-linux-gnu/13/include/xmmintrin.h:904:1: error: inlining failed in call to ‘always_inline’ ‘_mm_set_ps1’: target specific option mismatch
  904 | _mm_set_ps1 (float __F)
      | ^~~~~~~~~~~
lame/libmp3lame/vector/xmm_quantize_sub.c:81:21: note: called from here
   81 |     vec_sum._m128 = _mm_set_ps1(0);
      |                     ^~~~~~~~~~~~~~

这个从config.h来看,configure阶段会检测到支持SSE指令,所以HAVE_XMMINTRIN_H为1,在wrapper的Makefile中通过-DHAVE_XMMINTRIN_H=0是不行的。

搜索发现之前有人碰到过,我这里这个问题添加编译选项即可:

-msse

这个通过后面的网址搜索“_mm_set_ps1 ”函数,通过查找对应的SSE指令集即可:网址,对应的CPUID Flags: SSE,所以参数cflags参数是msse:

__m128 _mm_set_ps1 (float a)

Synopsis
__m128 _mm_set_ps1 (float a)
#include <xmmintrin.h>
Instruction: Sequence
CPUID Flags: SSE
Description
Broadcast single-precision (32-bit) floating-point value a to all elements of dst.
Operation
FOR j := 0 to 3
	i := j*32
	dst[i+31:i] := a[31:0]
ENDFOR

编译libmp3lame.a的cflags:

CFLAGS += -DHAVE_CONFIG_H
CFLAGS += $(INCDIR_PREFIX)$(DST_PATH) \
          $(INCDIR_PREFIX)$(SRC_PATH)/include \
          $(INCDIR_PREFIX)$(SRC_PATH)/mpglib \
          $(INCDIR_PREFIX)$(SRC_PATH)/libmp3lame
CFLAGS += -Wno-unused-variable -Wno-unused-but-set-variable \
          -Wno-stringop-overflow -Wno-array-parameter \
          -Wno-address -Wno-shadow -msse

libmp3lame的source:

CSRCS	+= \
         $(SRC_PATH)/libmp3lame/bitstream.c \
         $(SRC_PATH)/libmp3lame/encoder.c \
         $(SRC_PATH)/libmp3lame/fft.c \
         $(SRC_PATH)/libmp3lame/gain_analysis.c \
         $(SRC_PATH)/libmp3lame/id3tag.c \
         $(SRC_PATH)/libmp3lame/lame.c \
         $(SRC_PATH)/libmp3lame/newmdct.c \
         $(SRC_PATH)/libmp3lame/psymodel.c \
         $(SRC_PATH)/libmp3lame/quantize.c \
         $(SRC_PATH)/libmp3lame/vector/xmm_quantize_sub.c \
         $(SRC_PATH)/libmp3lame/quantize_pvt.c \
         $(SRC_PATH)/libmp3lame/set_get.c \
         $(SRC_PATH)/libmp3lame/vbrquantize.c \
         $(SRC_PATH)/libmp3lame/reservoir.c \
         $(SRC_PATH)/libmp3lame/tables.c \
         $(SRC_PATH)/libmp3lame/takehiro.c \
         $(SRC_PATH)/libmp3lame/util.c \
         $(SRC_PATH)/libmp3lame/mpglib_interface.c \
         $(SRC_PATH)/libmp3lame/VbrTag.c \
         $(SRC_PATH)/libmp3lame/version.c \
         $(SRC_PATH)/libmp3lame/presets.c \
         $(SRC_PATH)/mpglib/common.c \
         $(SRC_PATH)/mpglib/dct64_i386.c \
         $(SRC_PATH)/mpglib/decode_i386.c \
         $(SRC_PATH)/mpglib/layer1.c \
         $(SRC_PATH)/mpglib/layer2.c \
         $(SRC_PATH)/mpglib/layer3.c \
         $(SRC_PATH)/mpglib/tabinit.c \
         $(SRC_PATH)/mpglib/interface.c
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值