120 lines
2.4 KiB
ArmAsm
120 lines
2.4 KiB
ArmAsm
// Copyright (c) 2026 Petr Balvín <opensource@petrbalvin.org> (https://petrbalvin.org)
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
#include "textflag.h"
|
|
|
|
// fparith exercises the FP arithmetic set.
|
|
TEXT ·fparith(SB), NOSPLIT, $0-0
|
|
FADDD F0, F1, F2
|
|
FSUBD F3, F4, F5
|
|
FMULD F6, F7, F8
|
|
FDIVD F9, F10, F11
|
|
FADDS F12, F13, F14
|
|
FSUBS F15, F16, F17
|
|
FMULS F18, F19, F20
|
|
FDIVS F21, F22, F23
|
|
FSQRTD F24, F25
|
|
FSQRTS F26, F27
|
|
FNEGD F28, F29
|
|
FNEGS F30, F31
|
|
FABSD F0, F1
|
|
FABSS F2, F3
|
|
FNMULD F4, F5, F6
|
|
FNMULS F7, F8, F9
|
|
FMIND F10, F11, F12
|
|
FMAXD F13, F14, F15
|
|
FMINS F16, F17, F18
|
|
FMAXS F19, F20, F21
|
|
RET
|
|
|
|
// fpfma exercises fused multiply-add.
|
|
TEXT ·fpfma(SB), NOSPLIT, $0-0
|
|
FMADDD F0, F1, F2, F3
|
|
FMSUBD F4, F5, F6, F7
|
|
FNMADDD F8, F9, F10, F11
|
|
FNMSUBD F12, F13, F14, F15
|
|
FMADDS F16, F17, F18, F19
|
|
FMSUBS F20, F21, F22, F23
|
|
FNMADDS F24, F25, F26, F27
|
|
FNMSUBS F28, F29, F30, F0
|
|
RET
|
|
|
|
// fpconv exercises FP↔integer conversion and cross-precision.
|
|
// Syntax: FCVTZSD Fd, Rn (float→int: FP source first, int dest second)
|
|
// SCVTFD Rn, Fd (int→float: int source first, FP dest second)
|
|
TEXT ·fpconv(SB), NOSPLIT, $0-0
|
|
FCVTSD F0, F1
|
|
FCVTDS F2, F3
|
|
FCVTZSD F4, R0
|
|
FCVTZSS F5, R1
|
|
FCVTZUD F6, R2
|
|
FCVTZUS F7, R3
|
|
SCVTFD R4, F8
|
|
SCVTFS R5, F9
|
|
UCVTFD R6, F10
|
|
UCVTFS R7, F11
|
|
SCVTFWD R0, F12
|
|
SCVTFWS R1, F13
|
|
UCVTFWD R2, F14
|
|
UCVTFWS R3, F15
|
|
FMOVS F14, R20
|
|
FMOVS R21, F15
|
|
FMOVD F16, R22
|
|
FMOVD R23, F17
|
|
RET
|
|
|
|
// fpcmp exercises FP compare and conditional compare.
|
|
// FCCMP syntax: FCCMP cond, Fn, Fm, $nzcv
|
|
// FCSEL syntax: FCSEL cond, Fn, Fm, Fd
|
|
TEXT ·fpcmp(SB), NOSPLIT, $0-0
|
|
FCMPS F0, F1
|
|
FCMPD F2, F3
|
|
FCMPS $0.0, F4
|
|
FCMPD $0.0, F5
|
|
FCCMPS EQ, F6, F7, $0
|
|
FCCMPD NE, F8, F9, $0
|
|
FCSELS GE, F10, F11, F12
|
|
FCSELD LT, F13, F14, F15
|
|
RET
|
|
|
|
// frint exercises FP rounding.
|
|
TEXT ·frint(SB), NOSPLIT, $0-0
|
|
FRINTND F0, F1
|
|
FRINTNS F2, F3
|
|
FRINTPD F4, F5
|
|
FRINTPS F6, F7
|
|
FRINTMD F8, F9
|
|
FRINTMS F10, F11
|
|
FRINTZD F12, F13
|
|
FRINTZS F14, F15
|
|
FRINTAD F16, F17
|
|
FRINTAS F18, F19
|
|
FRINTXD F20, F21
|
|
FRINTXS F22, F23
|
|
FRINTID F24, F25
|
|
FRINTIS F26, F27
|
|
FMOVD F0, F1
|
|
FMOVS F2, F3
|
|
RET
|
|
|
|
// condsel exercises conditional select and CRC32.
|
|
TEXT ·condsel(SB), NOSPLIT, $0-0
|
|
CSEL EQ, R0, R1, R2
|
|
CSINC NE, R3, R4, R5
|
|
CSINV GE, R6, R7, R8
|
|
CSNEG LT, R9, R10, R11
|
|
CSET EQ, R12
|
|
CSETM NE, R13
|
|
CINC EQ, R14, R15
|
|
CINV NE, R16, R17
|
|
CNEG GE, R19, R20
|
|
CRC32B R0, R2
|
|
CRC32H R3, R5
|
|
CRC32W R6, R8
|
|
CRC32X R9, R11
|
|
CRC32CB R12, R14
|
|
CRC32CH R15, R0
|
|
CRC32CW R1, R3
|
|
CRC32CX R4, R6
|
|
RET
|