ARM SIMD instruction -- fcmpe
FCMPE
Floating-point signaling Compare (scalar). This instruction compares the two SIMD&FP source register values, or the first SIMD&FP source register value and zero. It writes the result to the PSTATE.{N, Z, C, V} flags.
浮点数比较(标量)。此指令比较两个SIMD&FP源寄存器值,或第一个SIMD&FP源寄存器的值和零。它将结果写入PSTATE。{N、Z、C、V}个标志。
402894: 9e620009 scvtf d9, x0
double sc_clk_tck = sysconf(_SC_CLK_TCK);
402898: 1e602138 fcmpe d9, #0.0
40289c: 5400012c b.gt 4028c0 <ferror@plt+0x9e0> // gt : 有符号数大于 >
4028a0: f94007e0 ldr x0, [sp, #8] // x0=[0x419a80]=0x4194d0
4028a4: f00000a1 adrp x1, 419000 <ferror@plt+0x17120>
4028a8: 528081c2 mov w2, #0x40e // #1038
4028ac: 9114c021 add x1, x1, #0x530 // x1=0x419530="src/pstree.c"
4028b0: 910bc003 add x3, x0, #0x2f0 // x3=0x4194d0+0x2f0=0x4197c0="s %*s %*s %*s %*s %*s %*s %*s %*s %Lu"
4028b4: f00000a0 adrp x0, 419000 <ferror@plt+0x17120>
4028b8: 911fa000 add x0, x0, #0x7e8 // x0=0x4197e8="sc_clk_tck > 0"
4028bc: 97fffd69 bl 401e60 <__assert_fail@plt>
assert(sc_clk_tck > 0);
4028c0: aa1903e1 mov x1, x25 // x1=x25=0x421e28="r"
4028c4: f00000a0 adrp x0, 419000 <ferror@plt+0x17120>
4028c8: 911fe000 add x0, x0, #0x7f8 // x0=0x4197f8="/proc/uptime"
4028cc: 97fffca5 bl 401b60 <fopen@plt>
4028d0: aa0003e3 mov x3, x0
4028d4: b4002a80 cbz x0, 402e24 <ferror@plt+0xf44> // exit(1);
if (!(file = fopen("/proc/uptime", "r"))) {
// cbz 402e24
printf("error opening uptime file.\n");
exit(1);
}
(gdb) p/d $d9
$8 = {f = 100, u = 4636737291354636288, s = 4636737291354636288}
(gdb) p/x $d9
$9 = {f = 0x64, u = 0x4059000000000000, s = 0x4059000000000000}
(gdb) p/f $d9
$10 = {f = 100, u = 100, s = 100}
(gdb) x/i $pc
=> 0x402898: fcmpe d9, #0.0
(gdb) n
0x000000000040289c in ?? ()
=> 0x000000000040289c: 2c 01 00 54 b.gt 0x4028c0
(gdb)
0x00000000004028c0 in ?? ()
=> 0x00000000004028c0: e1 03 19 aa mov x1, x25
(gdb)
0x00000000004028c4 in ?? ()
=> 0x00000000004028c4: a0 00 00 f0 adrp x0, 0x419000
(gdb)