* Fixed bug in Thumb2 pop caused by me incorrectly assuming that
  ARM_SP == 13, ARM_LR == 14, and ARM_PC == 15, which is not the case
* updated CMakeLists to include building arm regression test
* added explicit casts for 64 bit visual studio 2012 build to get around
  truncation warnings from size_t conversion
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 29de601..2110feb 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -182,10 +182,16 @@
 
 if (CAPSTONE_BUILD_TESTS)
     foreach (TSRC ${TEST_SOURCES})
-	STRING(REGEX REPLACE ".c$" "" TBIN ${TSRC})
-	add_executable(${TBIN} "tests/${TSRC}")
-	target_link_libraries(${TBIN} ${default-target})
+        STRING(REGEX REPLACE ".c$" "" TBIN ${TSRC})
+        add_executable(${TBIN} "tests/${TSRC}")
+        target_link_libraries(${TBIN} ${default-target})
     endforeach ()
+    if (CAPSTONE_ARM_SUPPORT)
+        set(ARM_REGRESS_TEST test_arm_regression.c)
+        STRING(REGEX REPLACE ".c$" "" ARM_REGRESS_BIN ${ARM_REGRESS_TEST})
+        add_executable(${ARM_REGRESS_BIN} "suite/arm/${ARM_REGRESS_TEST}")
+        target_link_libraries(${ARM_REGRESS_BIN} ${default-target})
+    endif()
 endif ()
 
 ## installation
diff --git a/SStream.c b/SStream.c
index c8cf7c8..4cc60d7 100644
--- a/SStream.c
+++ b/SStream.c
@@ -24,7 +24,7 @@
 void SStream_concat0(SStream *ss, char *s)
 {
 #ifndef CAPSTONE_DIET
-	unsigned int len = strlen(s);
+	unsigned int len = (unsigned int) strlen(s);
 
 	memcpy(ss->buffer + ss->index, s, len);
 	ss->index += len;
diff --git a/arch/ARM/ARMDisassembler.c b/arch/ARM/ARMDisassembler.c
index 3f087ff..6ef37b0 100644
--- a/arch/ARM/ARMDisassembler.c
+++ b/arch/ARM/ARMDisassembler.c
@@ -1272,8 +1272,7 @@
 	}
 
 	if (opcode == ARM_t2LDMIA_UPD && WritebackReg == ARM_SP) {
-		if (Val & (1 << ARM_SP)
-				|| ((Val & (1 << ARM_PC)) && (Val & (1 << ARM_LR)))) {
+		if (Val & (1 << 13) || ((Val & (1 << 15)) && (Val & (1 << 14)))) {
 			// invalid thumb2 pop
 			// needs no sp in reglist and not both pc and lr set at the same time
 			return MCDisassembler_Fail;
diff --git a/cs.c b/cs.c
index 320768d..ea5e325 100644
--- a/cs.c
+++ b/cs.c
@@ -437,7 +437,7 @@
 
 #ifdef CAPSTONE_USE_SYS_DYN_MEM
 	if (count > 0 && count <= INSN_CACHE_SIZE)
-		cache_size = count;
+		cache_size = (unsigned int) count;
 #endif
 
 	// save the original offset for SKIPDATA
diff --git a/inttypes.h b/inttypes.h
index be36f11..b02129a 100644
--- a/inttypes.h
+++ b/inttypes.h
@@ -1,4 +1,4 @@
-#if defined(_MSC_VER) && _MSC_VER < 1700
+#if defined(_MSC_VER) && _MSC_VER <= 1700
 #include "msvc/headers/inttypes.h"
 #else
 #include <inttypes.h>
diff --git a/suite/arm/test_arm_regression.c b/suite/arm/test_arm_regression.c
index 562c70f..3e093bb 100644
--- a/suite/arm/test_arm_regression.c
+++ b/suite/arm/test_arm_regression.c
@@ -11,7 +11,7 @@
 #include <string.h>
 #include "../../inttypes.h"
 
-#include <capstone/capstone.h>
+#include <capstone.h>
 
 static csh handle;
 
@@ -192,6 +192,7 @@
 		}
 
 		cs_option(handle, CS_OPT_DETAIL, CS_OPT_ON);
+		cs_option(handle, CS_OPT_SYNTAX, CS_OPT_SYNTAX_NOREGNAME);
 
 		for (j = 0; j < invalid->num_invalid_codes; ++j) {
 			struct invalid_code * invalid_code = NULL;
@@ -252,24 +253,36 @@
 		CS_ARCH_ARM,
 			CS_MODE_THUMB,
 			"Thumb",
-			2,
+			3,
 			{{ (unsigned char *)"\x00\xf0\x26\xe8", 4, 0x352,
+				"0x352:\tblx\t#0x3a0\n"
+					"\top_count: 1\n"
+					"\t\toperands[0].type: IMM = 0x3a0\n",
 
-				 "0x352:\tblx\t#0x3a0\n"
-					 "\top_count: 1\n"
-					 "\t\toperands[0].type: IMM = 0x3a0\n",
+				"thumb2 blx with misaligned immediate"
+			}, { (unsigned char *)"\x05\xdd", 2, 0x1f0,
+				"0x1f0:\tble\t#0x1fe\n"
+					"\top_count: 1\n"
+					"\t\toperands[0].type: IMM = 0x1fe\n"
+					"\tCode condition: 14\n",
 
-				 "thumb2 blx with misaligned immediate"
+				"thumb b cc with thumb-aligned target"
+			}, { (unsigned char *)"\xbd\xe8\xf0\x8f", 4, 0,
+			 "0x0:\tpop.w\t{r4, r5, r6, r7, r8, r9, r10, r11, pc}\n"
+				 "\top_count: 9\n"
+				 "\t\toperands[0].type: REG = r4\n"
+				 "\t\toperands[1].type: REG = r5\n"
+				 "\t\toperands[2].type: REG = r6\n"
+				 "\t\toperands[3].type: REG = r7\n"
+				 "\t\toperands[4].type: REG = r8\n"
+				 "\t\toperands[5].type: REG = r9\n"
+				 "\t\toperands[6].type: REG = r10\n"
+				 "\t\toperands[7].type: REG = r11\n"
+				 "\t\toperands[8].type: REG = pc\n",
 
-			 }, { (unsigned char *)"\x05\xdd", 2, 0x1f0,
-
-				 "0x1f0:\tble\t#0x1fe\n"
-					 "\top_count: 1\n"
-					 "\t\toperands[0].type: IMM = 0x1fe\n"
-					 "\tCode condition: 14\n",
-
-				 "thumb b cc with thumb-aligned target"
-			 }}
+				"thumb2 pop that should be valid"
+			},
+		}
 	}};
 
 	struct valid_instructions * valid = NULL;
@@ -293,6 +306,7 @@
 		}
 
 		cs_option(handle, CS_OPT_DETAIL, CS_OPT_ON);
+		cs_option(handle, CS_OPT_SYNTAX, CS_OPT_SYNTAX_NOREGNAME);
 
 #define _this_printf(...) \
 		{ \
@@ -349,10 +363,10 @@
 
 				if (memcmp(tmp_buf, valid_code->expected_out, max_len)) {
 					printf(
-							"    ERROR: '''\n%s''' does not match"
-							" expected '''\n%s'''\n", 
-							tmp_buf, valid_code->expected_out
-						  );
+						"    ERROR: '''\n%s''' does not match"
+						" expected '''\n%s'''\n", 
+						tmp_buf, valid_code->expected_out
+					);
 				} else {
 					printf("    SUCCESS: valid\n");
 				}