hardfp calling support
This is commented out for android, but it is tested and works!
This commit is contained in:
parent
da20ab32d7
commit
35b38e3a78
|
@ -52,7 +52,7 @@ else
|
||||||
RZDCY_CXXFLAGS := \
|
RZDCY_CXXFLAGS := \
|
||||||
$(CFLAGS) -c -g -O3 -I$(RZDCY_SRC_DIR) -I$(RZDCY_SRC_DIR)/deps \
|
$(CFLAGS) -c -g -O3 -I$(RZDCY_SRC_DIR) -I$(RZDCY_SRC_DIR)/deps \
|
||||||
-D_ANDROID -DRELEASE -DTARGET_BEAGLE\
|
-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 \
|
-frename-registers -fsingle-precision-constant -ffast-math \
|
||||||
-ftree-vectorize -fomit-frame-pointer -fno-exceptions -fno-rtti -std=gnu++11
|
-ftree-vectorize -fomit-frame-pointer -fno-exceptions -fno-rtti -std=gnu++11
|
||||||
endif
|
endif
|
|
@ -565,6 +565,22 @@ void ngen_CC_Param(shil_opcode* op,shil_param* par,CanonicalParamType tp)
|
||||||
switch(tp)
|
switch(tp)
|
||||||
{
|
{
|
||||||
case CPT_f32rv:
|
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_u32rv:
|
||||||
case CPT_u64rvL:
|
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)
|
void ngen_CC_Call(shil_opcode* op,void* function)
|
||||||
{
|
{
|
||||||
u32 rd=r0;
|
u32 rd=r0;
|
||||||
|
u32 fd=f0;
|
||||||
|
|
||||||
for (int i=CC_pars.size();i-->0;)
|
for (int i=CC_pars.size();i-->0;)
|
||||||
{
|
{
|
||||||
if (CC_pars[i].type==CPT_ptr)
|
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())
|
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))
|
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));
|
//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
|
else
|
||||||
{
|
{
|
||||||
|
verify(CC_pars[i].type != CPT_f32);
|
||||||
//printf("MOV32((eReg)rd, CC_pars[i].par->_imm); %d\n",rd);
|
//printf("MOV32((eReg)rd, CC_pars[i].par->_imm); %d\n",rd);
|
||||||
MOV32((eReg)rd, CC_pars[i].par->_imm);
|
MOV32((eReg)rd, CC_pars[i].par->_imm);
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,10 +32,28 @@ LOCAL_MODULE := dc
|
||||||
LOCAL_CFLAGS := $(LOCAL_CXXFLAGS) -DHAS_VMU
|
LOCAL_CFLAGS := $(LOCAL_CXXFLAGS) -DHAS_VMU
|
||||||
LOCAL_DISABLE_FORMAT_STRING_CHECKS=true
|
LOCAL_DISABLE_FORMAT_STRING_CHECKS=true
|
||||||
LOCAL_ASFLAGS := -fvisibility=hidden
|
LOCAL_ASFLAGS := -fvisibility=hidden
|
||||||
LOCAL_LDLIBS := -llog -lGLESv2 -lEGL -lz
|
LOCAL_LDLIBS := -llog -lGLESv2 -lEGL -lz
|
||||||
#-Wl,-Map,./res/raw/syms.mp3
|
#-Wl,-Map,./res/raw/syms.mp3
|
||||||
LOCAL_ARM_MODE := arm
|
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)
|
include $(BUILD_SHARED_LIBRARY)
|
||||||
|
|
||||||
$(call import-module,android/native_app_glue)
|
$(call import-module,android/native_app_glue)
|
||||||
|
|
Loading…
Reference in New Issue