delphi – 原子内在函数的对齐要求是什么(如果有的话)?
Delphi移动目标的原子操作建立在AtomicXXX系列内在函数之上.
documentation说:
这四个功能是: > 提供原子操作的其他RTL函数,例如, 对于针对ARMv7的移动编译器,这四种原子内在函数是否有任何对齐要求?如果是这样,他们是什么? 该文档未列出任何此类要求.但是,已知文件不准确,我不相信没有任何规定的要求作为没有此类要求的明确证据. 暂时不谈,XE8 documentation for intrinsic functions指出桌面编译器不支持这些原子内在函数.这是不正确的 – 桌面编译器支持这些内在函数. 解决方法
XE8编译
var a: integer; AtomicIncrement(a); 至 3e: 2201 movs r2,#1 40: 900c str r0,[sp,#48] ; 0x30 42: 910b str r1,#44] ; 0x2c 44: 920a str r2,#40] ; 0x28 46: 980b ldr r0,#44] ; 0x2c 48: e850 1f00 ldrex r1,[r0] 4c: 9a0a ldr r2,#40] ; 0x28 4e: 4411 add r1,r2 50: e840 1300 strex r3,r1,[r0] 54: 2b00 cmp r3,#0 56: d1f6 bne.n 46 <_NativeMain+0x46> 所以原子性是使用ldrex/strex实现的. 如果我正确地在community.arm.com解释信息,则所需的对齐是DWORD对齐的4字节操作(ldrd / strd)和QWORD对齐的8字节操作. 其他原子功能以类似的方式实现,因此应该应用相同的要求. AtomicDecrement(a); 68: 980f ldr r0,#60] ; 0x3c 6a: e850 1f00 ldrex r1,[r0] 6e: 9a0e ldr r2,#56] ; 0x38 70: 1a89 subs r1,r2 72: e840 1300 strex r3,[r0] 76: 2b00 cmp r3,#0 78: d1f6 bne.n 68 <_NativeMain+0x68> AtomicExchange(a,b); 82: 990f ldr r1,#60] ; 0x3c 84: 6008 str r0,[r1,#0] 86: 4873 ldr r0,[pc,#460] ; (254 <_NativeMain+0x254>) 88: 9a10 ldr r2,#64] ; 0x40 8a: 5880 ldr r0,[r0,r2] 8c: 6800 ldr r0,#0] 8e: f3bf 8f5b dmb ish 92: 900d str r0,#52] ; 0x34 94: 980f ldr r0,#60] ; 0x3c 96: e850 1f00 ldrex r1,[r0] 9a: 9b0d ldr r3,#52] ; 0x34 9c: e840 3200 strex r2,r3,[r0] a0: 2a00 cmp r2,#0 a2: 910c str r1,#48] ; 0x30 a4: d1f6 bne.n 94 <_NativeMain+0x94> AtomicCmpExchange(a,42,17); ae: 990f ldr r1,#60] ; 0x3c b0: 6008 str r0,#0] b2: f3bf 8f5b dmb ish b6: 202a movs r0,#42 ; 0x2a b8: 2211 movs r2,#17 ba: 900b str r0,#44] ; 0x2c bc: 920a str r2,#40] ; 0x28 be: 980f ldr r0,#60] ; 0x3c c0: e850 1f00 ldrex r1,[r0] c4: 9a0a ldr r2,#40] ; 0x28 c6: 4291 cmp r1,r2 c8: d105 bne.n d6 <_NativeMain+0xd6> ca: 990b ldr r1,#44] ; 0x2c cc: 9a0f ldr r2,#60] ; 0x3c ce: e842 1000 strex r0,[r2] d2: 2800 cmp r0,#0 d4: d1f3 bne.n be <_NativeMain+0xbe> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |