Index: cmake/builtin-config-ix.cmake =================================================================== --- cmake/builtin-config-ix.cmake +++ cmake/builtin-config-ix.cmake @@ -24,7 +24,7 @@ set(ARM64 aarch64) -set(ARM32 arm armhf armv6m) +set(ARM32 arm armhf armv6m armv7m armv7em) set(X86 i386 i686) set(X86_64 x86_64) set(MIPS32 mips mipsel) Index: lib/builtins/arm/aeabi_cdcmp.S =================================================================== --- lib/builtins/arm/aeabi_cdcmp.S +++ lib/builtins/arm/aeabi_cdcmp.S @@ -48,7 +48,12 @@ // NaN has been ruled out, so __aeabi_cdcmple can't trap bne __aeabi_cdcmple +#if defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__) + mov ip, #APSR_C + msr APSR_nzcvq, ip +#else msr CPSR_f, #APSR_C +#endif JMP(lr) #endif END_COMPILERRT_FUNCTION(__aeabi_cdcmpeq) @@ -95,17 +100,23 @@ lsls r0, r0, #31 pop {r0-r3, pc} #else + itt eq moveq ip, #0 beq 1f ldm sp, {r0-r3} bl __aeabi_dcmpeq cmp r0, #1 + ite eq moveq ip, #(APSR_C | APSR_Z) movne ip, #(APSR_C) 1: +#if defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__) + msr APSR_nzcvq, ip +#else msr CPSR_f, ip +#endif pop {r0-r3} POP_PC() #endif Index: lib/builtins/arm/aeabi_cfcmp.S =================================================================== --- lib/builtins/arm/aeabi_cfcmp.S +++ lib/builtins/arm/aeabi_cfcmp.S @@ -48,7 +48,12 @@ // NaN has been ruled out, so __aeabi_cfcmple can't trap bne __aeabi_cfcmple +#if defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__) + mov ip, #APSR_C + msr APSR_nzcvq, ip +#else msr CPSR_f, #APSR_C +#endif JMP(lr) #endif END_COMPILERRT_FUNCTION(__aeabi_cfcmpeq) @@ -95,17 +100,23 @@ lsls r0, r0, #31 pop {r0-r3, pc} #else + itt eq moveq ip, #0 beq 1f ldm sp, {r0-r3} bl __aeabi_fcmpeq cmp r0, #1 + ite eq moveq ip, #(APSR_C | APSR_Z) movne ip, #(APSR_C) 1: +#if defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__) + msr APSR_nzcvq, ip +#else msr CPSR_f, ip +#endif pop {r0-r3} POP_PC() #endif Index: lib/builtins/arm/eqdf2vfp.S =================================================================== --- lib/builtins/arm/eqdf2vfp.S +++ lib/builtins/arm/eqdf2vfp.S @@ -27,6 +27,7 @@ vcmp.f64 d6, d7 #endif vmrs apsr_nzcv, fpscr + ite eq moveq r0, #1 // set result register to 1 if equal movne r0, #0 bx lr Index: lib/builtins/arm/eqsf2vfp.S =================================================================== --- lib/builtins/arm/eqsf2vfp.S +++ lib/builtins/arm/eqsf2vfp.S @@ -27,6 +27,7 @@ vcmp.f32 s14, s15 #endif vmrs apsr_nzcv, fpscr + ite eq moveq r0, #1 // set result register to 1 if equal movne r0, #0 bx lr Index: lib/builtins/arm/gedf2vfp.S =================================================================== --- lib/builtins/arm/gedf2vfp.S +++ lib/builtins/arm/gedf2vfp.S @@ -27,6 +27,7 @@ vcmp.f64 d6, d7 #endif vmrs apsr_nzcv, fpscr + ite ge movge r0, #1 // set result register to 1 if greater than or equal movlt r0, #0 bx lr Index: lib/builtins/arm/gesf2vfp.S =================================================================== --- lib/builtins/arm/gesf2vfp.S +++ lib/builtins/arm/gesf2vfp.S @@ -27,6 +27,7 @@ vcmp.f32 s14, s15 #endif vmrs apsr_nzcv, fpscr + ite ge movge r0, #1 // set result register to 1 if greater than or equal movlt r0, #0 bx lr Index: lib/builtins/arm/gtdf2vfp.S =================================================================== --- lib/builtins/arm/gtdf2vfp.S +++ lib/builtins/arm/gtdf2vfp.S @@ -27,6 +27,7 @@ vcmp.f64 d6, d7 #endif vmrs apsr_nzcv, fpscr + ite gt movgt r0, #1 // set result register to 1 if equal movle r0, #0 bx lr Index: lib/builtins/arm/gtsf2vfp.S =================================================================== --- lib/builtins/arm/gtsf2vfp.S +++ lib/builtins/arm/gtsf2vfp.S @@ -27,6 +27,7 @@ vcmp.f32 s14, s15 #endif vmrs apsr_nzcv, fpscr + ite gt movgt r0, #1 // set result register to 1 if equal movle r0, #0 bx lr Index: lib/builtins/arm/ledf2vfp.S =================================================================== --- lib/builtins/arm/ledf2vfp.S +++ lib/builtins/arm/ledf2vfp.S @@ -27,6 +27,7 @@ vcmp.f64 d6, d7 #endif vmrs apsr_nzcv, fpscr + ite ls movls r0, #1 // set result register to 1 if equal movhi r0, #0 bx lr Index: lib/builtins/arm/lesf2vfp.S =================================================================== --- lib/builtins/arm/lesf2vfp.S +++ lib/builtins/arm/lesf2vfp.S @@ -27,6 +27,7 @@ vcmp.f32 s14, s15 #endif vmrs apsr_nzcv, fpscr + ite ls movls r0, #1 // set result register to 1 if equal movhi r0, #0 bx lr Index: lib/builtins/arm/ltdf2vfp.S =================================================================== --- lib/builtins/arm/ltdf2vfp.S +++ lib/builtins/arm/ltdf2vfp.S @@ -27,6 +27,7 @@ vcmp.f64 d6, d7 #endif vmrs apsr_nzcv, fpscr + ite mi movmi r0, #1 // set result register to 1 if equal movpl r0, #0 bx lr Index: lib/builtins/arm/ltsf2vfp.S =================================================================== --- lib/builtins/arm/ltsf2vfp.S +++ lib/builtins/arm/ltsf2vfp.S @@ -27,6 +27,7 @@ vcmp.f32 s14, s15 #endif vmrs apsr_nzcv, fpscr + ite mi movmi r0, #1 // set result register to 1 if equal movpl r0, #0 bx lr Index: lib/builtins/arm/nedf2vfp.S =================================================================== --- lib/builtins/arm/nedf2vfp.S +++ lib/builtins/arm/nedf2vfp.S @@ -27,6 +27,7 @@ vcmp.f64 d6, d7 #endif vmrs apsr_nzcv, fpscr + ite ne movne r0, #1 // set result register to 0 if unequal moveq r0, #0 bx lr Index: lib/builtins/arm/nesf2vfp.S =================================================================== --- lib/builtins/arm/nesf2vfp.S +++ lib/builtins/arm/nesf2vfp.S @@ -27,6 +27,7 @@ vcmp.f32 s14, s15 #endif vmrs apsr_nzcv, fpscr + ite ne movne r0, #1 // set result register to 1 if unequal moveq r0, #0 bx lr Index: lib/builtins/arm/unorddf2vfp.S =================================================================== --- lib/builtins/arm/unorddf2vfp.S +++ lib/builtins/arm/unorddf2vfp.S @@ -27,6 +27,7 @@ vcmp.f64 d6, d7 #endif vmrs apsr_nzcv, fpscr + ite vs movvs r0, #1 // set result register to 1 if "overflow" (any NaNs) movvc r0, #0 bx lr Index: lib/builtins/arm/unordsf2vfp.S =================================================================== --- lib/builtins/arm/unordsf2vfp.S +++ lib/builtins/arm/unordsf2vfp.S @@ -27,6 +27,7 @@ vcmp.f32 s14, s15 #endif vmrs apsr_nzcv, fpscr + ite vs movvs r0, #1 // set result register to 1 if "overflow" (any NaNs) movvc r0, #0 bx lr