小编Del*_*mer的帖子

如何阻止 LLVM 将位掩码转换为分支?

对于上下文,假设我正在编写一个字节码解释器,其中指令遵循两种格式之一:

\n
+---+--------+------+------+----------------+\n| 1 | opcode | treg | areg |     unused     |\n+---+--------+------+------+----------------+\n32  31       20     16     12               0\n\n+---+--------+------+-----------------------+\n| 0 | opcode | treg |          imm          |\n+---+--------+------+-----------------------+\n32  31       20     16                      0\n
Run Code Online (Sandbox Code Playgroud)\n

对于每个操作码,有两个选项来提供其第二个操作数:它可以是寄存器或立即值。该选择由指令字的位 31 执行。如果 MSB 为 0 \xe2\x80\x94,则第二个操作数是寄存器的内容,由指令字的位 [12:16] 索引。如果 MSB 为 1 \xe2\x80\x94,则第二个操作数是指令本身的位 [0:16],符号扩展为完整机器字。

\n

检索第二个操作数的简单算法只需根据 MSB 在两个单独的解析器之间切换:

\n
reg_t decode_arg2(uint32_t instr, reg_t const* regs) {\n    if (instr & (1 << 31)) {\n        return regs[(instr >> 12) & 15];\n    } else {\n        return (int16_t)instr;\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

另一种可能性是使用无分支算法,我们将两个可能的值加载到临时变量中,然后使用位魔法选择其中一个: …

c++ llvm compiler-optimization

13
推荐指数
1
解决办法
370
查看次数

在android ndk项目中添加libpng

我搜索了很多关于将libpng链接到我的android ndk项目的主题,但我找到了正确的答案,我希望有人会帮助我.

这是我的项目的层次结构:

JNI

different_cpp_files
different_hpp_files
Android.mk
libpng
    different_cpp_files
    different_hpp_files
    Android.mk
Run Code Online (Sandbox Code Playgroud)

libpng文件夹中的Android.mk:


LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LS_C=$(subst $(1)/,,$(wildcard $(1)/*.c))

LOCAL_MODULE := png

LOCAL_SRC_FILES := \

$(filter-out example.c pngtest.c,$(call LS_C,$(LOCAL_PATH)))

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)

LOCAL_EXPORT_LDLIBS := -lz

include $(BUILD_STATIC_LIBRARY)
Run Code Online (Sandbox Code Playgroud)

我想一切都在这里..

jni文件夹中的Android.mk:


LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LS_CPP=$(subst $(1)/,,$(wildcard $(1)/*.cpp))

LOCAL_MODULE    := pacman

LOCAL_CFLAGS    := -Wno-psabi

LOCAL_SRC_FILES := $(call LS_CPP,$(LOCAL_PATH))

LOCAL_LDLIBS    := -landroid -llog -lEGL -lGLESv1_CM -lOpenSLES

LOCAL_STATIC_LIBRARIES := android_native_app_glue png

include $(BUILD_SHARED_LIBRARY)

$(call import-module,android/native_app_glue)

$(call import-module,libpng)
Run Code Online (Sandbox Code Playgroud)

最后一行显示我得到了像native_app_glue lib这样的libpng(在android-ndk源代码目录中)现在我想从我的项目中编译libpng.我需要在Android.mk文件中进行哪些更改?

libpng android-ndk

11
推荐指数
1
解决办法
9545
查看次数

nullptr_t在哪里?

有点史前史.

我已经写了很长一段时间了.它分为几个静态库,如"utils","rsbin"(资源系统),"window",然后链接到单个可执行文件中.

它是一个跨平台引擎,适用于Windows和Android.在Windows下,我用MinGW编译它.在Android下,使用CCTools,它是本机gcc的接口.

其中一个基类是utils::RefObject代表一个类似于Windows的IUnknown的概念:它提供了一个用于确定其生命周期的引用计数器和一个从基类指针查询特定接口的方法.还有template< typename T > utils::Ref专门为这类物体设计的.它拥有std::atomic< utils::RefObject* >并在构造,赋值和销毁时自动更新其对象的引用计数,类似于std::shared_ptr.它还允许通过查询方法隐式转换不同类型的RefObject.虽然,查询对象的自身类型是低效的,因此,utils::Ref重载其大多数运算符,例如,有特定的utils::Ref< T >::Ref( T* ptr )构造函数,它只是递增传递的对象的引用计数,而general utils::Ref< T >::Ref( RefObject* ptr ),它查询其参数的例如T并抛出异常失败(不过不用担心,当然有软铸造的方法).

但是只有这两种方法引入了一个问题:你不能utils::Ref用空指针显式初始化,因为它是不明确的; 所以也有utils::Ref< T >::Ref( nullptr_t )提供一种方法.

现在,我们正在解决手头的问题.在头文件中,原型拼写完全如上,没有任何前面的std::.请注意,我也没有使用using namespace.很长一段时间,这都奏效了.

现在,我正在研究一个图形系统.它之前存在,但它相当简陋,所以我甚至没有注意到<gl.h>实际上只定义了OpenGL 1.1,而对于较新的版本,你应该通过<glext.h>.现在,有必要使用后者.但包括它打破了旧的参考类.

从错误消息来看,MinGW现在nullptr_t在原型中存在问题.我在网上做了一个快速搜索,发现它经常被称为std::nullptr_t.虽然,并非无处不在.

快速总结:直到我在标题之前包含<glext.h>之前,我nullptr_t没有编译std::using namespace编译正常.

到目前为止,我一直在使用的网站cplusplus.com/reference表明,全球化::nullptr_t 应该是应该如何.另一方面,en.cppreference.com wiki 告诉它实际上std::nullptr_t.

一个快速测试程序,一个带有void foo( int …

c++ std nullptr c++11

6
推荐指数
1
解决办法
936
查看次数

标签 统计

c++ ×2

android-ndk ×1

c++11 ×1

compiler-optimization ×1

libpng ×1

llvm ×1

nullptr ×1

std ×1