eb25d10f4d
The previous decoding misnamed the bit it called "local". Other than the name, the implementation was correct for pa1.x. Rename this field to "tlbe". PA2.0 adds (a real) local bit to PxTLB, and also adds a range of pages to flush in GR[b]. Signed-off-by: Helge Deller <deller@gmx.de> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
623 lines
26 KiB
Plaintext
623 lines
26 KiB
Plaintext
#
|
|
# HPPA instruction decode definitions.
|
|
#
|
|
# Copyright (c) 2018 Richard Henderson <rth@twiddle.net>
|
|
#
|
|
# This library is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU Lesser General Public
|
|
# License as published by the Free Software Foundation; either
|
|
# version 2.1 of the License, or (at your option) any later version.
|
|
#
|
|
# This library is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
# Lesser General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU Lesser General Public
|
|
# License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
|
|
####
|
|
# Field definitions
|
|
####
|
|
|
|
%assemble_sr3 13:1 14:2
|
|
%assemble_sr3x 13:1 14:2 !function=expand_sr3x
|
|
|
|
%assemble_11a 0:s1 4:10 !function=expand_shl3
|
|
%assemble_12 0:s1 2:1 3:10 !function=expand_shl2
|
|
%assemble_12a 0:s1 3:11 !function=expand_shl2
|
|
%assemble_17 0:s1 16:5 2:1 3:10 !function=expand_shl2
|
|
%assemble_22 0:s1 16:10 2:1 3:10 !function=expand_shl2
|
|
|
|
%assemble_21 0:s1 1:11 14:2 16:5 12:2 !function=expand_shl11
|
|
|
|
%lowsign_11 0:s1 1:10
|
|
%lowsign_14 0:s1 1:13
|
|
|
|
%sm_imm 16:10 !function=expand_sm_imm
|
|
|
|
%rm64 1:1 16:5
|
|
%rt64 6:1 0:5
|
|
%ra64 7:1 21:5
|
|
%rb64 12:1 16:5
|
|
%rc64 8:1 13:3 9:2
|
|
%rc32 13:3 9:2
|
|
|
|
%im5_0 0:s1 1:4
|
|
%im5_16 16:s1 17:4
|
|
%len5 0:5 !function=assemble_6
|
|
%len6_8 8:1 0:5 !function=assemble_6
|
|
%len6_12 12:1 0:5 !function=assemble_6
|
|
%cpos6_11 11:1 5:5
|
|
%ma_to_m 5:1 13:1 !function=ma_to_m
|
|
%ma2_to_m 2:2 !function=ma_to_m
|
|
%pos_to_m 0:1 !function=pos_to_m
|
|
%neg_to_m 0:1 !function=neg_to_m
|
|
%a_to_m 2:1 !function=neg_to_m
|
|
%cmpbid_c 13:2 !function=cmpbid_c
|
|
|
|
####
|
|
# Argument set definitions
|
|
####
|
|
|
|
# All insns that need to form a virtual address should use this set.
|
|
&ldst t b x disp sp m scale size
|
|
|
|
&rr_cf_d t r cf d
|
|
&rrr t r1 r2
|
|
&rrr_cf t r1 r2 cf
|
|
&rrr_cf_d t r1 r2 cf d
|
|
&rrr_sh t r1 r2 sh
|
|
&rrr_cf_d_sh t r1 r2 cf d sh
|
|
&rri t r i
|
|
&rri_cf t r i cf
|
|
&rri_cf_d t r i cf d
|
|
|
|
&rrb_c_f disp n c f r1 r2
|
|
&rrb_c_d_f disp n c d f r1 r2
|
|
&rib_c_f disp n c f r i
|
|
&rib_c_d_f disp n c d f r i
|
|
|
|
####
|
|
# Format definitions
|
|
####
|
|
|
|
@rr_cf_d ...... r:5 ..... cf:4 ...... d:1 t:5 &rr_cf_d
|
|
@rrr ...... r2:5 r1:5 .... ....... t:5 &rrr
|
|
@rrr_cf ...... r2:5 r1:5 cf:4 ....... t:5 &rrr_cf
|
|
@rrr_cf_d ...... r2:5 r1:5 cf:4 ...... d:1 t:5 &rrr_cf_d
|
|
@rrr_sh ...... r2:5 r1:5 ........ sh:2 . t:5 &rrr_sh
|
|
@rrr_cf_d_sh ...... r2:5 r1:5 cf:4 .... sh:2 d:1 t:5 &rrr_cf_d_sh
|
|
@rrr_cf_d_sh0 ...... r2:5 r1:5 cf:4 ...... d:1 t:5 &rrr_cf_d_sh sh=0
|
|
@rri_cf ...... r:5 t:5 cf:4 . ........... &rri_cf i=%lowsign_11
|
|
@rri_cf_d ...... r:5 t:5 cf:4 d:1 ........... &rri_cf_d i=%lowsign_11
|
|
|
|
@rrb_cf ...... r2:5 r1:5 c:3 ........... n:1 . \
|
|
&rrb_c_f disp=%assemble_12
|
|
@rrb_cdf ...... r2:5 r1:5 c:3 ........... n:1 . \
|
|
&rrb_c_d_f disp=%assemble_12
|
|
@rib_cf ...... r:5 ..... c:3 ........... n:1 . \
|
|
&rib_c_f disp=%assemble_12 i=%im5_16
|
|
@rib_cdf ...... r:5 ..... c:3 ........... n:1 . \
|
|
&rib_c_d_f disp=%assemble_12 i=%im5_16
|
|
|
|
####
|
|
# System
|
|
####
|
|
|
|
break 000000 ----- ----- --- 00000000 -----
|
|
|
|
mtsp 000000 ----- r:5 ... 11000001 00000 sp=%assemble_sr3
|
|
mtctl 000000 t:5 r:5 --- 11000010 00000
|
|
mtsarcm 000000 01011 r:5 --- 11000110 00000
|
|
mtsm 000000 00000 r:5 000 11000011 00000
|
|
|
|
mfia 000000 ----- 00000 --- 10100101 t:5
|
|
mfsp 000000 ----- 00000 ... 00100101 t:5 sp=%assemble_sr3
|
|
mfctl 000000 r:5 00000- e:1 -01000101 t:5
|
|
|
|
sync 000000 ----- ----- 000 00100000 00000 # sync, syncdma
|
|
|
|
ldsid 000000 b:5 ----- sp:2 0 10000101 t:5
|
|
|
|
rsm 000000 .......... 000 01110011 t:5 i=%sm_imm
|
|
ssm 000000 .......... 000 01101011 t:5 i=%sm_imm
|
|
|
|
rfi 000000 ----- ----- --- 01100000 00000
|
|
rfi_r 000000 ----- ----- --- 01100101 00000
|
|
|
|
# These are artificial instructions used by QEMU firmware.
|
|
# They are allocated from the unassigned instruction space.
|
|
halt 1111 1111 1111 1101 1110 1010 1101 0000
|
|
reset 1111 1111 1111 1101 1110 1010 1101 0001
|
|
getshadowregs 1111 1111 1111 1101 1110 1010 1101 0010
|
|
|
|
####
|
|
# Memory Management
|
|
####
|
|
|
|
@addrx ...... b:5 x:5 .. ........ m:1 ..... \
|
|
&ldst disp=0 scale=0 t=0 sp=0 size=0
|
|
|
|
nop 000001 ----- ----- -- 11001010 0 ----- # fdc, disp
|
|
nop_addrx 000001 ..... ..... -- 01001010 . ----- @addrx # fdc, index
|
|
nop_addrx 000001 ..... ..... -- 01001011 . ----- @addrx # fdce
|
|
nop_addrx 000001 ..... ..... --- 0001010 . ----- @addrx # fic 0x0a
|
|
nop_addrx 000001 ..... ..... -- 01001111 . 00000 @addrx # fic 0x4f
|
|
nop_addrx 000001 ..... ..... --- 0001011 . ----- @addrx # fice
|
|
nop_addrx 000001 ..... ..... -- 01001110 . 00000 @addrx # pdc
|
|
|
|
probe 000001 b:5 ri:5 sp:2 imm:1 100011 write:1 0 t:5
|
|
|
|
# pa1.x tlb insert instructions
|
|
ixtlbx 000001 b:5 r:5 sp:2 0100000 addr:1 0 00000 data=1
|
|
ixtlbx 000001 b:5 r:5 ... 000000 addr:1 0 00000 \
|
|
sp=%assemble_sr3x data=0
|
|
|
|
# pcxl and pcxl2 Fast TLB Insert instructions
|
|
ixtlbxf 000001 00000 r:5 00 0 data:1 01000 addr:1 0 00000
|
|
|
|
# pa2.0 tlb insert idtlbt and iitlbt instructions
|
|
ixtlbt 000001 r2:5 r1:5 000 data:1 100000 0 00000 # idtlbt
|
|
|
|
# pdtlb, pitlb
|
|
pxtlb 000001 b:5 x:5 sp:2 01001000 m:1 ----- \
|
|
&ldst disp=0 scale=0 size=0 t=0
|
|
pxtlb 000001 b:5 x:5 ... 0001000 m:1 ----- \
|
|
&ldst disp=0 scale=0 size=0 t=0 sp=%assemble_sr3x
|
|
|
|
# ... pa20 local
|
|
pxtlb_l 000001 b:5 x:5 sp:2 01011000 m:1 ----- \
|
|
&ldst disp=0 scale=0 size=0 t=0
|
|
pxtlb_l 000001 b:5 x:5 ... 0011000 m:1 ----- \
|
|
&ldst disp=0 scale=0 size=0 t=0 sp=%assemble_sr3x
|
|
|
|
# pdtlbe, pitlbe
|
|
pxtlbe 000001 b:5 x:5 sp:2 01001001 m:1 ----- \
|
|
&ldst disp=0 scale=0 size=0 t=0
|
|
pxtlbe 000001 b:5 x:5 ... 0001001 m:1 ----- \
|
|
&ldst disp=0 scale=0 size=0 t=0 sp=%assemble_sr3x
|
|
|
|
lpa 000001 b:5 x:5 sp:2 01001101 m:1 t:5 \
|
|
&ldst disp=0 scale=0 size=0
|
|
|
|
lci 000001 ----- ----- -- 01001100 0 t:5
|
|
|
|
####
|
|
# Arith/Log
|
|
####
|
|
|
|
andcm 000010 ..... ..... .... 000000 . ..... @rrr_cf_d
|
|
and 000010 ..... ..... .... 001000 . ..... @rrr_cf_d
|
|
or 000010 ..... ..... .... 001001 . ..... @rrr_cf_d
|
|
xor 000010 ..... ..... .... 001010 . ..... @rrr_cf_d
|
|
uxor 000010 ..... ..... .... 001110 . ..... @rrr_cf_d
|
|
ds 000010 ..... ..... .... 010001 0 ..... @rrr_cf
|
|
cmpclr 000010 ..... ..... .... 100010 . ..... @rrr_cf_d
|
|
uaddcm 000010 ..... ..... .... 100110 . ..... @rrr_cf_d
|
|
uaddcm_tc 000010 ..... ..... .... 100111 . ..... @rrr_cf_d
|
|
dcor 000010 ..... 00000 .... 101110 . ..... @rr_cf_d
|
|
dcor_i 000010 ..... 00000 .... 101111 . ..... @rr_cf_d
|
|
|
|
add 000010 ..... ..... .... 0110.. . ..... @rrr_cf_d_sh
|
|
add_l 000010 ..... ..... .... 1010.. . ..... @rrr_cf_d_sh
|
|
add_tsv 000010 ..... ..... .... 1110.. . ..... @rrr_cf_d_sh
|
|
{
|
|
add_c 000010 ..... ..... .... 011100 . ..... @rrr_cf_d_sh0
|
|
hshladd 000010 ..... ..... 0000 0111.. 0 ..... @rrr_sh
|
|
}
|
|
add_c_tsv 000010 ..... ..... .... 111100 . ..... @rrr_cf_d_sh0
|
|
|
|
sub 000010 ..... ..... .... 010000 . ..... @rrr_cf_d
|
|
sub_tsv 000010 ..... ..... .... 110000 . ..... @rrr_cf_d
|
|
sub_tc 000010 ..... ..... .... 010011 . ..... @rrr_cf_d
|
|
sub_tsv_tc 000010 ..... ..... .... 110011 . ..... @rrr_cf_d
|
|
{
|
|
sub_b 000010 ..... ..... .... 010100 . ..... @rrr_cf_d
|
|
hshradd 000010 ..... ..... 0000 0101.. 0 ..... @rrr_sh
|
|
}
|
|
sub_b_tsv 000010 ..... ..... .... 110100 . ..... @rrr_cf_d
|
|
|
|
ldil 001000 t:5 ..................... i=%assemble_21
|
|
addil 001010 r:5 ..................... i=%assemble_21
|
|
ldo 001101 b:5 t:5 -- .............. i=%lowsign_14
|
|
|
|
addi 101101 ..... ..... .... 0 ........... @rri_cf
|
|
addi_tsv 101101 ..... ..... .... 1 ........... @rri_cf
|
|
addi_tc 101100 ..... ..... .... 0 ........... @rri_cf
|
|
addi_tc_tsv 101100 ..... ..... .... 1 ........... @rri_cf
|
|
|
|
subi 100101 ..... ..... .... 0 ........... @rri_cf
|
|
subi_tsv 100101 ..... ..... .... 1 ........... @rri_cf
|
|
|
|
cmpiclr 100100 ..... ..... .... . ........... @rri_cf_d
|
|
|
|
hadd 000010 ..... ..... 00000011 11 0 ..... @rrr
|
|
hadd_ss 000010 ..... ..... 00000011 01 0 ..... @rrr
|
|
hadd_us 000010 ..... ..... 00000011 00 0 ..... @rrr
|
|
|
|
havg 000010 ..... ..... 00000010 11 0 ..... @rrr
|
|
|
|
hshl 111110 00000 r:5 100010 i:4 0 t:5 &rri
|
|
hshr_s 111110 r:5 00000 110011 i:4 0 t:5 &rri
|
|
hshr_u 111110 r:5 00000 110010 i:4 0 t:5 &rri
|
|
|
|
hsub 000010 ..... ..... 00000001 11 0 ..... @rrr
|
|
hsub_ss 000010 ..... ..... 00000001 01 0 ..... @rrr
|
|
hsub_us 000010 ..... ..... 00000001 00 0 ..... @rrr
|
|
|
|
mixh_l 111110 ..... ..... 1 00 00100000 ..... @rrr
|
|
mixh_r 111110 ..... ..... 1 10 00100000 ..... @rrr
|
|
mixw_l 111110 ..... ..... 1 00 00000000 ..... @rrr
|
|
mixw_r 111110 ..... ..... 1 10 00000000 ..... @rrr
|
|
|
|
permh 111110 r1:5 r2:5 0 c0:2 0 c1:2 c2:2 c3:2 0 t:5
|
|
|
|
####
|
|
# Index Mem
|
|
####
|
|
|
|
@ldstx ...... b:5 x:5 sp:2 scale:1 ....... m:1 t:5 &ldst disp=0
|
|
@ldim5 ...... b:5 ..... sp:2 ......... t:5 \
|
|
&ldst disp=%im5_16 x=0 scale=0 m=%ma_to_m
|
|
@stim5 ...... b:5 t:5 sp:2 ......... ..... \
|
|
&ldst disp=%im5_0 x=0 scale=0 m=%ma_to_m
|
|
|
|
ld 000011 ..... ..... .. . 1 -- 00 size:2 ...... @ldim5
|
|
ld 000011 ..... ..... .. . 0 -- 00 size:2 ...... @ldstx
|
|
st 000011 ..... ..... .. . 1 -- 10 size:2 ...... @stim5
|
|
ldc 000011 ..... ..... .. . 1 -- 0111 ...... @ldim5 size=2
|
|
ldc 000011 ..... ..... .. . 0 -- 0111 ...... @ldstx size=2
|
|
ldc 000011 ..... ..... .. . 1 -- 0101 ...... @ldim5 size=3
|
|
ldc 000011 ..... ..... .. . 0 -- 0101 ...... @ldstx size=3
|
|
lda 000011 ..... ..... .. . 1 -- 0110 ...... @ldim5 size=2
|
|
lda 000011 ..... ..... .. . 0 -- 0110 ...... @ldstx size=2
|
|
lda 000011 ..... ..... .. . 1 -- 0100 ...... @ldim5 size=3
|
|
lda 000011 ..... ..... .. . 0 -- 0100 ...... @ldstx size=3
|
|
sta 000011 ..... ..... .. . 1 -- 1110 ...... @stim5 size=2
|
|
sta 000011 ..... ..... .. . 1 -- 1111 ...... @stim5 size=3
|
|
stby 000011 b:5 r:5 sp:2 a:1 1 -- 1100 m:1 ..... disp=%im5_0
|
|
stdby 000011 b:5 r:5 sp:2 a:1 1 -- 1101 m:1 ..... disp=%im5_0
|
|
|
|
@fldstwx ...... b:5 x:5 sp:2 scale:1 ....... m:1 ..... \
|
|
&ldst t=%rt64 disp=0 size=2
|
|
@fldstwi ...... b:5 ..... sp:2 . ....... . ..... \
|
|
&ldst t=%rt64 disp=%im5_16 m=%ma_to_m x=0 scale=0 size=2
|
|
|
|
fldw 001001 ..... ..... .. . 0 -- 000 . . ..... @fldstwx
|
|
fldw 001001 ..... ..... .. . 1 -- 000 . . ..... @fldstwi
|
|
fstw 001001 ..... ..... .. . 0 -- 100 . . ..... @fldstwx
|
|
fstw 001001 ..... ..... .. . 1 -- 100 . . ..... @fldstwi
|
|
|
|
@fldstdx ...... b:5 x:5 sp:2 scale:1 ....... m:1 t:5 \
|
|
&ldst disp=0 size=3
|
|
@fldstdi ...... b:5 ..... sp:2 . ....... . t:5 \
|
|
&ldst disp=%im5_16 m=%ma_to_m x=0 scale=0 size=3
|
|
|
|
fldd 001011 ..... ..... .. . 0 -- 000 0 . ..... @fldstdx
|
|
fldd 001011 ..... ..... .. . 1 -- 000 0 . ..... @fldstdi
|
|
fstd 001011 ..... ..... .. . 0 -- 100 0 . ..... @fldstdx
|
|
fstd 001011 ..... ..... .. . 1 -- 100 0 . ..... @fldstdi
|
|
|
|
####
|
|
# Offset Mem
|
|
####
|
|
|
|
@ldstim11 ...... b:5 t:5 sp:2 .............. \
|
|
&ldst disp=%assemble_11a m=%ma2_to_m x=0 scale=0 size=3
|
|
@ldstim14 ...... b:5 t:5 sp:2 .............. \
|
|
&ldst disp=%lowsign_14 x=0 scale=0 m=0
|
|
@ldstim14m ...... b:5 t:5 sp:2 .............. \
|
|
&ldst disp=%lowsign_14 x=0 scale=0 m=%neg_to_m
|
|
@ldstim12m ...... b:5 t:5 sp:2 .............. \
|
|
&ldst disp=%assemble_12a x=0 scale=0 m=%pos_to_m
|
|
|
|
# LDB, LDH, LDW, LDWM
|
|
ld 010000 ..... ..... .. .............. @ldstim14 size=0
|
|
ld 010001 ..... ..... .. .............. @ldstim14 size=1
|
|
ld 010010 ..... ..... .. .............. @ldstim14 size=2
|
|
ld 010011 ..... ..... .. .............. @ldstim14m size=2
|
|
ld 010111 ..... ..... .. ...........10. @ldstim12m size=2
|
|
|
|
# STB, STH, STW, STWM
|
|
st 011000 ..... ..... .. .............. @ldstim14 size=0
|
|
st 011001 ..... ..... .. .............. @ldstim14 size=1
|
|
st 011010 ..... ..... .. .............. @ldstim14 size=2
|
|
st 011011 ..... ..... .. .............. @ldstim14m size=2
|
|
st 011111 ..... ..... .. ...........10. @ldstim12m size=2
|
|
|
|
fldw 010110 b:5 ..... sp:2 .............. \
|
|
&ldst disp=%assemble_12a t=%rm64 m=%a_to_m x=0 scale=0 size=2
|
|
fldw 010111 b:5 ..... sp:2 ...........0.. \
|
|
&ldst disp=%assemble_12a t=%rm64 m=0 x=0 scale=0 size=2
|
|
|
|
fstw 011110 b:5 ..... sp:2 .............. \
|
|
&ldst disp=%assemble_12a t=%rm64 m=%a_to_m x=0 scale=0 size=2
|
|
fstw 011111 b:5 ..... sp:2 ...........0.. \
|
|
&ldst disp=%assemble_12a t=%rm64 m=0 x=0 scale=0 size=2
|
|
|
|
ld 010100 ..... ..... .. ............0. @ldstim11
|
|
fldd 010100 ..... ..... .. ............1. @ldstim11
|
|
|
|
st 011100 ..... ..... .. ............0. @ldstim11
|
|
fstd 011100 ..... ..... .. ............1. @ldstim11
|
|
|
|
####
|
|
# Floating-point Multiply Add
|
|
####
|
|
|
|
&mpyadd rm1 rm2 ta ra tm
|
|
@mpyadd ...... rm1:5 rm2:5 ta:5 ra:5 . tm:5 &mpyadd
|
|
|
|
fmpyadd_f 000110 ..... ..... ..... ..... 0 ..... @mpyadd
|
|
fmpyadd_d 000110 ..... ..... ..... ..... 1 ..... @mpyadd
|
|
fmpysub_f 100110 ..... ..... ..... ..... 0 ..... @mpyadd
|
|
fmpysub_d 100110 ..... ..... ..... ..... 1 ..... @mpyadd
|
|
|
|
####
|
|
# Conditional Branches
|
|
####
|
|
|
|
bb_sar 110000 00000 r:5 c:1 1 d:1 ........... n:1 . disp=%assemble_12
|
|
bb_imm 110001 p:5 r:5 c:1 1 d:1 ........... n:1 . disp=%assemble_12
|
|
|
|
movb 110010 ..... ..... ... ........... . . @rrb_cf f=0
|
|
movbi 110011 ..... ..... ... ........... . . @rib_cf f=0
|
|
|
|
cmpb 100000 ..... ..... ... ........... . . @rrb_cdf d=0 f=0
|
|
cmpb 100010 ..... ..... ... ........... . . @rrb_cdf d=0 f=1
|
|
cmpb 100111 ..... ..... ... ........... . . @rrb_cdf d=1 f=0
|
|
cmpb 101111 ..... ..... ... ........... . . @rrb_cdf d=1 f=1
|
|
cmpbi 100001 ..... ..... ... ........... . . @rib_cdf d=0 f=0
|
|
cmpbi 100011 ..... ..... ... ........... . . @rib_cdf d=0 f=1
|
|
cmpbi 111011 r:5 ..... f:1 .. ........... n:1 . \
|
|
&rib_c_d_f d=1 disp=%assemble_12 c=%cmpbid_c i=%im5_16
|
|
|
|
addb 101000 ..... ..... ... ........... . . @rrb_cf f=0
|
|
addb 101010 ..... ..... ... ........... . . @rrb_cf f=1
|
|
addbi 101001 ..... ..... ... ........... . . @rib_cf f=0
|
|
addbi 101011 ..... ..... ... ........... . . @rib_cf f=1
|
|
|
|
####
|
|
# Shift, Extract, Deposit
|
|
####
|
|
|
|
shrp_sar 110100 r2:5 r1:5 c:3 00 0 d:1 0000 t:5
|
|
shrp_imm 110100 r2:5 r1:5 c:3 01 0 cpos:5 t:5 d=0
|
|
shrp_imm 110100 r2:5 r1:5 c:3 0. 1 ..... t:5 \
|
|
d=1 cpos=%cpos6_11
|
|
|
|
extr_sar 110100 r:5 t:5 c:3 10 se:1 00 000 ..... d=0 len=%len5
|
|
extr_sar 110100 r:5 t:5 c:3 10 se:1 1. 000 ..... d=1 len=%len6_8
|
|
extr_imm 110100 r:5 t:5 c:3 11 se:1 pos:5 ..... d=0 len=%len5
|
|
extr_imm 110110 r:5 t:5 c:3 .. se:1 ..... ..... \
|
|
d=1 len=%len6_12 pos=%cpos6_11
|
|
|
|
dep_sar 110101 t:5 r:5 c:3 00 nz:1 00 000 ..... d=0 len=%len5
|
|
dep_sar 110101 t:5 r:5 c:3 00 nz:1 1. 000 ..... d=1 len=%len6_8
|
|
dep_imm 110101 t:5 r:5 c:3 01 nz:1 cpos:5 ..... d=0 len=%len5
|
|
dep_imm 111100 t:5 r:5 c:3 .. nz:1 ..... ..... \
|
|
d=1 len=%len6_12 cpos=%cpos6_11
|
|
depi_sar 110101 t:5 ..... c:3 10 nz:1 d:1 . 000 ..... \
|
|
i=%im5_16 len=%len6_8
|
|
depi_imm 110101 t:5 ..... c:3 11 nz:1 cpos:5 ..... \
|
|
d=0 i=%im5_16 len=%len5
|
|
depi_imm 111101 t:5 ..... c:3 .. nz:1 ..... ..... \
|
|
d=1 i=%im5_16 len=%len6_12 cpos=%cpos6_11
|
|
|
|
####
|
|
# Branch External
|
|
####
|
|
|
|
&BE b l n disp sp
|
|
@be ...... b:5 ..... ... ........... n:1 . \
|
|
&BE disp=%assemble_17 sp=%assemble_sr3
|
|
|
|
be 111000 ..... ..... ... ........... . . @be l=0
|
|
be 111001 ..... ..... ... ........... . . @be l=31
|
|
|
|
####
|
|
# Branch
|
|
####
|
|
|
|
&BL l n disp
|
|
@bl ...... l:5 ..... ... ........... n:1 . &BL disp=%assemble_17
|
|
|
|
# B,L and B,L,PUSH
|
|
bl 111010 ..... ..... 000 ........... . . @bl
|
|
bl 111010 ..... ..... 100 ........... . . @bl
|
|
# B,L (long displacement)
|
|
bl 111010 ..... ..... 101 ........... n:1 . &BL l=2 \
|
|
disp=%assemble_22
|
|
b_gate 111010 ..... ..... 001 ........... . . @bl
|
|
blr 111010 l:5 x:5 010 00000000000 n:1 0
|
|
nopbts 111010 00000 00000 010 0---------1 0 1 # clrbts/popbts
|
|
nopbts 111010 00000 ----- 010 00000000000 0 1 # pushbts/pushnom
|
|
bv 111010 b:5 x:5 110 00000000000 n:1 0
|
|
bve 111010 b:5 00000 110 10000000000 n:1 - l=0
|
|
bve 111010 b:5 00000 111 10000000000 n:1 - l=2
|
|
|
|
####
|
|
# FP Fused Multiple-Add
|
|
####
|
|
|
|
fmpyfadd_f 101110 ..... ..... ... . 0 ... . . neg:1 ..... \
|
|
rm1=%ra64 rm2=%rb64 ra3=%rc64 t=%rt64
|
|
fmpyfadd_d 101110 rm1:5 rm2:5 ... 0 1 ..0 0 0 neg:1 t:5 ra3=%rc32
|
|
|
|
####
|
|
# FP operations
|
|
####
|
|
|
|
&fclass01 r t
|
|
&fclass2 r1 r2 c y
|
|
&fclass3 r1 r2 t
|
|
|
|
@f0c_0 ...... r:5 00000 ..... 00 000 0 t:5 &fclass01
|
|
@f0c_1 ...... r:5 000.. ..... 01 000 0 t:5 &fclass01
|
|
@f0c_2 ...... r1:5 r2:5 y:3 .. 10 000 . c:5 &fclass2
|
|
@f0c_3 ...... r1:5 r2:5 ..... 11 000 0 t:5 &fclass3
|
|
|
|
@f0e_f_0 ...... ..... 00000 ... 0 0 000 .. 0 ..... \
|
|
&fclass01 r=%ra64 t=%rt64
|
|
@f0e_d_0 ...... r:5 00000 ... 0 1 000 00 0 t:5 &fclass01
|
|
|
|
@f0e_ff_1 ...... ..... 000 ... 0000 010 .. 0 ..... \
|
|
&fclass01 r=%ra64 t=%rt64
|
|
@f0e_fd_1 ...... ..... 000 ... 0100 010 .0 0 t:5 &fclass01 r=%ra64
|
|
@f0e_df_1 ...... r:5 000 ... 0001 010 0. 0 ..... &fclass01 t=%rt64
|
|
@f0e_dd_1 ...... r:5 000 ... 0101 010 00 0 t:5 &fclass01
|
|
|
|
@f0e_f_2 ...... ..... ..... y:3 .0 100 .00 c:5 \
|
|
&fclass2 r1=%ra64 r2=%rb64
|
|
@f0e_d_2 ...... r1:5 r2:5 y:3 01 100 000 c:5 &fclass2
|
|
|
|
@f0e_f_3 ...... ..... ..... ... .0 110 ..0 ..... \
|
|
&fclass3 r1=%ra64 r2=%rb64 t=%rt64
|
|
@f0e_d_3 ...... r1:5 r2:5 ... 01 110 000 t:5 &fclass3
|
|
|
|
# Floating point class 0
|
|
|
|
fid_f 001100 00000 00000 000 00 000000 00000
|
|
|
|
fcpy_f 001100 ..... ..... 010 00 ...... ..... @f0c_0
|
|
fabs_f 001100 ..... ..... 011 00 ...... ..... @f0c_0
|
|
fsqrt_f 001100 ..... ..... 100 00 ...... ..... @f0c_0
|
|
frnd_f 001100 ..... ..... 101 00 ...... ..... @f0c_0
|
|
fneg_f 001100 ..... ..... 110 00 ...... ..... @f0c_0
|
|
fnegabs_f 001100 ..... ..... 111 00 ...... ..... @f0c_0
|
|
|
|
fcpy_d 001100 ..... ..... 010 01 ...... ..... @f0c_0
|
|
fabs_d 001100 ..... ..... 011 01 ...... ..... @f0c_0
|
|
fsqrt_d 001100 ..... ..... 100 01 ...... ..... @f0c_0
|
|
frnd_d 001100 ..... ..... 101 01 ...... ..... @f0c_0
|
|
fneg_d 001100 ..... ..... 110 01 ...... ..... @f0c_0
|
|
fnegabs_d 001100 ..... ..... 111 01 ...... ..... @f0c_0
|
|
|
|
fcpy_f 001110 ..... ..... 010 ........ ..... @f0e_f_0
|
|
fabs_f 001110 ..... ..... 011 ........ ..... @f0e_f_0
|
|
fsqrt_f 001110 ..... ..... 100 ........ ..... @f0e_f_0
|
|
frnd_f 001110 ..... ..... 101 ........ ..... @f0e_f_0
|
|
fneg_f 001110 ..... ..... 110 ........ ..... @f0e_f_0
|
|
fnegabs_f 001110 ..... ..... 111 ........ ..... @f0e_f_0
|
|
|
|
fcpy_d 001110 ..... ..... 010 ........ ..... @f0e_d_0
|
|
fabs_d 001110 ..... ..... 011 ........ ..... @f0e_d_0
|
|
fsqrt_d 001110 ..... ..... 100 ........ ..... @f0e_d_0
|
|
frnd_d 001110 ..... ..... 101 ........ ..... @f0e_d_0
|
|
fneg_d 001110 ..... ..... 110 ........ ..... @f0e_d_0
|
|
fnegabs_d 001110 ..... ..... 111 ........ ..... @f0e_d_0
|
|
|
|
# Floating point class 1
|
|
|
|
# float/float
|
|
fcnv_d_f 001100 ..... ... 000 00 01 ...... ..... @f0c_1
|
|
fcnv_f_d 001100 ..... ... 000 01 00 ...... ..... @f0c_1
|
|
|
|
fcnv_d_f 001110 ..... ... 000 .......... ..... @f0e_df_1
|
|
fcnv_f_d 001110 ..... ... 000 .......... ..... @f0e_fd_1
|
|
|
|
# int/float
|
|
fcnv_w_f 001100 ..... ... 001 00 00 ...... ..... @f0c_1
|
|
fcnv_q_f 001100 ..... ... 001 00 01 ...... ..... @f0c_1
|
|
fcnv_w_d 001100 ..... ... 001 01 00 ...... ..... @f0c_1
|
|
fcnv_q_d 001100 ..... ... 001 01 01 ...... ..... @f0c_1
|
|
|
|
fcnv_w_f 001110 ..... ... 001 .......... ..... @f0e_ff_1
|
|
fcnv_q_f 001110 ..... ... 001 .......... ..... @f0e_df_1
|
|
fcnv_w_d 001110 ..... ... 001 .......... ..... @f0e_fd_1
|
|
fcnv_q_d 001110 ..... ... 001 .......... ..... @f0e_dd_1
|
|
|
|
# float/int
|
|
fcnv_f_w 001100 ..... ... 010 00 00 ...... ..... @f0c_1
|
|
fcnv_d_w 001100 ..... ... 010 00 01 ...... ..... @f0c_1
|
|
fcnv_f_q 001100 ..... ... 010 01 00 ...... ..... @f0c_1
|
|
fcnv_d_q 001100 ..... ... 010 01 01 ...... ..... @f0c_1
|
|
|
|
fcnv_f_w 001110 ..... ... 010 .......... ..... @f0e_ff_1
|
|
fcnv_d_w 001110 ..... ... 010 .......... ..... @f0e_df_1
|
|
fcnv_f_q 001110 ..... ... 010 .......... ..... @f0e_fd_1
|
|
fcnv_d_q 001110 ..... ... 010 .......... ..... @f0e_dd_1
|
|
|
|
# float/int truncate
|
|
fcnv_t_f_w 001100 ..... ... 011 00 00 ...... ..... @f0c_1
|
|
fcnv_t_d_w 001100 ..... ... 011 00 01 ...... ..... @f0c_1
|
|
fcnv_t_f_q 001100 ..... ... 011 01 00 ...... ..... @f0c_1
|
|
fcnv_t_d_q 001100 ..... ... 011 01 01 ...... ..... @f0c_1
|
|
|
|
fcnv_t_f_w 001110 ..... ... 011 .......... ..... @f0e_ff_1
|
|
fcnv_t_d_w 001110 ..... ... 011 .......... ..... @f0e_df_1
|
|
fcnv_t_f_q 001110 ..... ... 011 .......... ..... @f0e_fd_1
|
|
fcnv_t_d_q 001110 ..... ... 011 .......... ..... @f0e_dd_1
|
|
|
|
# uint/float
|
|
fcnv_uw_f 001100 ..... ... 101 00 00 ...... ..... @f0c_1
|
|
fcnv_uq_f 001100 ..... ... 101 00 01 ...... ..... @f0c_1
|
|
fcnv_uw_d 001100 ..... ... 101 01 00 ...... ..... @f0c_1
|
|
fcnv_uq_d 001100 ..... ... 101 01 01 ...... ..... @f0c_1
|
|
|
|
fcnv_uw_f 001110 ..... ... 101 .......... ..... @f0e_ff_1
|
|
fcnv_uq_f 001110 ..... ... 101 .......... ..... @f0e_df_1
|
|
fcnv_uw_d 001110 ..... ... 101 .......... ..... @f0e_fd_1
|
|
fcnv_uq_d 001110 ..... ... 101 .......... ..... @f0e_dd_1
|
|
|
|
# float/int
|
|
fcnv_f_uw 001100 ..... ... 110 00 00 ...... ..... @f0c_1
|
|
fcnv_d_uw 001100 ..... ... 110 00 01 ...... ..... @f0c_1
|
|
fcnv_f_uq 001100 ..... ... 110 01 00 ...... ..... @f0c_1
|
|
fcnv_d_uq 001100 ..... ... 110 01 01 ...... ..... @f0c_1
|
|
|
|
fcnv_f_uw 001110 ..... ... 110 .......... ..... @f0e_ff_1
|
|
fcnv_d_uw 001110 ..... ... 110 .......... ..... @f0e_df_1
|
|
fcnv_f_uq 001110 ..... ... 110 .......... ..... @f0e_fd_1
|
|
fcnv_d_uq 001110 ..... ... 110 .......... ..... @f0e_dd_1
|
|
|
|
# float/int truncate
|
|
fcnv_t_f_uw 001100 ..... ... 111 00 00 ...... ..... @f0c_1
|
|
fcnv_t_d_uw 001100 ..... ... 111 00 01 ...... ..... @f0c_1
|
|
fcnv_t_f_uq 001100 ..... ... 111 01 00 ...... ..... @f0c_1
|
|
fcnv_t_d_uq 001100 ..... ... 111 01 01 ...... ..... @f0c_1
|
|
|
|
fcnv_t_f_uw 001110 ..... ... 111 .......... ..... @f0e_ff_1
|
|
fcnv_t_d_uw 001110 ..... ... 111 .......... ..... @f0e_df_1
|
|
fcnv_t_f_uq 001110 ..... ... 111 .......... ..... @f0e_fd_1
|
|
fcnv_t_d_uq 001110 ..... ... 111 .......... ..... @f0e_dd_1
|
|
|
|
# Floating point class 2
|
|
|
|
ftest 001100 00000 00000 y:3 00 10000 1 c:5
|
|
|
|
fcmp_f 001100 ..... ..... ... 00 ..... 0 ..... @f0c_2
|
|
fcmp_d 001100 ..... ..... ... 01 ..... 0 ..... @f0c_2
|
|
|
|
fcmp_f 001110 ..... ..... ... ..... ... ..... @f0e_f_2
|
|
fcmp_d 001110 ..... ..... ... ..... ... ..... @f0e_d_2
|
|
|
|
# Floating point class 3
|
|
|
|
fadd_f 001100 ..... ..... 000 00 ...... ..... @f0c_3
|
|
fsub_f 001100 ..... ..... 001 00 ...... ..... @f0c_3
|
|
fmpy_f 001100 ..... ..... 010 00 ...... ..... @f0c_3
|
|
fdiv_f 001100 ..... ..... 011 00 ...... ..... @f0c_3
|
|
|
|
fadd_d 001100 ..... ..... 000 01 ...... ..... @f0c_3
|
|
fsub_d 001100 ..... ..... 001 01 ...... ..... @f0c_3
|
|
fmpy_d 001100 ..... ..... 010 01 ...... ..... @f0c_3
|
|
fdiv_d 001100 ..... ..... 011 01 ...... ..... @f0c_3
|
|
|
|
fadd_f 001110 ..... ..... 000 ..... ... ..... @f0e_f_3
|
|
fsub_f 001110 ..... ..... 001 ..... ... ..... @f0e_f_3
|
|
fmpy_f 001110 ..... ..... 010 ..... ... ..... @f0e_f_3
|
|
fdiv_f 001110 ..... ..... 011 ..... ... ..... @f0e_f_3
|
|
|
|
fadd_d 001110 ..... ..... 000 ..... ... ..... @f0e_d_3
|
|
fsub_d 001110 ..... ..... 001 ..... ... ..... @f0e_d_3
|
|
fmpy_d 001110 ..... ..... 010 ..... ... ..... @f0e_d_3
|
|
fdiv_d 001110 ..... ..... 011 ..... ... ..... @f0e_d_3
|
|
|
|
xmpyu 001110 ..... ..... 010 .0111 .00 t:5 r1=%ra64 r2=%rb64
|
|
|
|
# diag
|
|
diag 000101 i:26
|