Procházet zdrojové kódy

+ support for REV and several other ARMv6/ARMv6T2+ opcodes (mantis #21888)

git-svn-id: trunk@21285 -
Jonas Maebe před 13 roky
rodič
revize
ef2d665a50

+ 91 - 2
compiler/arm/armatt.inc

@@ -179,6 +179,97 @@
 'fuitos',
 'fmdrr',
 'fmrrd',
+'bfc',
+'bfi',
+'clrex',
+'ldrex',
+'ldrexb',
+'ldrexd',
+'ldrexh',
+'mls',
+'pkh',
+'pli',
+'qadd16',
+'qadd8',
+'qasx',
+'qsax',
+'qsub16',
+'qsub8',
+'rbit',
+'rev',
+'rev16',
+'revsh',
+'sadd16',
+'sadd8',
+'sasx',
+'sbfx',
+'sel',
+'setend',
+'sev',
+'shadd16',
+'shadd8',
+'shasx',
+'shsax',
+'shsub16',
+'shsub8',
+'smlad',
+'smlald',
+'smlsd',
+'smlsld',
+'smmla',
+'smmls',
+'smmul',
+'smuad',
+'smusd',
+'srs',
+'ssat',
+'ssat16',
+'ssax',
+'ssub16',
+'ssub8',
+'strex',
+'strexb',
+'strexd',
+'strexh',
+'sxtab',
+'sxtab16',
+'sxtah',
+'sxtb',
+'sxtb16',
+'sxth',
+'uadd16',
+'uadd8',
+'uasx',
+'ubfx',
+'uhadd16',
+'uhadd8',
+'uhasx',
+'uhsax',
+'uhsub16',
+'uhsub8',
+'umaal',
+'uqadd16',
+'uqadd8',
+'uqasx',
+'uqsax',
+'uqsub16',
+'uqsub8',
+'uqsad8',
+'uqsada8',
+'usat',
+'usat16',
+'usax',
+'usub16',
+'usub8',
+'uxtab',
+'uxtab16',
+'uxtah',
+'uxtb',
+'uxtb16',
+'uxth',
+'wfe',
+'wfi',
+'yield',
 'asr',
 'lsr',
 'lsl',
@@ -186,8 +277,6 @@
 'sdiv',
 'udiv',
 'movt',
-'ldrex',
-'strex',
 'it',
 'ite',
 'itt',

+ 89 - 0
compiler/arm/armatts.inc

@@ -204,5 +204,94 @@ attsufNONE,
 attsufNONE,
 attsufNONE,
 attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
+attsufNONE,
 attsufNONE
 );

+ 126 - 4
compiler/arm/armins.dat

@@ -574,6 +574,132 @@ reg32,reg32,reg32,reg32  \x16\x00\x80\x90		 ARM7
 
 [FMRRDcc]
 
+; ARMv6
+
+[BFCcc]
+
+[BFIcc]
+
+[CLREX]
+
+[LDREXcc]
+[LDREXBcc]
+[LDREXDcc]
+[LDREXHcc]
+
+[MLScc]
+
+[PKHcc]
+
+[PLI]
+
+[QADD16cc]
+[QADD8cc]
+[QASXcc]
+[QSAXcc]
+[QSUB16cc]
+[QSUB8cc]
+
+[RBITcc]
+
+[REVcc]
+[REV16cc]
+[REVSHcc]
+
+[SADD16cc]
+[SADD8cc]
+[SASXcc]
+
+[SBFXcc]
+
+[SELcc]
+
+[SETEND]
+
+[SEVcc]
+
+[SHADD16cc]
+[SHADD8cc]
+[SHASXcc]
+[SHSAXcc]
+[SHSUB16cc]
+[SHSUB8cc]
+
+[SMLADcc]
+[SMLALDcc]
+[SMLSDcc]
+[SMLSLDcc]
+[SMMLAcc]
+[SMMLScc]
+[SMMULcc]
+[SMUADcc]
+[SMUSDcc]
+
+[SRScc]
+
+[SSATcc]
+[SSAT16cc]
+[SSAXcc]
+
+[SSUB16cc]
+[SSUB8cc]
+
+[STREXcc]
+[STREXBcc]
+[STREXDcc]
+[STREXHcc]
+
+[SXTABcc]
+[SXTAB16cc]
+[SXTAHcc]
+[SXTBcc]
+[SXTB16cc]
+[SXTHcc]
+
+[UADD16cc]
+[UADD8cc]
+[UASXcc]
+
+[UBFXcc]
+
+[UHADD16cc]
+[UHADD8cc]
+[UHASXcc]
+[UHSAXcc]
+[UHSUB16cc]
+[UHSUB8cc]
+
+[UMAALcc]
+
+[UQADD16cc]
+[UQADD8]
+[UQASXcc]
+[UQSAXcc]
+
+[UQSUB16cc]
+[UQSUB8cc]
+[UQSAD8cc]
+[UQSADA8cc]
+
+[USATcc]
+[USAT16cc]
+[USAXcc]
+
+[USUB16cc]
+[USUB8cc]
+
+[UXTABcc]
+[UXTAB16cc]
+[UXTAHcc]
+
+[UXTBcc]
+[UXTB16cc]
+[UXTHcc]
+
+[WFEcc]
+[WFIcc]
+[YIELDcc]
+
 ; Thumb-2
 
 [ASRcc]
