问题描述
我需要在带有 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 的机器生成代码。