微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 armclang 不使用 VCVT 指令进行有效的整数到浮点转换?

如何解决为什么 armclang 不使用 VCVT 指令进行有效的整数到浮点转换?

我需要在带有 FPU 的 Cortex-M4 上将整数值转换为浮点值;例如:

import "./styles.css";
import axios from "axios";
import { useEffect,useState } from "react";

const App = () => {
  const [users,setUsers] = useState([]);

  useEffect(() => {
    const fetch = async () => {
      let result = await getUsers();
      setUsers(
        result.map((r,index) => {
          let temp = r;
          temp["idd"] = index;
          return temp;
        })
      );
    };

    fetch();
  },[]);

  const generateOptions = () => {
    let aux = users.map((u,key) => {
      return (
        <option key={key} value={u.idd}>
          {u.name.first}
        </option>
      );
    });
  
    return aux;
  };

  const getUsers = async () => {
    let data = [];
    await axios
      .get("https://randomuser.me/api/?results=10",{
        headers: {
          "Content-type": "application/json"
        }
      })
      .then((r) => {
        data = r.data.results;
      });
    return data;
  };

  return (
    <>
      {users ? (
        <>
          <div className="App">
            <select defaultValue={3}>{generateOptions()}</select>
          </div>
        </>
      ) : (
        <div>loading...</div>
      )}
    </>
  );
};

export default App;


armclang 编译器将其翻译为:

float convert(int n) {
    return (float) n;
}

(Godbolt 链接https://godbolt.org/z/K59xGq78W

从 int 到 float 的转换是通过调用库例程 __aeabi_i2f 完成的,这比使用 FPU 指令 VCVT 效率低得多。

例如,GCC 使用 VCVT:

        push    {r11,lr}
        mov     r11,sp
        sub     sp,sp,#8
        str     r0,[sp,#4]
        ldr     r0,#4]
        bl      __aeabi_i2f
        mov     sp,r11
        pop     {r11,lr}
        bx      lr

(https://godbolt.org/z/Pdv3nEMYq)

有没有办法告诉 armclang 使用 VCVT 指令?

解决方法

使用选项 -march=armv7+fp 告诉编译器为带有 FPU 的机器生成代码。

Godbolt

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。