Move insn_codes for mcrfs, mtfsb0/1 and mtfsfi
authorPaul Mackerras <paulus@ozlabs.org>
Mon, 3 Jul 2023 11:09:33 +0000 (21:09 +1000)
committerPaul Mackerras <paulus@ozlabs.org>
Mon, 3 Jul 2023 12:17:33 +0000 (22:17 +1000)
This moves the insn_code values for mcrfs, mtfsb0/1 and mtfsfi into
the region used for floating-point instructions.  This means that in
no-FPU implementations, they will get turned into illegal instructions
in predecode.  We then don't need the code in execute1 that makes FP
instructions illegal in no-FPU implementations.

We also remove the NONE value for unit_t, since it was only ever used
with insn_type = OP_ILLEGAL, and the check for unit = NONE was
redundant with the check for insn_type = OP_ILLEGAL.  Thus the check
for unit = NONE is no longer needed and is removed here.

Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
common.vhdl
decode1.vhdl
decode_types.vhdl
execute1.vhdl

index 7c7a8d5ee93792d6aebb581e285c9aba7d05c597..44302c76b480051d396c147647cf984c3666c7c4 100644 (file)
@@ -361,7 +361,7 @@ package common is
         dec_ctr : std_ulogic;
     end record;
     constant Decode2ToExecute1Init : Decode2ToExecute1Type :=
-       (valid => '0', unit => NONE, fac => NONE, insn_type => OP_ILLEGAL, instr_tag => instr_tag_init,
+       (valid => '0', unit => ALU, fac => NONE, insn_type => OP_ILLEGAL, instr_tag => instr_tag_init,
          write_reg_enable => '0',
          lr => '0', br_abs => '0', rc => '0', oe => '0', invert_a => '0',
         invert_out => '0', input_carry => ZERO, output_carry => '0', input_cr => '0',
index 559a505f42d9fb27416424f81812eddb2845edde..c987beca00d79e4bafc0d8941a0b6d26674ee730 100644 (file)
@@ -64,7 +64,7 @@ architecture behaviour of decode1 is
     constant decode_rom : decoder_rom_t := (
         --                   unit   fac   internal      in1         in2          in3   out   CR   CR   inv  inv  cry   cry  ldst  BR   sgn  upd  rsrv 32b  sgn  rc    lk   sgl  rpt
         --                                     op                                            in   out   A   out  in    out  len        ext                                 pipe
-        INSN_illegal     =>  (NONE, NONE, OP_ILLEGAL,   NONE,       NONE,        NONE, NONE, '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '0', NONE),
+        INSN_illegal     =>  (ALU,  NONE, OP_ILLEGAL,   NONE,       NONE,        NONE, NONE, '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '0', NONE),
         INSN_fetch_fail  =>  (LDST, NONE, OP_FETCH_FAILED, CIA,     NONE,        NONE, NONE, '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '0', NONE),
 
         INSN_add         =>  (ALU,  NONE, OP_ADD,       RA,         RB,          NONE, RT,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', RCOE, '0', '0', NONE),
@@ -347,7 +347,7 @@ architecture behaviour of decode1 is
         INSN_xori        =>  (ALU,  NONE, OP_XOR,       NONE,       CONST_UI,    RS,   RA,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '0', NONE),
         INSN_xoris       =>  (ALU,  NONE, OP_XOR,       NONE,       CONST_UI_HI, RS,   RA,   '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '0', NONE),
 
-        others           =>  (NONE, NONE, OP_ILLEGAL,   NONE,       NONE,        NONE, NONE, '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '0', NONE)
+        others           =>  (ALU,  NONE, OP_ILLEGAL,   NONE,       NONE,        NONE, NONE, '0', '0', '0', '0', ZERO, '0', NONE, '0', '0', '0', '0', '0', '0', NONE, '0', '0', NONE)
         );
 
     function decode_ram_spr(sprn : spr_num_t) return ram_spr_info is
index 7ceb2ae85663487a202df08f3f548febbef213d6..e9f6e70c35afd06511c7d1e366ecaf977d6ba2ff 100644 (file)
@@ -84,60 +84,57 @@ package decode_types is
         INSN_lwz,
         INSN_lwzu, -- 50
         INSN_mcrf,
-        INSN_mcrfs,
         INSN_mcrxrx,
         INSN_mfcr,
         INSN_mfmsr,
         INSN_mfspr,
         INSN_mtcrf,
-        INSN_mtfsb,
-        INSN_mtfsfi,
-        INSN_mtmsr, -- 60
+        INSN_mtmsr,
         INSN_mtmsrd,
         INSN_mtspr,
-        INSN_mulli,
+        INSN_mulli, -- 60
         INSN_neg,
         INSN_nop,
         INSN_ori,
         INSN_oris,
         INSN_popcntb,
         INSN_popcntw,
-        INSN_popcntd, -- 70
+        INSN_popcntd,
         INSN_prtyw,
         INSN_prtyd,
-        INSN_rfid,
+        INSN_rfid, -- 70
         INSN_rldic,
         INSN_rldicl,
         INSN_rldicr,
         INSN_rldimi,
         INSN_rlwimi,
         INSN_rlwinm,
-        INSN_sc, -- 80
+        INSN_sc,
         INSN_setb,
         INSN_slbia,
-        INSN_sradi,
+        INSN_sradi, -- 80
         INSN_srawi,
         INSN_stb,
         INSN_stbu,
         INSN_std,
         INSN_stdu,
         INSN_sth,
-        INSN_sthu, -- 90
+        INSN_sthu,
         INSN_stw,
         INSN_stwu,
-        INSN_subfic,
+        INSN_subfic, -- 90
         INSN_subfme,
         INSN_subfze,
         INSN_sync,
         INSN_tdi,
         INSN_tlbsync,
         INSN_twi,
-        INSN_wait, -- 100
+        INSN_wait,
         INSN_xori,
         INSN_xoris,
 
         -- pad to 112 to simplify comparison logic
-        INSN_103,
+        INSN_100, INSN_101, INSN_102, INSN_103,
         INSN_104, INSN_105, INSN_106, INSN_107,
         INSN_108, INSN_109, INSN_110, INSN_111,
 
@@ -289,59 +286,64 @@ package decode_types is
         INSN_lfiwzx,
         INSN_lfsx,
         INSN_lfsux,
-        INSN_275, -- padding
+        -- These are here in order to keep the FP instructions together
+        INSN_mcrfs,
+        INSN_mtfsb,
+        INSN_mtfsfi,
+        INSN_278, -- padding
+        INSN_279,
 
         -- The following instructions access FRA and/or FRB operands
-        INSN_fabs,
+        INSN_fabs, -- 280
         INSN_fadd,
         INSN_fadds,
         INSN_fcfid,
-        INSN_fcfids, -- 280
+        INSN_fcfids,
         INSN_fcfidu,
         INSN_fcfidus,
         INSN_fcmpo,
         INSN_fcmpu,
         INSN_fcpsgn,
-        INSN_fctid,
+        INSN_fctid, -- 290
         INSN_fctidz,
         INSN_fctidu,
         INSN_fctiduz,
-        INSN_fctiw, -- 290
+        INSN_fctiw,
         INSN_fctiwz,
         INSN_fctiwu,
         INSN_fctiwuz,
         INSN_fdiv,
         INSN_fdivs,
-        INSN_fmr,
+        INSN_fmr, -- 300
         INSN_fmrgew,
         INSN_fmrgow,
         INSN_fnabs,
-        INSN_fneg, -- 300
+        INSN_fneg,
         INSN_fre,
         INSN_fres,
         INSN_frim,
         INSN_frin,
         INSN_frip,
-        INSN_friz,
+        INSN_friz, -- 310
         INSN_frsp,
         INSN_frsqrte,
         INSN_frsqrtes,
-        INSN_fsqrt, -- 310
+        INSN_fsqrt,
         INSN_fsqrts,
         INSN_fsub,
         INSN_fsubs,
         INSN_ftdiv,
         INSN_ftsqrt,
-        INSN_mffs,
+        INSN_mffs, -- 320
         INSN_mtfsf,
 
-        -- pad to 320
-        INSN_318, INSN_319,
+        -- pad to 328
+        INSN_322, INSN_323, INSN_324, INSN_325, INSN_326, INSN_327,
 
         -- The following instructions access FRA, FRB (possibly) and FRC operands
-        INSN_fmul, -- 320
+        INSN_fmul,
         INSN_fmuls,
-        INSN_fmadd,
+        INSN_fmadd, -- 330
         INSN_fmadds,
         INSN_fmsub,
         INSN_fmsubs,
@@ -349,7 +351,7 @@ package decode_types is
         INSN_fnmadds,
         INSN_fnmsub,
         INSN_fnmsubs,
-        INSN_fsel  -- 330
+        INSN_fsel
         );
 
     constant INSN_first_rb : insn_code := INSN_add;
@@ -384,7 +386,7 @@ package decode_types is
 
     constant TOO_OFFSET : integer := 0;
 
-    type unit_t is (NONE, ALU, LDST, FPU);
+    type unit_t is (ALU, LDST, FPU);
     type facility_t is (NONE, FPU);
     type length_t is (NONE, is1B, is2B, is4B, is8B);
 
@@ -425,7 +427,7 @@ package decode_types is
        sgl_pipe     : std_ulogic;
         repeat       : repeat_t;
     end record;
-    constant decode_rom_init : decode_rom_t := (unit => NONE, facility => NONE,
+    constant decode_rom_init : decode_rom_t := (unit => ALU, facility => NONE,
                                                insn_type => OP_ILLEGAL, input_reg_a => NONE,
                                                input_reg_b => NONE, input_reg_c => NONE,
                                                output_reg_a => NONE, input_cr => '0', output_cr => '0',
index e31f4d6709ea2731b411999028f37db92d836d56..db1159dc0a0e957990548eea404f5f83376775f2 100644 (file)
@@ -1028,11 +1028,6 @@ begin
             privileged := '1';
         end if;
 
-        if (not HAS_FPU and e_in.fac = FPU) or e_in.unit = NONE then
-            -- make lfd/stfd/lfs/stfs etc. illegal in no-FPU implementations
-            illegal := '1';
-        end if;
-
         v.do_trace := ex1.msr(MSR_SE);
         case_0: case e_in.insn_type is
            when OP_ILLEGAL =>