• Christophe Leroy's avatar
    powerpc/mem: Help GCC realise __flush_dcache_icache() flushes single pages · 67b8e6af
    Christophe Leroy authored
    'And' the given page address with PAGE_MASK to help GCC.
    
    With the patch:
    
    	00000024 <__flush_dcache_icache>:
    	  24:	54 63 00 26 	rlwinm  r3,r3,0,0,19
    	  28:	39 40 00 40 	li      r10,64
    	  2c:	7c 69 1b 78 	mr      r9,r3
    	  30:	7d 49 03 a6 	mtctr   r10
    	  34:	7c 00 48 6c 	dcbst   0,r9
    	  38:	39 29 00 20 	addi    r9,r9,32
    	  3c:	7c 00 48 6c 	dcbst   0,r9
    	  40:	39 29 00 20 	addi    r9,r9,32
    	  44:	42 00 ff f0 	bdnz    34 <__flush_dcache_icache+0x10>
    	  48:	7c 00 04 ac 	hwsync
    	  4c:	39 20 00 40 	li      r9,64
    	  50:	7d 29 03 a6 	mtctr   r9
    	  54:	7c 00 1f ac 	icbi    0,r3
    	  58:	38 63 00 20 	addi    r3,r3,32
    	  5c:	7c 00 1f ac 	icbi    0,r3
    	  60:	38 63 00 20 	addi    r3,r3,32
    	  64:	42 00 ff f0 	bdnz    54 <__flush_dcache_icache+0x30>
    	  68:	7c 00 04 ac 	hwsync
    	  6c:	4c 00 01 2c 	isync
    	  70:	4e 80 00 20 	blr
    
    Without the patch:
    
    	00000024 <__flush_dcache_icache>:
    	  24:	54 6a 00 34 	rlwinm  r10,r3,0,0,26
    	  28:	39 23 10 1f 	addi    r9,r3,4127
    	  2c:	7d 2a 48 50 	subf    r9,r10,r9
    	  30:	55 29 d9 7f 	rlwinm. r9,r9,27,5,31
    	  34:	41 82 00 94 	beq     c8 <__flush_dcache_icache+0xa4>
    	  38:	71 28 00 01 	andi.   r8,r9,1
    	  3c:	38 c9 ff ff 	addi    r6,r9,-1
    	  40:	7d 48 53 78 	mr      r8,r10
    	  44:	7d 27 4b 78 	mr      r7,r9
    	  48:	40 82 00 6c 	bne     b4 <__flush_dcache_icache+0x90>
    	  4c:	54 e7 f8 7e 	rlwinm  r7,r7,31,1,31
    	  50:	7c e9 03 a6 	mtctr   r7
    	  54:	7c 00 40 6c 	dcbst   0,r8
    	  58:	39 08 00 20 	addi    r8,r8,32
    	  5c:	7c 00 40 6c 	dcbst   0,r8
    	  60:	39 08 00 20 	addi    r8,r8,32
    	  64:	42 00 ff f0 	bdnz    54 <__flush_dcache_icache+0x30>
    	  68:	7c 00 04 ac 	hwsync
    	  6c:	71 28 00 01 	andi.   r8,r9,1
    	  70:	39 09 ff ff 	addi    r8,r9,-1
    	  74:	40 82 00 2c 	bne     a0 <__flush_dcache_icache+0x7c>
    	  78:	55 29 f8 7e 	rlwinm  r9,r9,31,1,31
    	  7c:	7d 29 03 a6 	mtctr   r9
    	  80:	7c 00 57 ac 	icbi    0,r10
    	  84:	39 4a 00 20 	addi    r10,r10,32
    	  88:	7c 00 57 ac 	icbi    0,r10
    	  8c:	39 4a 00 20 	addi    r10,r10,32
    	  90:	42 00 ff f0 	bdnz    80 <__flush_dcache_icache+0x5c>
    	  94:	7c 00 04 ac 	hwsync
    	  98:	4c 00 01 2c 	isync
    	  9c:	4e 80 00 20 	blr
    	  a0:	7c 00 57 ac 	icbi    0,r10
    	  a4:	2c 08 00 00 	cmpwi   r8,0
    	  a8:	39 4a 00 20 	addi    r10,r10,32
    	  ac:	40 82 ff cc 	bne     78 <__flush_dcache_icache+0x54>
    	  b0:	4b ff ff e4 	b       94 <__flush_dcache_icache+0x70>
    	  b4:	7c 00 50 6c 	dcbst   0,r10
    	  b8:	2c 06 00 00 	cmpwi   r6,0
    	  bc:	39 0a 00 20 	addi    r8,r10,32
    	  c0:	40 82 ff 8c 	bne     4c <__flush_dcache_icache+0x28>
    	  c4:	4b ff ff a4 	b       68 <__flush_dcache_icache+0x44>
    	  c8:	7c 00 04 ac 	hwsync
    	  cc:	7c 00 04 ac 	hwsync
    	  d0:	4c 00 01 2c 	isync
    	  d4:	4e 80 00 20 	blr
    Signed-off-by: default avatarChristophe Leroy <christophe.leroy@csgroup.eu>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/23030822ea5cd0a122948b10226abe56602dc027.1617895813.git.christophe.leroy@csgroup.eu
    67b8e6af
cacheflush.c 6.3 KB