@@ -590,10 +716,6 @@ reg32,reg32,reg32,reg32  \x16\x00\x80\x90		 ARM7
 
 [MOVTcc]
 
-[LDREXcc]
-
-[STREXcc]
-
 [IT]
 
 [ITE]

+ 91 - 2
compiler/arm/armop.inc

@@ -179,6 +179,97 @@ A_FUITOD,
 A_FUITOS,
 A_FMDRR,
 A_FMRRD,
+A_BFC,
+A_BFI,
+A_CLREX,
+A_LDREX,
+A_LDREXB,
+A_LDREXD,
+A_LDREXH,
+A_MLS,
+A_PKH,
+A_PLI,
+A_QADD16,
+A_QADD8,
+A_QASX,
+A_QSAX,
+A_QSUB16,
+A_QSUB8,
+A_RBIT,
+A_REV,
+A_REV16,
+A_REVSH,
+A_SADD16,
+A_SADD8,
+A_SASX,
+A_SBFX,
+A_SEL,
+A_SETEND,
+A_SEV,
+A_SHADD16,
+A_SHADD8,
+A_SHASX,
+A_SHSAX,
+A_SHSUB16,
+A_SHSUB8,
+A_SMLAD,
+A_SMLALD,
+A_SMLSD,
+A_SMLSLD,
+A_SMMLA,
+A_SMMLS,
+A_SMMUL,
+A_SMUAD,
+A_SMUSD,
+A_SRS,
+A_SSAT,
+A_SSAT16,
+A_SSAX,
+A_SSUB16,
+A_SSUB8,
+A_STREX,
+A_STREXB,
+A_STREXD,
+A_STREXH,
+A_SXTAB,
+A_SXTAB16,
+A_SXTAH,
+A_SXTB,
+A_SXTB16,
+A_SXTH,
+A_UADD16,
+A_UADD8,
+A_UASX,
+A_UBFX,
+A_UHADD16,
+A_UHADD8,
+A_UHASX,
+A_UHSAX,
+A_UHSUB16,
+A_UHSUB8,
+A_UMAAL,
+A_UQADD16,
+A_UQADD8,
+A_UQASX,
+A_UQSAX,
+A_UQSUB16,
+A_UQSUB8,
+A_UQSAD8,
+A_UQSADA8,
+A_USAT,
+A_USAT16,
+A_USAX,
+A_USUB16,
+A_USUB8,
+A_UXTAB,
+A_UXTAB16,
+A_UXTAH,
+A_UXTB,
+A_UXTB16,
+A_UXTH,
+A_WFE,
+A_WFI,
+A_YIELD,
 A_ASR,
 A_LSR,
 A_LSL,
@@ -186,8 +277,6 @@ A_ROR,
 A_SDIV,
 A_UDIV,
 A_MOVT,
-A_LDREX,
-A_STREX,
 A_IT,
 A_ITE,
 A_ITT,

+ 21 - 19
compiler/arm/raarmgas.pas

@@ -656,25 +656,27 @@ Unit raarmgas;
           begin
             is_ConditionCode := false;
 
-            if actopcode in [A_IT,A_ITE,A_ITT,
-                             A_ITEE,A_ITTE,A_ITET,A_ITTT,
-                             A_ITEEE,A_ITTEE,A_ITETE,A_ITTTE,A_ITEET,A_ITTET,A_ITETT,A_ITTTT] then
-              begin
-                { search for condition, conditions are always 2 chars }
-                if length(hs)>1 then
-                  begin
-                    for icond:=low(tasmcond) to high(tasmcond) do
-                      begin
-                        if copy(hs,1,2)=uppercond2str[icond] then
-                          begin
-                            //actcondition:=icond;
-                            oper.opr.typ := OPR_COND;
-                            oper.opr.cc := icond;
-                            exit(true);
-                          end;
-                      end;
-                  end;
-              end;
+            case actopcode of
+              A_IT,A_ITE,A_ITT,
+              A_ITEE,A_ITTE,A_ITET,A_ITTT,
+              A_ITEEE,A_ITTEE,A_ITETE,A_ITTTE,A_ITEET,A_ITTET,A_ITETT,A_ITTTT:
+                begin
+                  { search for condition, conditions are always 2 chars }
+                  if length(hs)>1 then
+                    begin
+                      for icond:=low(tasmcond) to high(tasmcond) do
+                        begin
+                          if copy(hs,1,2)=uppercond2str[icond] then
+                            begin
+                              //actcondition:=icond;
+                              oper.opr.typ := OPR_COND;
+                              oper.opr.cc := icond;
+                              exit(true);
+                            end;
+                        end;
+                    end;
+                end;
+            end;
           end;