📄 sparc_lib.vhd
字号:
when "1110" => Result.Mnemo := FBULE; when "1111" => Result.Mnemo := FBO; when others => NULL; end case; -- cond if a_bit = '0' then Result.a := 0; -- Result.a is a natural. else Result.a := 1; end if; when "111" => -------------- OP + OP2 testing -------------- case cond is -- 3rd level when "0000" => Result.Mnemo := CBN; when "0001" => Result.Mnemo := CB123; when "0010" => Result.Mnemo := CB12; when "0011" => Result.Mnemo := CB13; when "0100" => Result.Mnemo := CB1; when "0101" => Result.Mnemo := CB23; when "0110" => Result.Mnemo := CB2; when "0111" => Result.Mnemo := CB3; when "1000" => Result.Mnemo := CBA; when "1001" => Result.Mnemo := CB0; when "1010" => Result.Mnemo := CB03; when "1011" => Result.Mnemo := CB02; when "1100" => Result.Mnemo := CB023; when "1101" => Result.Mnemo := CB01; when "1110" => Result.Mnemo := CB013; when "1111" => Result.Mnemo := CB012; when others => NULL; end case; -- cond if a_bit = '0' then Result.a := 0; -- Result.a is a natural. else Result.a := 1; end if; when "000" => -------------- OP + OP2 testing -------------- Result.Mnemo := UNIMP; when others => Result.Mnemo := ILLEGAL; -- Unknown and illegal instruction end case; -- op2 when "11" => -------------- OP testing -------------- Result.asi := ToNatural(asi); case op3 is -- 2nd level: OP + OP3 testing ------- when "000000" => Result.Mnemo := LD; when "000001" => Result.Mnemo := LDUB; when "000010" => Result.Mnemo := LDUH; when "000011" => Result.Mnemo := LDD; when "000100" => Result.Mnemo := ST; when "000101" => Result.Mnemo := STB; when "000110" => Result.Mnemo := STH; when "000111" => Result.Mnemo := I_STD; when "001001" => Result.Mnemo := LDSB; when "001010" => Result.Mnemo := LDSH; when "001101" => Result.Mnemo := LDSTUB; when "001111" => Result.Mnemo := SWAP; when "010000" => Result.Mnemo := LDA; when "010001" => Result.Mnemo := LDUBA; when "010010" => Result.Mnemo := LDUHA; when "010011" => Result.Mnemo := LDDA; when "010100" => Result.Mnemo := STA; when "010101" => Result.Mnemo := STBA; when "010110" => Result.Mnemo := STHA; when "010111" => Result.Mnemo := STDA; when "011001" => Result.Mnemo := LDSBA; when "011010" => Result.Mnemo := LDSHA; when "011101" => Result.Mnemo := LDSTUBA; when "011111" => Result.Mnemo := SWAPA; when "100000" => Result.Mnemo := LDF; when "100001" => Result.Mnemo := LDFSR; when "100011" => Result.Mnemo := LDDF; when "100100" => Result.Mnemo := STF; when "100101" => Result.Mnemo := STFSR; when "100110" => Result.Mnemo := STDFQ; when "100111" => Result.Mnemo := STDF; when "110000" => Result.Mnemo := LDC; when "110001" => Result.Mnemo := LDCSR; when "110011" => Result.Mnemo := LDDC; when "110100" => Result.Mnemo := STC; when "110101" => Result.Mnemo := STCSR; when "110110" => Result.Mnemo := STDCQ; when "110111" => Result.Mnemo := STDC; when others => Result.Mnemo := ILLEGAL; -- Unknown and illegal instruction end case; -- op3 when "10" => -------------- OP testing -------------- case op3 is -- 2nd level: OP + OP3 testing ------- when "000000" => Result.Mnemo := ADD; when "000001" => Result.Mnemo := I_AND; when "000010" => Result.Mnemo := I_OR; when "000011" => Result.Mnemo := I_XOR; when "000100" => Result.Mnemo := SUB; when "000101" => Result.Mnemo := ANDN; when "000110" => Result.Mnemo := ORN; when "000111" => Result.Mnemo := XNOR; when "001000" => Result.Mnemo := ADDX; when "001010" => Result.Mnemo := UMUL; -- SPARC v.8 when "001011" => Result.Mnemo := SMUL; -- SPARC v.8 when "001100" => Result.Mnemo := SUBX; when "001110" => Result.Mnemo := UDIV; -- SPARC v.8 when "001111" => Result.Mnemo := SDIV; -- SPARC v.8 when "010000" => Result.Mnemo := ADDcc; when "010001" => Result.Mnemo := ANDcc; when "010010" => Result.Mnemo := ORcc; when "010011" => Result.Mnemo := XORcc; when "010100" => Result.Mnemo := SUBcc; when "010101" => Result.Mnemo := ANDNcc; when "010110" => Result.Mnemo := ORNcc; when "010111" => Result.Mnemo := XNORcc; when "011000" => Result.Mnemo := ADDXcc; when "011010" => Result.Mnemo := UMULcc; -- SPARC v.8 when "011011" => Result.Mnemo := SMULcc; -- SPARC v.8 when "011100" => Result.Mnemo := SUBXcc; when "011110" => Result.Mnemo := UDIVcc; -- SPARC v.8 when "011111" => Result.Mnemo := SDIVcc; -- SPARC v.8 when "100000" => Result.Mnemo := TADDcc; when "100001" => Result.Mnemo := TSUBcc; when "100010" => Result.Mnemo := TADDccTV; when "100011" => Result.Mnemo := TSUBccTV; when "100100" => Result.Mnemo := MULScc; when "100101" => Result.Mnemo := SLL; when "100110" => Result.Mnemo := SRL; when "100111" => Result.Mnemo := SRA; when "101000" => Result.Mnemo := RDY; when "101001" => Result.Mnemo := RDPSR; when "101010" => Result.Mnemo := RDWIM; when "101011" => Result.Mnemo := RDTBR; when "110000" => Result.Mnemo := WRY; when "110001" => Result.Mnemo := WRPSR; when "110010" => Result.Mnemo := WRWIM; when "110011" => Result.Mnemo := WRTBR; when "110100" => --- FPop1 instructions --- case opf is when "000000001" => Result.Mnemo := FMOVs; when "000000101" => Result.Mnemo := FNEGs; when "000001001" => Result.Mnemo := FABSs; when "000101001" => Result.Mnemo := FSQRTs; when "000101010" => Result.Mnemo := FSQRTd; when "000101011" => Result.Mnemo := FSQRTq; when "001000001" => Result.Mnemo := FADDs; when "001000010" => Result.Mnemo := FADDd; when "001000011" => Result.Mnemo := FADDq; when "001000101" => Result.Mnemo := FSUBs; when "001000110" => Result.Mnemo := FSUBd; when "001000111" => Result.Mnemo := FSUBq; when "001001001" => Result.Mnemo := FMULs; when "001001010" => Result.Mnemo := FMULd; when "001001011" => Result.Mnemo := FMULq; when "001001101" => Result.Mnemo := FDIVs; when "001001110" => Result.Mnemo := FDIVd; when "001001111" => Result.Mnemo := FDIVq; when "001101001" => Result.Mnemo := FsMULd; -- SPARC v.8 when "001101110" => Result.Mnemo := FdMULq; -- SPARC v.8 when "011000100" => Result.Mnemo := FiTOs; when "011000110" => Result.Mnemo := FdTOs; when "011000111" => Result.Mnemo := FqTOs; when "011001000" => Result.Mnemo := FiTOd; when "011001001" => Result.Mnemo := FsTOd; when "011001011" => Result.Mnemo := FqTOd; when "011001100" => Result.Mnemo := FiTOq; when "011001101" => Result.Mnemo := FsTOq; when "011001110" => Result.Mnemo := FdTOq; when "011010001" => Result.Mnemo := FsTOi; when "011010010" => Result.Mnemo := FdTOi; when "011010011" => Result.Mnemo := FqTOi; when others => Result.Mnemo := ILLEGAL; -- Unknown and illegal instruction end case; -- opf when "110101" => --- FPop2 instructions --- case opf is when "001010001" => Result.Mnemo := FCMPs; when "001010010" => Result.Mnemo := FCMPd; when "001010011" => Result.Mnemo := FCMPq; when "001010101" => Result.Mnemo := FCMPEs; when "001010110" => Result.Mnemo := FCMPEd; when "001010111" => Result.Mnemo := FCMPEq; when others => Result.Mnemo := ILLEGAL; -- Unknown and illegal instruction end case; -- opf when "110110" => Result.Mnemo := CPop1; when "110111" => Result.Mnemo := CPop2; when "111000" => Result.Mnemo := JMPL; when "111001" => Result.Mnemo := RETT; when "111010" => --- Ticc instructions --- case cond is -- 3rd level when "0000" => Result.Mnemo := TN; when "0001" => Result.Mnemo := TE; when "0010" => Result.Mnemo := TLE; when "0011" => Result.Mnemo := TL; when "0100" => Result.Mnemo := TLEU; when "0101" => Result.Mnemo := TCS; when "0110" => Result.Mnemo := TNEG; when "0111" => Result.Mnemo := TVS; when "1000" => Result.Mnemo := TA; when "1001" => Result.Mnemo := TNE; when "1010" => Result.Mnemo := TG; when "1011" => Result.Mnemo := TGE; when "1100" => Result.Mnemo := TGU; when "1101" => Result.Mnemo := TCC; when "1110" => Result.Mnemo := TPOS; when "1111" => Result.Mnemo := TVC; when others => NULL; end case; -- cond when "111011" => Result.Mnemo := FLUSH; when "111100" => Result.Mnemo := SAVE; when "111101" => Result.Mnemo := RESTORE; when others => Result.Mnemo := ILLEGAL; -- Unknown and illegal instruction end case; -- op3 when "01" => -------------- OP testing -------------- Result.Mnemo := CALL; Result.disp30 := disp30; when others => NULL; end case; -- op return Result; end Transcribe; -- function ------------------------------------- function iccEvaluation(Mnemonic : SuperInstMnemonic; icc : std_logic_vector) return boolean is begin if ( (Mnemonic = BA) or (Mnemonic = BNE and icc(Z_ICC) = '0') or (Mnemonic = BE and icc(Z_ICC) = '1') or (Mnemonic = BG and (icc(Z_ICC) or (icc(N_ICC) xor icc(V_ICC))) = '0')or (Mnemonic = BLE and (icc(Z_ICC) or (icc(N_ICC) xor icc(V_ICC))) = '1')or (Mnemonic = BGE and (icc(N_ICC) xor icc(V_ICC)) = '0') or (Mnemonic = BL and (icc(N_ICC) xor icc(V_ICC)) = '1')or (Mnemonic = BGU and ((icc(C_ICC) = '0') and (icc(Z_ICC) = '0')) ) or (Mnemonic = BLEU and ((icc(C_ICC) = '1') or (icc(Z_ICC) = '1')) ) or (Mnemonic = BCC and icc(C_ICC) = '0') or (Mnemonic = BCS and icc(C_ICC) = '1') or (Mnemonic = BPOS and icc(N_ICC) = '0') or (Mnemonic = BNEG and icc(N_ICC) = '1') or (Mnemonic = BVC and icc(V_ICC) = '0') or (Mnemonic = BVS and icc(V_ICC) = '1') ) then return TRUE; end if; return FALSE; end iccEvaluation; -- function ------------------------------------- function TiccEval(Mnemonic : SuperInstMnemonic; icc : std_logic_vector) return boolean is begin if ( (Mnemonic = TA) or (Mnemonic = TNE and icc(Z_ICC) = '0') or (Mnemonic = TE and icc(Z_ICC) = '1') or (Mnemonic = TG and (icc(Z_ICC) or (icc(N_ICC) xor icc(V_ICC))) = '0')or (Mnemonic = TLE and (icc(Z_ICC) or (icc(N_ICC) xor icc(V_ICC))) = '1')or (Mnemonic = TGE and (icc(N_ICC) xor icc(V_ICC)) = '0') or (Mnemonic = TL and (icc(N_ICC) xor icc(V_ICC)) = '1')or (Mnemonic = TGU and ((icc(C_ICC) = '0') and (icc(Z_ICC) = '0')) ) or (Mnemonic = TLEU and ((icc(C_ICC) = '1') or (icc(Z_ICC) = '1')) ) or (Mnemonic = TCC and icc(C_ICC
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -