Messages in this thread | | | Date | Fri, 18 May 2007 22:30:23 +0200 | From | matthieu castet <> | Subject | Re: [PATCH] ubi: kill homegrown endian macros |
| |
Hi,
David Woodhouse wrote: > On Thu, 2007-05-17 at 20:30 +0000, Matthieu CASTET wrote: >> On arch that don't support aligned access, packed struct access will be >> done byte per byte (but it could be the expected behavior if there >> unaligned access). > > When I tested this on ARM, the output for je32_to_cpu et al was fine. > For _other_ structures where I'd used __attribute__((packed)) to be > safe, gcc would emit code to handle unaligned loads. But not in the > simple case where the struct has only one member. > > Are you suggesting that this has changed since I did my testing? > here a small example I made and try with a sourcery 2006q3-27
/tmp/arm-2006q3/bin/arm-none-linux-gnueabi-gcc -S test.c -O3 -o test.s.packed /tmp/arm-2006q3/bin/arm-none-linux-gnueabi-gcc -S test.c -DNOP -O3 -o test.s
$diff test.s test.s.packed 19,23c19,34 < @ link register save eliminated. < ldrh r2, [r1, #0] < ldrh r1, [r0, #2] < ldr r0, [r0, #4] < @ lr needed for prologue --- > stmfd sp!, {r4, r5, r6, lr} > ldrb r2, [r0, #5] @ zero_extendqisi2 > ldrb r3, [r0, #4] @ zero_extendqisi2 > mov lr, r1 > ldrb r4, [r0, #6] @ zero_extendqisi2 > ldrb r5, [r0, #3] @ zero_extendqisi2 > ldrb r6, [r1, #1] @ zero_extendqisi2 > orr r3, r3, r2, asl #8 > ldrb r1, [r0, #2] @ zero_extendqisi2 > ldrb ip, [r0, #7] @ zero_extendqisi2 > ldrb r2, [lr, #0] @ zero_extendqisi2 > orr r3, r3, r4, asl #16 > orr r0, r3, ip, asl #24 > orr r1, r1, r5, asl #8 > orr r2, r2, r6, asl #8 > ldmfd sp!, {r4, r5, r6, lr}
Matthieu #include <stdint.h> #ifdef NOP #define jint32_t uint32_t #define jint16_t uint16_t
#define je16_to_cpu(x) ((x)) #define je32_to_cpu(x) ((x)) #else
typedef struct { uint32_t v32; } __attribute__((packed)) jint32_t;
typedef struct { uint16_t v16; } __attribute__((packed)) jint16_t; #define je16_to_cpu(x) ((x).v16) #define je32_to_cpu(x) ((x).v32) #endif struct jffs2_sum_unknown_flash { jint16_t nodetype; /* node type */ };
struct jffs2_unknown_node { /* All start like this */ jint16_t magic; jint16_t nodetype; jint32_t totlen; /* So we can skip over nodes we don't grok */ jint32_t hdr_crc; };
int boo(struct jffs2_unknown_node *node, void *sp) { foo(je32_to_cpu(node->totlen), je16_to_cpu(node->nodetype), je16_to_cpu(((struct jffs2_sum_unknown_flash *)sp)->nodetype)); }
| |