- add arm64 dependent codes with GICv3 and SVE support - fix bugs based on architecture separation requests
152 lines
2.7 KiB
C
152 lines
2.7 KiB
C
/* fpsimdmacros.h COPYRIGHT FUJITSU LIMITED 2016-2017 */
|
|
|
|
.macro _check_reg nr
|
|
.if (\nr) < 0 || (\nr) > 31
|
|
.error "Bad register number \nr."
|
|
.endif
|
|
.endm
|
|
|
|
.macro _check_zreg znr
|
|
.if (\znr) < 0 || (\znr) > 31
|
|
.error "Bad Scalable Vector Extension vector register number \znr."
|
|
.endif
|
|
.endm
|
|
|
|
.macro _check_preg pnr
|
|
.if (\pnr) < 0 || (\pnr) > 15
|
|
.error "Bad Scalable Vector Extension predicate register number \pnr."
|
|
.endif
|
|
.endm
|
|
|
|
.macro _check_num n, min, max
|
|
.if (\n) < (\min) || (\n) > (\max)
|
|
.error "Number \n out of range [\min,\max]"
|
|
.endif
|
|
.endm
|
|
|
|
.macro _zstrv znt, nspb, ioff=0
|
|
_check_zreg \znt
|
|
_check_reg \nspb
|
|
_check_num (\ioff), -0x100, 0xff
|
|
.inst 0xe5804000 \
|
|
| (\znt) \
|
|
| ((\nspb) << 5) \
|
|
| (((\ioff) & 7) << 10) \
|
|
| (((\ioff) & 0x1f8) << 13)
|
|
.endm
|
|
|
|
.macro _zldrv znt, nspb, ioff=0
|
|
_check_zreg \znt
|
|
_check_reg \nspb
|
|
_check_num (\ioff), -0x100, 0xff
|
|
.inst 0x85804000 \
|
|
| (\znt) \
|
|
| ((\nspb) << 5) \
|
|
| (((\ioff) & 7) << 10) \
|
|
| (((\ioff) & 0x1f8) << 13)
|
|
.endm
|
|
|
|
.macro _zstrp pnt, nspb, ioff=0
|
|
_check_preg \pnt
|
|
_check_reg \nspb
|
|
_check_num (\ioff), -0x100, 0xff
|
|
.inst 0xe5800000 \
|
|
| (\pnt) \
|
|
| ((\nspb) << 5) \
|
|
| (((\ioff) & 7) << 10) \
|
|
| (((\ioff) & 0x1f8) << 13)
|
|
.endm
|
|
|
|
.macro _zldrp pnt, nspb, ioff=0
|
|
_check_preg \pnt
|
|
_check_reg \nspb
|
|
_check_num (\ioff), -0x100, 0xff
|
|
.inst 0x85800000 \
|
|
| (\pnt) \
|
|
| ((\nspb) << 5) \
|
|
| (((\ioff) & 7) << 10) \
|
|
| (((\ioff) & 0x1f8) << 13)
|
|
.endm
|
|
|
|
.macro _zrdvl nspd, is1
|
|
_check_reg \nspd
|
|
_check_num (\is1), -0x20, 0x1f
|
|
.inst 0x04bf5000 \
|
|
| (\nspd) \
|
|
| (((\is1) & 0x3f) << 5)
|
|
.endm
|
|
|
|
.macro _zrdffr pnd
|
|
_check_preg \pnd
|
|
.inst 0x2519f000 \
|
|
| (\pnd)
|
|
.endm
|
|
|
|
.macro _zwrffr pnd
|
|
_check_preg \pnd
|
|
.inst 0x25289000 \
|
|
| ((\pnd) << 5)
|
|
.endm
|
|
|
|
.macro for from, to, insn
|
|
.if (\from) >= (\to)
|
|
\insn (\from)
|
|
.exitm
|
|
.endif
|
|
|
|
for \from, ((\from) + (\to)) / 2, \insn
|
|
for ((\from) + (\to)) / 2 + 1, \to, \insn
|
|
.endm
|
|
|
|
.macro sve_save nb, xpfpsr, ntmp
|
|
.macro savez n
|
|
_zstrv \n, \nb, (\n) - 34
|
|
.endm
|
|
|
|
.macro savep n
|
|
_zstrp \n, \nb, (\n) - 16
|
|
.endm
|
|
|
|
for 0, 31, savez
|
|
for 0, 15, savep
|
|
_zrdffr 0
|
|
_zstrp 0, \nb
|
|
_zldrp 0, \nb, -16
|
|
|
|
mrs x\ntmp, fpsr
|
|
str w\ntmp, [\xpfpsr]
|
|
mrs x\ntmp, fpcr
|
|
str w\ntmp, [\xpfpsr, #4]
|
|
|
|
.purgem savez
|
|
.purgem savep
|
|
.endm
|
|
|
|
.macro sve_load nb, xpfpsr, xvqminus1 ntmp
|
|
mrs_s x\ntmp, SYS_ZCR_EL1
|
|
bic x\ntmp, x\ntmp, ZCR_EL1_LEN_MASK
|
|
orr x\ntmp, x\ntmp, \xvqminus1
|
|
msr_s SYS_ZCR_EL1, x\ntmp // self-synchronising
|
|
|
|
.macro loadz n
|
|
_zldrv \n, \nb, (\n) - 34
|
|
.endm
|
|
|
|
.macro loadp n
|
|
_zldrp \n, \nb, (\n) - 16
|
|
.endm
|
|
|
|
for 0, 31, loadz
|
|
_zldrp 0, \nb
|
|
_zwrffr 0
|
|
for 0, 15, loadp
|
|
|
|
ldr w\ntmp, [\xpfpsr]
|
|
msr fpsr, x\ntmp
|
|
ldr w\ntmp, [\xpfpsr, #4]
|
|
msr fpcr, x\ntmp
|
|
|
|
.purgem loadz
|
|
.purgem loadp
|
|
.endm
|