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 := \
|
||||
$(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
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue