diff --git a/core/core.mk b/core/core.mk index 446fcbc93..0b337ab30 100755 --- a/core/core.mk +++ b/core/core.mk @@ -52,7 +52,7 @@ else RZDCY_CXXFLAGS := \ $(CFLAGS) -c -g -O3 -I$(RZDCY_SRC_DIR) -I$(RZDCY_SRC_DIR)/deps \ -D_ANDROID -DRELEASE -DTARGET_BEAGLE\ - -march=armv7-a -mtune=cortex-a9 -mfpu=vfpv3-d16 -mfloat-abi=softfp \ + -march=armv7-a -mtune=cortex-a9 -mfpu=vfpv3-d16 \ -frename-registers -fsingle-precision-constant -ffast-math \ -ftree-vectorize -fomit-frame-pointer -fno-exceptions -fno-rtti -std=gnu++11 endif \ No newline at end of file diff --git a/core/rec-ARM/arm_dyna.cpp b/core/rec-ARM/arm_dyna.cpp index c8799ceeb..6b8829461 100644 --- a/core/rec-ARM/arm_dyna.cpp +++ b/core/rec-ARM/arm_dyna.cpp @@ -565,6 +565,22 @@ void ngen_CC_Param(shil_opcode* op,shil_param* par,CanonicalParamType tp) switch(tp) { case CPT_f32rv: + #ifdef ARM_HARDFP + { + if (reg.IsAllocg(*par)) + { + //printf("MOV(reg.map(*par),r0); %d\n",reg.map(*par)); + VMOV(reg.mapg(*par),f0); + } + else if (reg.IsAllocf(*par)) + { + //VMOV(reg.mapf(*par),0,r0); %d\n",reg.map(*par)); + VMOV(reg.mapfs(*par),f0); + } + } + break; + #endif + case CPT_u32rv: case CPT_u64rvL: { @@ -606,6 +622,8 @@ void ngen_CC_Param(shil_opcode* op,shil_param* par,CanonicalParamType tp) void ngen_CC_Call(shil_opcode* op,void* function) { u32 rd=r0; + u32 fd=f0; + for (int i=CC_pars.size();i-->0;) { if (CC_pars[i].type==CPT_ptr) @@ -616,6 +634,25 @@ void ngen_CC_Call(shil_opcode* op,void* function) { if (CC_pars[i].par->is_reg()) { + #ifdef ARM_HARDFP + if (CC_pars[i].type == CPT_f32) + { + if (reg.IsAllocg(*CC_pars[i].par)) + { + //printf("MOV((eReg)rd,reg.map(*CC_pars[i].par)); %d %d\n",rd,reg.map(*CC_pars[i].par)); + VMOV((eFSReg)fd,reg.mapg(*CC_pars[i].par)); + } + else if (reg.IsAllocf(*CC_pars[i].par)) + { + //printf("LoadSh4Reg_mem((eReg)rd, *CC_pars[i].par); %d\n",rd); + VMOV((eFSReg)fd,reg.mapfs(*CC_pars[i].par)); + } + else + die("Must not happen!\n"); + continue; + } + #endif + if (reg.IsAllocg(*CC_pars[i].par)) { //printf("MOV((eReg)rd,reg.map(*CC_pars[i].par)); %d %d\n",rd,reg.map(*CC_pars[i].par)); @@ -631,6 +668,7 @@ void ngen_CC_Call(shil_opcode* op,void* function) } else { + verify(CC_pars[i].type != CPT_f32); //printf("MOV32((eReg)rd, CC_pars[i].par->_imm); %d\n",rd); MOV32((eReg)rd, CC_pars[i].par->_imm); } diff --git a/shell/android/jni/Android.mk b/shell/android/jni/Android.mk index 97e9cce63..6dcc047b1 100644 --- a/shell/android/jni/Android.mk +++ b/shell/android/jni/Android.mk @@ -32,10 +32,28 @@ LOCAL_MODULE := dc LOCAL_CFLAGS := $(LOCAL_CXXFLAGS) -DHAS_VMU LOCAL_DISABLE_FORMAT_STRING_CHECKS=true LOCAL_ASFLAGS := -fvisibility=hidden -LOCAL_LDLIBS := -llog -lGLESv2 -lEGL -lz +LOCAL_LDLIBS := -llog -lGLESv2 -lEGL -lz #-Wl,-Map,./res/raw/syms.mp3 LOCAL_ARM_MODE := arm +# +# android has poor support for hardfp calling. +# r9b+ is required, and it only works for internal calls +# the opengl drivers would really benefit from this, but they are still using softfp +# the header files tell gcc to automatically use aapcs for calling system/etc +# so there is no real perfomance difference +# +# The way this is implemented is a huge hack on the android/linux side +# (but then again, which part of android isn't a huge hack?) + +#ifneq ($(filter %armeabi-v7a,$(TARGET_ARCH_ABI)),) +#LOCAL_CFLAGS += -mhard-float -D_NDK_MATH_NO_SOFTFP=1 -DARM_HARDFP +#LOCAL_LDLIBS += -lm_hard +#ifeq (,$(filter -fuse-ld=mcld,$(APP_LDFLAGS) $(LOCAL_LDFLAGS))) +#LOCAL_LDFLAGS += -Wl,--no-warn-mismatch +#endif +#endif + include $(BUILD_SHARED_LIBRARY) $(call import-module,android/native_app_glue)