diff --git a/Ghidra/Processors/ARM/certification.manifest b/Ghidra/Processors/ARM/certification.manifest
index 777e1f93dd..fc28f71729 100644
--- a/Ghidra/Processors/ARM/certification.manifest
+++ b/Ghidra/Processors/ARM/certification.manifest
@@ -26,6 +26,7 @@ data/languages/ARM8m_le.slaspec||GHIDRA||||END|
data/languages/ARMCortex.pspec||GHIDRA||||END|
data/languages/ARMTHUMBinstructions.sinc||GHIDRA||||END|
data/languages/ARM_CDE.sinc||GHIDRA||||END|
+data/languages/ARM_apcs.cspec||GHIDRA||||END|
data/languages/ARM_v45.cspec||GHIDRA||||END|
data/languages/ARM_v45.pspec||GHIDRA||||END|
data/languages/ARM_win.cspec||GHIDRA||||END|
diff --git a/Ghidra/Processors/ARM/data/languages/ARM.ldefs b/Ghidra/Processors/ARM/data/languages/ARM.ldefs
index 695e6bd3e7..e914419a8d 100644
--- a/Ghidra/Processors/ARM/data/languages/ARM.ldefs
+++ b/Ghidra/Processors/ARM/data/languages/ARM.ldefs
@@ -13,6 +13,7 @@
Generic ARM/Thumb v8 little endian
+
@@ -36,6 +37,7 @@
Generic ARM/Thumb v8 little endian (Thumb is default)
+
@@ -58,6 +60,7 @@
Generic ARM/Thumb v8 little endian instructions and big endian data
+
@@ -72,6 +75,7 @@
id="ARM:BE:32:v8">
Generic ARM/Thumb v8 big endian
+
@@ -94,6 +98,7 @@
id="ARM:BE:32:v8T">
Generic ARM/Thumb v8 big endian (Thumb is default)
+
@@ -114,6 +119,7 @@
Generic ARM/Thumb v7 little endian
+
@@ -136,6 +142,7 @@
Generic ARM/Thumb v7 little endian instructions and big endian data
+
@@ -150,6 +157,7 @@
id="ARM:BE:32:v7">
Generic ARM/Thumb v7 big endian
+
@@ -170,6 +178,7 @@
id="ARM:LE:32:Cortex">
ARM Cortex / Thumb little endian
+
@@ -193,6 +202,7 @@
id="ARM:BE:32:Cortex">
ARM Cortex / Thumb big endian
+
@@ -215,6 +225,7 @@
id="ARM:LE:32:v8-m">
ARM Cortex v8-m little endian
+
@@ -232,6 +243,7 @@
id="ARM:BE:32:v8-m">
ARM Cortex v8-m big endian
+
@@ -250,6 +262,7 @@
id="ARM:LE:32:v6">
Generic ARM/Thumb v6 little endian
+
@@ -272,6 +285,7 @@
id="ARM:BE:32:v6">
Generic ARM/Thumb v6 big endian
+
@@ -294,6 +308,7 @@
id="ARM:LE:32:v5t">
Generic ARM/Thumb v5 little endian (T-variant)
+
@@ -314,6 +329,7 @@
id="ARM:BE:32:v5t">
Generic ARM/Thumb v5 big endian (T-variant)
+
@@ -334,6 +350,7 @@
id="ARM:LE:32:v5">
Generic ARM v5 little endian
+
@@ -352,6 +369,7 @@
id="ARM:BE:32:v5">
Generic ARM v5 big endian
+
@@ -370,6 +388,7 @@
id="ARM:LE:32:v4t">
Generic ARM/Thumb v4 little endian (T-variant)
+
@@ -389,6 +408,7 @@
id="ARM:BE:32:v4t">
Generic ARM/Thumb v4 big endian (T-variant)
+
@@ -408,6 +428,7 @@
id="ARM:LE:32:v4">
Generic ARM v4 little endian
+
@@ -430,6 +451,7 @@
id="ARM:BE:32:v4">
Generic ARM v4 big endian
+
diff --git a/Ghidra/Processors/ARM/data/languages/ARM_apcs.cspec b/Ghidra/Processors/ARM/data/languages/ARM_apcs.cspec
new file mode 100644
index 0000000000..406734fa88
--- /dev/null
+++ b/Ghidra/Processors/ARM/data/languages/ARM_apcs.cspec
@@ -0,0 +1,299 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ;
+ offset = *:1 (lr + r3);
+ r3 = zext(offset);
+
+
+ if (inbounds) goto ;
+ offset = *:1 (lr + r12);
+ r3 = zext(offset);
+
+
+ r3 = r3 * 2;
+
+ r12 = lr + r3;
+
+ ISAModeSwitch = (r12 & 1) != 1;
+ TB = ISAModeSwitch;
+ pc = r12 & 0xfffffffe;
+ goto [pc];
+ ]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+