Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

arch/sparc: Add accurate exception reporting in M7memcpy

Add accurate exception reporting in M7memcpy

Signed-off-by: Babu Moger <babu.moger@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Babu Moger and committed by
David S. Miller
34060b8f b3a04ed5

+390 -209
+5 -6
arch/sparc/lib/M7copy_from_user.S
··· 5 5 */ 6 6 7 7 8 - #define EX_LD(x) \ 8 + #define EX_LD(x, y) \ 9 9 98: x; \ 10 10 .section __ex_table,"a"; \ 11 11 .align 4; \ 12 - .word 98b, __restore_asi; \ 12 + .word 98b, y; \ 13 13 .text; \ 14 14 .align 4; 15 15 16 - #define EX_LD_FP(x) \ 16 + #define EX_LD_FP(x, y) \ 17 17 98: x; \ 18 18 .section __ex_table,"a"; \ 19 19 .align 4; \ 20 - .word 98b, __restore_asi_fp; \ 20 + .word 98b, y##_fp; \ 21 21 .text; \ 22 22 .align 4; 23 - 24 23 25 24 #ifndef ASI_AIUS 26 25 #define ASI_AIUS 0x11 ··· 34 35 rd %asi, %g1; \ 35 36 cmp %g1, ASI_AIUS; \ 36 37 bne,pn %icc, raw_copy_in_user; \ 37 - nop 38 + nop 38 39 #endif 39 40 40 41 #include "M7memcpy.S"
+5 -5
arch/sparc/lib/M7copy_to_user.S
··· 5 5 */ 6 6 7 7 8 - #define EX_ST(x) \ 8 + #define EX_ST(x, y) \ 9 9 98: x; \ 10 10 .section __ex_table,"a"; \ 11 11 .align 4; \ 12 - .word 98b, __restore_asi; \ 12 + .word 98b, y; \ 13 13 .text; \ 14 14 .align 4; 15 15 16 - #define EX_ST_FP(x) \ 16 + #define EX_ST_FP(x, y) \ 17 17 98: x; \ 18 18 .section __ex_table,"a"; \ 19 19 .align 4; \ 20 - .word 98b, __restore_asi_fp; \ 20 + .word 98b, y##_fp; \ 21 21 .text; \ 22 22 .align 4; 23 23 ··· 45 45 rd %asi, %g1; \ 46 46 cmp %g1, ASI_AIUS; \ 47 47 bne,pn %icc, raw_copy_in_user; \ 48 - nop 48 + nop 49 49 #endif 50 50 51 51 #include "M7memcpy.S"
+198 -198
arch/sparc/lib/M7memcpy.S
··· 96 96 #endif 97 97 98 98 #ifndef EX_LD 99 - #define EX_LD(x) x 99 + #define EX_LD(x,y) x 100 100 #endif 101 101 #ifndef EX_LD_FP 102 - #define EX_LD_FP(x) x 102 + #define EX_LD_FP(x,y) x 103 103 #endif 104 104 105 105 #ifndef EX_ST 106 - #define EX_ST(x) x 106 + #define EX_ST(x,y) x 107 107 #endif 108 108 #ifndef EX_ST_FP 109 - #define EX_ST_FP(x) x 109 + #define EX_ST_FP(x,y) x 110 110 #endif 111 111 112 112 #ifndef EX_RETVAL ··· 206 206 sub %o1, %o0, %o1 ! %o1 gets the difference 207 207 7: ! dst aligning loop 208 208 add %o1, %o0, %o4 209 - EX_LD(LOAD(ldub, %o4, %o4)) ! load one byte 209 + EX_LD(LOAD(ldub, %o4, %o4), memcpy_retl_o2_plus_o5) ! load one byte 210 210 subcc %o5, 1, %o5 211 - EX_ST(STORE(stb, %o4, %o0)) 211 + EX_ST(STORE(stb, %o4, %o0), memcpy_retl_o2_plus_o5_plus_1) 212 212 bgu,pt %xcc, 7b 213 213 add %o0, 1, %o0 ! advance dst 214 214 add %o1, %o0, %o1 ! restore %o1 ··· 233 233 ble,pn %xcc, .Lmedl63 ! skip big loop if less than 64 bytes 234 234 nop 235 235 .Lmedl64: 236 - EX_LD(LOAD(ldx, %o1, %o4)) ! load 236 + EX_LD(LOAD(ldx, %o1, %o4), memcpy_retl_o2_plus_63) ! load 237 237 subcc %o2, 64, %o2 ! decrement length count 238 - EX_ST(STORE(stx, %o4, %o0)) ! and store 239 - EX_LD(LOAD(ldx, %o1+8, %o3)) ! a block of 64 bytes 240 - EX_ST(STORE(stx, %o3, %o0+8)) 241 - EX_LD(LOAD(ldx, %o1+16, %o4)) 242 - EX_ST(STORE(stx, %o4, %o0+16)) 243 - EX_LD(LOAD(ldx, %o1+24, %o3)) 244 - EX_ST(STORE(stx, %o3, %o0+24)) 245 - EX_LD(LOAD(ldx, %o1+32, %o4)) ! load 246 - EX_ST(STORE(stx, %o4, %o0+32)) ! and store 247 - EX_LD(LOAD(ldx, %o1+40, %o3)) ! a block of 64 bytes 238 + EX_ST(STORE(stx, %o4, %o0), memcpy_retl_o2_plus_63_64) ! and store 239 + EX_LD(LOAD(ldx, %o1+8, %o3), memcpy_retl_o2_plus_63_56) ! a block of 64 240 + EX_ST(STORE(stx, %o3, %o0+8), memcpy_retl_o2_plus_63_56) 241 + EX_LD(LOAD(ldx, %o1+16, %o4), memcpy_retl_o2_plus_63_48) 242 + EX_ST(STORE(stx, %o4, %o0+16), memcpy_retl_o2_plus_63_48) 243 + EX_LD(LOAD(ldx, %o1+24, %o3), memcpy_retl_o2_plus_63_40) 244 + EX_ST(STORE(stx, %o3, %o0+24), memcpy_retl_o2_plus_63_40) 245 + EX_LD(LOAD(ldx, %o1+32, %o4), memcpy_retl_o2_plus_63_32)! load and store 246 + EX_ST(STORE(stx, %o4, %o0+32), memcpy_retl_o2_plus_63_32) 247 + EX_LD(LOAD(ldx, %o1+40, %o3), memcpy_retl_o2_plus_63_24)! a block of 64 248 248 add %o1, 64, %o1 ! increase src ptr by 64 249 - EX_ST(STORE(stx, %o3, %o0+40)) 250 - EX_LD(LOAD(ldx, %o1-16, %o4)) 249 + EX_ST(STORE(stx, %o3, %o0+40), memcpy_retl_o2_plus_63_24) 250 + EX_LD(LOAD(ldx, %o1-16, %o4), memcpy_retl_o2_plus_63_16) 251 251 add %o0, 64, %o0 ! increase dst ptr by 64 252 - EX_ST(STORE(stx, %o4, %o0-16)) 253 - EX_LD(LOAD(ldx, %o1-8, %o3)) 252 + EX_ST(STORE(stx, %o4, %o0-16), memcpy_retl_o2_plus_63_16) 253 + EX_LD(LOAD(ldx, %o1-8, %o3), memcpy_retl_o2_plus_63_8) 254 254 bgu,pt %xcc, .Lmedl64 ! repeat if at least 64 bytes left 255 - EX_ST(STORE(stx, %o3, %o0-8)) 255 + EX_ST(STORE(stx, %o3, %o0-8), memcpy_retl_o2_plus_63_8) 256 256 .Lmedl63: 257 257 addcc %o2, 32, %o2 ! adjust remaining count 258 258 ble,pt %xcc, .Lmedl31 ! to skip if 31 or fewer bytes left 259 259 nop 260 - EX_LD(LOAD(ldx, %o1, %o4)) ! load 260 + EX_LD(LOAD(ldx, %o1, %o4), memcpy_retl_o2_plus_31) ! load 261 261 sub %o2, 32, %o2 ! decrement length count 262 - EX_ST(STORE(stx, %o4, %o0)) ! and store 263 - EX_LD(LOAD(ldx, %o1+8, %o3)) ! a block of 32 bytes 262 + EX_ST(STORE(stx, %o4, %o0), memcpy_retl_o2_plus_31_32) ! and store 263 + EX_LD(LOAD(ldx, %o1+8, %o3), memcpy_retl_o2_plus_31_24) ! a block of 32 264 264 add %o1, 32, %o1 ! increase src ptr by 32 265 - EX_ST(STORE(stx, %o3, %o0+8)) 266 - EX_LD(LOAD(ldx, %o1-16, %o4)) 265 + EX_ST(STORE(stx, %o3, %o0+8), memcpy_retl_o2_plus_31_24) 266 + EX_LD(LOAD(ldx, %o1-16, %o4), memcpy_retl_o2_plus_31_16) 267 267 add %o0, 32, %o0 ! increase dst ptr by 32 268 - EX_ST(STORE(stx, %o4, %o0-16)) 269 - EX_LD(LOAD(ldx, %o1-8, %o3)) 270 - EX_ST(STORE(stx, %o3, %o0-8)) 268 + EX_ST(STORE(stx, %o4, %o0-16), memcpy_retl_o2_plus_31_16) 269 + EX_LD(LOAD(ldx, %o1-8, %o3), memcpy_retl_o2_plus_31_8) 270 + EX_ST(STORE(stx, %o3, %o0-8), memcpy_retl_o2_plus_31_8) 271 271 .Lmedl31: 272 272 addcc %o2, 16, %o2 ! adjust remaining count 273 273 ble,pt %xcc, .Lmedl15 ! skip if 15 or fewer bytes left 274 274 nop ! 275 - EX_LD(LOAD(ldx, %o1, %o4)) 275 + EX_LD(LOAD(ldx, %o1, %o4), memcpy_retl_o2_plus_15) 276 276 add %o1, 16, %o1 ! increase src ptr by 16 277 - EX_ST(STORE(stx, %o4, %o0)) 277 + EX_ST(STORE(stx, %o4, %o0), memcpy_retl_o2_plus_15) 278 278 sub %o2, 16, %o2 ! decrease count by 16 279 - EX_LD(LOAD(ldx, %o1-8, %o3)) 279 + EX_LD(LOAD(ldx, %o1-8, %o3), memcpy_retl_o2_plus_15_8) 280 280 add %o0, 16, %o0 ! increase dst ptr by 16 281 - EX_ST(STORE(stx, %o3, %o0-8)) 281 + EX_ST(STORE(stx, %o3, %o0-8), memcpy_retl_o2_plus_15_8) 282 282 .Lmedl15: 283 283 addcc %o2, 15, %o2 ! restore count 284 284 bz,pt %xcc, .Lsmallx ! exit if finished 285 285 cmp %o2, 8 286 286 blt,pt %xcc, .Lmedw7 ! skip if 7 or fewer bytes left 287 287 tst %o2 288 - EX_LD(LOAD(ldx, %o1, %o4)) ! load 8 bytes 288 + EX_LD(LOAD(ldx, %o1, %o4), memcpy_retl_o2) ! load 8 bytes 289 289 add %o1, 8, %o1 ! increase src ptr by 8 290 290 add %o0, 8, %o0 ! increase dst ptr by 8 291 291 subcc %o2, 8, %o2 ! decrease count by 8 292 292 bnz,pn %xcc, .Lmedw7 293 - EX_ST(STORE(stx, %o4, %o0-8)) ! and store 8 bytes 293 + EX_ST(STORE(stx, %o4, %o0-8), memcpy_retl_o2_plus_8) ! and store 8 294 294 retl 295 295 mov EX_RETVAL(%g1), %o0 ! restore %o0 296 296 ··· 318 318 ! for end of loop 319 319 ble,pt %xcc, .Lmedw31 ! skip big loop if less than 16 320 320 .Lmedw32: 321 - EX_LD(LOAD(ld, %o1, %o4)) ! move a block of 32 bytes 321 + EX_LD(LOAD(ld, %o1, %o4), memcpy_retl_o2_plus_31)! move a block of 32 322 322 sllx %o4, 32, %o5 323 - EX_LD(LOAD(ld, %o1+4, %o4)) 323 + EX_LD(LOAD(ld, %o1+4, %o4), memcpy_retl_o2_plus_31) 324 324 or %o4, %o5, %o5 325 - EX_ST(STORE(stx, %o5, %o0)) 325 + EX_ST(STORE(stx, %o5, %o0), memcpy_retl_o2_plus_31) 326 326 subcc %o2, 32, %o2 ! decrement length count 327 - EX_LD(LOAD(ld, %o1+8, %o4)) 327 + EX_LD(LOAD(ld, %o1+8, %o4), memcpy_retl_o2_plus_31_24) 328 328 sllx %o4, 32, %o5 329 - EX_LD(LOAD(ld, %o1+12, %o4)) 329 + EX_LD(LOAD(ld, %o1+12, %o4), memcpy_retl_o2_plus_31_24) 330 330 or %o4, %o5, %o5 331 - EX_ST(STORE(stx, %o5, %o0+8)) 331 + EX_ST(STORE(stx, %o5, %o0+8), memcpy_retl_o2_plus_31_24) 332 332 add %o1, 32, %o1 ! increase src ptr by 32 333 - EX_LD(LOAD(ld, %o1-16, %o4)) 333 + EX_LD(LOAD(ld, %o1-16, %o4), memcpy_retl_o2_plus_31_16) 334 334 sllx %o4, 32, %o5 335 - EX_LD(LOAD(ld, %o1-12, %o4)) 335 + EX_LD(LOAD(ld, %o1-12, %o4), memcpy_retl_o2_plus_31_16) 336 336 or %o4, %o5, %o5 337 - EX_ST(STORE(stx, %o5, %o0+16)) 337 + EX_ST(STORE(stx, %o5, %o0+16), memcpy_retl_o2_plus_31_16) 338 338 add %o0, 32, %o0 ! increase dst ptr by 32 339 - EX_LD(LOAD(ld, %o1-8, %o4)) 339 + EX_LD(LOAD(ld, %o1-8, %o4), memcpy_retl_o2_plus_31_8) 340 340 sllx %o4, 32, %o5 341 - EX_LD(LOAD(ld, %o1-4, %o4)) 341 + EX_LD(LOAD(ld, %o1-4, %o4), memcpy_retl_o2_plus_31_8) 342 342 or %o4, %o5, %o5 343 343 bgu,pt %xcc, .Lmedw32 ! repeat if at least 32 bytes left 344 - EX_ST(STORE(stx, %o5, %o0-8)) 344 + EX_ST(STORE(stx, %o5, %o0-8), memcpy_retl_o2_plus_31_8) 345 345 .Lmedw31: 346 346 addcc %o2, 31, %o2 ! restore count 347 347 ··· 350 350 cmp %o2, 16 351 351 blt,pt %xcc, .Lmedw15 352 352 nop 353 - EX_LD(LOAD(ld, %o1, %o4)) ! move a block of 16 bytes 353 + EX_LD(LOAD(ld, %o1, %o4), memcpy_retl_o2)! move a block of 16 bytes 354 354 sllx %o4, 32, %o5 355 355 subcc %o2, 16, %o2 ! decrement length count 356 - EX_LD(LOAD(ld, %o1+4, %o4)) 356 + EX_LD(LOAD(ld, %o1+4, %o4), memcpy_retl_o2_plus_16) 357 357 or %o4, %o5, %o5 358 - EX_ST(STORE(stx, %o5, %o0)) 358 + EX_ST(STORE(stx, %o5, %o0), memcpy_retl_o2_plus_16) 359 359 add %o1, 16, %o1 ! increase src ptr by 16 360 - EX_LD(LOAD(ld, %o1-8, %o4)) 360 + EX_LD(LOAD(ld, %o1-8, %o4), memcpy_retl_o2_plus_8) 361 361 add %o0, 16, %o0 ! increase dst ptr by 16 362 362 sllx %o4, 32, %o5 363 - EX_LD(LOAD(ld, %o1-4, %o4)) 363 + EX_LD(LOAD(ld, %o1-4, %o4), memcpy_retl_o2_plus_8) 364 364 or %o4, %o5, %o5 365 - EX_ST(STORE(stx, %o5, %o0-8)) 365 + EX_ST(STORE(stx, %o5, %o0-8), memcpy_retl_o2_plus_8) 366 366 .Lmedw15: 367 367 bz,pt %xcc, .Lsmallx ! exit if finished 368 368 cmp %o2, 8 369 369 blt,pn %xcc, .Lmedw7 ! skip if 7 or fewer bytes left 370 370 tst %o2 371 - EX_LD(LOAD(ld, %o1, %o4)) ! load 4 bytes 371 + EX_LD(LOAD(ld, %o1, %o4), memcpy_retl_o2) ! load 4 bytes 372 372 subcc %o2, 8, %o2 ! decrease count by 8 373 - EX_ST(STORE(stw, %o4, %o0)) ! and store 4 bytes 373 + EX_ST(STORE(stw, %o4, %o0), memcpy_retl_o2_plus_8)! and store 4 bytes 374 374 add %o1, 8, %o1 ! increase src ptr by 8 375 - EX_LD(LOAD(ld, %o1-4, %o3)) ! load 4 bytes 375 + EX_LD(LOAD(ld, %o1-4, %o3), memcpy_retl_o2_plus_4) ! load 4 bytes 376 376 add %o0, 8, %o0 ! increase dst ptr by 8 377 - EX_ST(STORE(stw, %o3, %o0-4)) ! and store 4 bytes 377 + EX_ST(STORE(stw, %o3, %o0-4), memcpy_retl_o2_plus_4)! and store 4 bytes 378 378 bz,pt %xcc, .Lsmallx ! exit if finished 379 379 .Lmedw7: ! count is ge 1, less than 8 380 380 cmp %o2, 4 ! check for 4 bytes left 381 381 blt,pn %xcc, .Lsmallleft3 ! skip if 3 or fewer bytes left 382 382 nop ! 383 - EX_LD(LOAD(ld, %o1, %o4)) ! load 4 bytes 383 + EX_LD(LOAD(ld, %o1, %o4), memcpy_retl_o2) ! load 4 bytes 384 384 add %o1, 4, %o1 ! increase src ptr by 4 385 385 add %o0, 4, %o0 ! increase dst ptr by 4 386 386 subcc %o2, 4, %o2 ! decrease count by 4 387 387 bnz .Lsmallleft3 388 - EX_ST(STORE(stw, %o4, %o0-4))! and store 4 bytes 388 + EX_ST(STORE(stw, %o4, %o0-4), memcpy_retl_o2_plus_4)! and store 4 bytes 389 389 retl 390 390 mov EX_RETVAL(%g1), %o0 391 391 ··· 397 397 andcc %o0, 8, %o3 ! odd long words to move? 398 398 brz,pt %o3, .Laligned_to_16 399 399 nop 400 - EX_LD(LOAD(ldx, %o1, %o4)) 400 + EX_LD(LOAD(ldx, %o1, %o4), memcpy_retl_o2) 401 401 sub %o2, 8, %o2 402 402 add %o1, 8, %o1 ! increment src ptr 403 403 add %o0, 8, %o0 ! increment dst ptr 404 - EX_ST(STORE(stx, %o4, %o0-8)) 404 + EX_ST(STORE(stx, %o4, %o0-8), memcpy_retl_o2_plus_8) 405 405 .Laligned_to_16: 406 406 andcc %o0, 16, %o3 ! pair of long words to move? 407 407 brz,pt %o3, .Laligned_to_32 408 408 nop 409 - EX_LD(LOAD(ldx, %o1, %o4)) 409 + EX_LD(LOAD(ldx, %o1, %o4), memcpy_retl_o2) 410 410 sub %o2, 16, %o2 411 - EX_ST(STORE(stx, %o4, %o0)) 411 + EX_ST(STORE(stx, %o4, %o0), memcpy_retl_o2_plus_16) 412 412 add %o1, 16, %o1 ! increment src ptr 413 - EX_LD(LOAD(ldx, %o1-8, %o4)) 413 + EX_LD(LOAD(ldx, %o1-8, %o4), memcpy_retl_o2_plus_8) 414 414 add %o0, 16, %o0 ! increment dst ptr 415 - EX_ST(STORE(stx, %o4, %o0-8)) 415 + EX_ST(STORE(stx, %o4, %o0-8), memcpy_retl_o2_plus_8) 416 416 .Laligned_to_32: 417 417 andcc %o0, 32, %o3 ! four long words to move? 418 418 brz,pt %o3, .Laligned_to_64 419 419 nop 420 - EX_LD(LOAD(ldx, %o1, %o4)) 420 + EX_LD(LOAD(ldx, %o1, %o4), memcpy_retl_o2) 421 421 sub %o2, 32, %o2 422 - EX_ST(STORE(stx, %o4, %o0)) 423 - EX_LD(LOAD(ldx, %o1+8, %o4)) 424 - EX_ST(STORE(stx, %o4, %o0+8)) 425 - EX_LD(LOAD(ldx, %o1+16, %o4)) 426 - EX_ST(STORE(stx, %o4, %o0+16)) 422 + EX_ST(STORE(stx, %o4, %o0), memcpy_retl_o2_plus_32) 423 + EX_LD(LOAD(ldx, %o1+8, %o4), memcpy_retl_o2_plus_24) 424 + EX_ST(STORE(stx, %o4, %o0+8), memcpy_retl_o2_plus_24) 425 + EX_LD(LOAD(ldx, %o1+16, %o4), memcpy_retl_o2_plus_16) 426 + EX_ST(STORE(stx, %o4, %o0+16), memcpy_retl_o2_plus_16) 427 427 add %o1, 32, %o1 ! increment src ptr 428 - EX_LD(LOAD(ldx, %o1-8, %o4)) 428 + EX_LD(LOAD(ldx, %o1-8, %o4), memcpy_retl_o2_plus_8) 429 429 add %o0, 32, %o0 ! increment dst ptr 430 - EX_ST(STORE(stx, %o4, %o0-8)) 430 + EX_ST(STORE(stx, %o4, %o0-8), memcpy_retl_o2_plus_8) 431 431 .Laligned_to_64: 432 432 ! 433 433 ! Using block init store (BIS) instructions to avoid fetching cache ··· 461 461 .Lalign_loop_start: 462 462 prefetch [%o1 + (ALIGN_PRE * BLOCK_SIZE)], 21 463 463 subcc %o3, 1, %o3 464 - EX_LD(LOAD(ldx, %o1, %o4)) 464 + EX_LD(LOAD(ldx, %o1, %o4), memcpy_retl_o2_plus_o5) 465 465 add %o1, 64, %o1 466 466 add %o0, 8, %o0 467 - EX_ST(STORE_INIT_MRU(%o4, %o0)) 467 + EX_ST(STORE_INIT_MRU(%o4, %o0), memcpy_retl_o2_plus_o5) 468 468 bgu %xcc,.Lalign_loop_start 469 469 add %o0, 56, %o0 470 470 ··· 474 474 sub %o0, %o4, %o0 ! reset %o0 475 475 476 476 .Lalign_loop_rest: 477 - EX_LD(LOAD(ldx, %o1+8, %o4)) 477 + EX_LD(LOAD(ldx, %o1+8, %o4), memcpy_retl_o2_plus_o5) 478 478 add %o0, 16, %o0 479 - EX_ST(STORE_INIT_MRU(%o4, %o0)) 480 - EX_LD(LOAD(ldx, %o1+16, %o4)) 479 + EX_ST(STORE_INIT_MRU(%o4, %o0), memcpy_retl_o2_plus_o5) 480 + EX_LD(LOAD(ldx, %o1+16, %o4), memcpy_retl_o2_plus_o5) 481 481 add %o0, 8, %o0 482 - EX_ST(STORE_INIT_MRU(%o4, %o0)) 482 + EX_ST(STORE_INIT_MRU(%o4, %o0), memcpy_retl_o2_plus_o5) 483 483 subcc %o3, 1, %o3 484 - EX_LD(LOAD(ldx, %o1+24, %o4)) 484 + EX_LD(LOAD(ldx, %o1+24, %o4), memcpy_retl_o2_plus_o5) 485 485 add %o0, 8, %o0 486 - EX_ST(STORE_INIT_MRU(%o4, %o0)) 487 - EX_LD(LOAD(ldx, %o1+32, %o4)) 486 + EX_ST(STORE_INIT_MRU(%o4, %o0), memcpy_retl_o2_plus_o5) 487 + EX_LD(LOAD(ldx, %o1+32, %o4), memcpy_retl_o2_plus_o5) 488 488 add %o0, 8, %o0 489 - EX_ST(STORE_INIT_MRU(%o4, %o0)) 490 - EX_LD(LOAD(ldx, %o1+40, %o4)) 489 + EX_ST(STORE_INIT_MRU(%o4, %o0), memcpy_retl_o2_plus_o5) 490 + EX_LD(LOAD(ldx, %o1+40, %o4), memcpy_retl_o2_plus_o5) 491 491 add %o0, 8, %o0 492 - EX_ST(STORE_INIT_MRU(%o4, %o0)) 493 - EX_LD(LOAD(ldx, %o1+48, %o4)) 492 + EX_ST(STORE_INIT_MRU(%o4, %o0), memcpy_retl_o2_plus_o5) 493 + EX_LD(LOAD(ldx, %o1+48, %o4), memcpy_retl_o2_plus_o5) 494 494 add %o1, 64, %o1 495 495 add %o0, 8, %o0 496 - EX_ST(STORE_INIT_MRU(%o4, %o0)) 496 + EX_ST(STORE_INIT_MRU(%o4, %o0), memcpy_retl_o2_plus_o5) 497 497 add %o0, 8, %o0 498 - EX_LD(LOAD(ldx, %o1-8, %o4)) 498 + EX_LD(LOAD(ldx, %o1-8, %o4), memcpy_retl_o2_plus_o5) 499 499 sub %o5, 64, %o5 500 500 bgu %xcc,.Lalign_loop_rest 501 501 ! mark cache line as LRU 502 - EX_ST(STORE_INIT(%o4, %o0)) 502 + EX_ST(STORE_INIT(%o4, %o0), memcpy_retl_o2_plus_o5_plus_64) 503 503 504 504 cmp %o5, ST_CHUNK*64 505 505 bgu,pt %xcc, .Lalign_loop_start ··· 509 509 beq .Lalign_done 510 510 nop 511 511 .Lalign_loop_fin: 512 - EX_LD(LOAD(ldx, %o1, %o4)) 513 - EX_ST(STORE(stx, %o4, %o0+8)) 514 - EX_LD(LOAD(ldx, %o1+8, %o4)) 515 - EX_ST(STORE(stx, %o4, %o0+8+8)) 516 - EX_LD(LOAD(ldx, %o1+16, %o4)) 517 - EX_ST(STORE(stx, %o4, %o0+8+16)) 512 + EX_LD(LOAD(ldx, %o1, %o4), memcpy_retl_o2_plus_o5) 513 + EX_ST(STORE(stx, %o4, %o0+8), memcpy_retl_o2_plus_o5) 514 + EX_LD(LOAD(ldx, %o1+8, %o4), memcpy_retl_o2_plus_o5) 515 + EX_ST(STORE(stx, %o4, %o0+8+8), memcpy_retl_o2_plus_o5) 516 + EX_LD(LOAD(ldx, %o1+16, %o4), memcpy_retl_o2_plus_o5) 517 + EX_ST(STORE(stx, %o4, %o0+8+16), memcpy_retl_o2_plus_o5) 518 518 subcc %o5, 64, %o5 519 - EX_LD(LOAD(ldx, %o1+24, %o4)) 520 - EX_ST(STORE(stx, %o4, %o0+8+24)) 521 - EX_LD(LOAD(ldx, %o1+32, %o4)) 522 - EX_ST(STORE(stx, %o4, %o0+8+32)) 523 - EX_LD(LOAD(ldx, %o1+40, %o4)) 524 - EX_ST(STORE(stx, %o4, %o0+8+40)) 525 - EX_LD(LOAD(ldx, %o1+48, %o4)) 519 + EX_LD(LOAD(ldx, %o1+24, %o4), memcpy_retl_o2_plus_o5_64) 520 + EX_ST(STORE(stx, %o4, %o0+8+24), memcpy_retl_o2_plus_o5_64) 521 + EX_LD(LOAD(ldx, %o1+32, %o4), memcpy_retl_o2_plus_o5_64) 522 + EX_ST(STORE(stx, %o4, %o0+8+32), memcpy_retl_o2_plus_o5_64) 523 + EX_LD(LOAD(ldx, %o1+40, %o4), memcpy_retl_o2_plus_o5_64) 524 + EX_ST(STORE(stx, %o4, %o0+8+40), memcpy_retl_o2_plus_o5_64) 525 + EX_LD(LOAD(ldx, %o1+48, %o4), memcpy_retl_o2_plus_o5_64) 526 526 add %o1, 64, %o1 527 - EX_ST(STORE(stx, %o4, %o0+8+48)) 527 + EX_ST(STORE(stx, %o4, %o0+8+48), memcpy_retl_o2_plus_o5_64) 528 528 add %o0, 64, %o0 529 - EX_LD(LOAD(ldx, %o1-8, %o4)) 529 + EX_LD(LOAD(ldx, %o1-8, %o4), memcpy_retl_o2_plus_o5_64) 530 530 bgu %xcc,.Lalign_loop_fin 531 - EX_ST(STORE(stx, %o4, %o0)) 531 + EX_ST(STORE(stx, %o4, %o0), memcpy_retl_o2_plus_o5_64) 532 532 533 533 .Lalign_done: 534 534 add %o0, 8, %o0 ! restore %o0 from ASI alignment ··· 563 563 .Lunalign_adjust: 564 564 alignaddr %o1, %g0, %g0 ! generate %gsr 565 565 add %o1, %o5, %o1 ! advance %o1 to after blocks 566 - EX_LD_FP(LOAD(ldd, %o4, %f0)) 566 + EX_LD_FP(LOAD(ldd, %o4, %f0), memcpy_retl_o2_plus_o5) 567 567 .Lunalign_loop: 568 - EX_LD_FP(LOAD(ldd, %o4+8, %f2)) 568 + EX_LD_FP(LOAD(ldd, %o4+8, %f2), memcpy_retl_o2_plus_o5) 569 569 faligndata %f0, %f2, %f16 570 - EX_LD_FP(LOAD(ldd, %o4+16, %f4)) 570 + EX_LD_FP(LOAD(ldd, %o4+16, %f4), memcpy_retl_o2_plus_o5) 571 571 subcc %o5, BLOCK_SIZE, %o5 572 - EX_ST_FP(STORE(std, %f16, %o0)) 572 + EX_ST_FP(STORE(std, %f16, %o0), memcpy_retl_o2_plus_o5_plus_64) 573 573 faligndata %f2, %f4, %f18 574 - EX_LD_FP(LOAD(ldd, %o4+24, %f6)) 575 - EX_ST_FP(STORE(std, %f18, %o0+8)) 574 + EX_LD_FP(LOAD(ldd, %o4+24, %f6), memcpy_retl_o2_plus_o5_plus_56) 575 + EX_ST_FP(STORE(std, %f18, %o0+8), memcpy_retl_o2_plus_o5_plus_56) 576 576 faligndata %f4, %f6, %f20 577 - EX_LD_FP(LOAD(ldd, %o4+32, %f8)) 578 - EX_ST_FP(STORE(std, %f20, %o0+16)) 577 + EX_LD_FP(LOAD(ldd, %o4+32, %f8), memcpy_retl_o2_plus_o5_plus_48) 578 + EX_ST_FP(STORE(std, %f20, %o0+16), memcpy_retl_o2_plus_o5_plus_48) 579 579 faligndata %f6, %f8, %f22 580 - EX_LD_FP(LOAD(ldd, %o4+40, %f10)) 581 - EX_ST_FP(STORE(std, %f22, %o0+24)) 580 + EX_LD_FP(LOAD(ldd, %o4+40, %f10), memcpy_retl_o2_plus_o5_plus_40) 581 + EX_ST_FP(STORE(std, %f22, %o0+24), memcpy_retl_o2_plus_o5_plus_40) 582 582 faligndata %f8, %f10, %f24 583 - EX_LD_FP(LOAD(ldd, %o4+48, %f12)) 584 - EX_ST_FP(STORE(std, %f24, %o0+32)) 583 + EX_LD_FP(LOAD(ldd, %o4+48, %f12), memcpy_retl_o2_plus_o5_plus_32) 584 + EX_ST_FP(STORE(std, %f24, %o0+32), memcpy_retl_o2_plus_o5_plus_32) 585 585 faligndata %f10, %f12, %f26 586 - EX_LD_FP(LOAD(ldd, %o4+56, %f14)) 586 + EX_LD_FP(LOAD(ldd, %o4+56, %f14), memcpy_retl_o2_plus_o5_plus_24) 587 587 add %o4, BLOCK_SIZE, %o4 588 - EX_ST_FP(STORE(std, %f26, %o0+40)) 588 + EX_ST_FP(STORE(std, %f26, %o0+40), memcpy_retl_o2_plus_o5_plus_24) 589 589 faligndata %f12, %f14, %f28 590 - EX_LD_FP(LOAD(ldd, %o4, %f0)) 591 - EX_ST_FP(STORE(std, %f28, %o0+48)) 590 + EX_LD_FP(LOAD(ldd, %o4, %f0), memcpy_retl_o2_plus_o5_plus_16) 591 + EX_ST_FP(STORE(std, %f28, %o0+48), memcpy_retl_o2_plus_o5_plus_16) 592 592 faligndata %f14, %f0, %f30 593 - EX_ST_FP(STORE(std, %f30, %o0+56)) 593 + EX_ST_FP(STORE(std, %f30, %o0+56), memcpy_retl_o2_plus_o5_plus_8) 594 594 add %o0, BLOCK_SIZE, %o0 595 595 bgu,pt %xcc, .Lunalign_loop 596 596 prefetch [%o4 + (5 * BLOCK_SIZE)], 20 ··· 612 612 nop 613 613 ! Src is word aligned 614 614 .Lunalignword: 615 - EX_LD_FP(LOAD(ld, %o1, %o4)) ! load 4 bytes 615 + EX_LD_FP(LOAD(ld, %o1, %o4), memcpy_retl_o2_plus_o3) ! load 4 bytes 616 616 add %o1, 8, %o1 ! increase src ptr by 8 617 - EX_ST_FP(STORE(stw, %o4, %o0)) ! and store 4 bytes 617 + EX_ST_FP(STORE(stw, %o4, %o0), memcpy_retl_o2_plus_o3) ! and store 4 618 618 subcc %o3, 8, %o3 ! decrease count by 8 619 - EX_LD_FP(LOAD(ld, %o1-4, %o4)) ! load 4 bytes 619 + EX_LD_FP(LOAD(ld, %o1-4, %o4), memcpy_retl_o2_plus_o3_plus_4)! load 4 620 620 add %o0, 8, %o0 ! increase dst ptr by 8 621 621 bnz %xcc, .Lunalignword 622 - EX_ST_FP(STORE(stw, %o4, %o0-4))! and store 4 bytes 622 + EX_ST_FP(STORE(stw, %o4, %o0-4), memcpy_retl_o2_plus_o3_plus_4) 623 623 ba .Lunalignsrc 624 624 nop 625 625 626 626 ! Src is half-word aligned 627 627 .Lunalignhalf: 628 - EX_LD_FP(LOAD(lduh, %o1, %o4)) ! load 2 bytes 628 + EX_LD_FP(LOAD(lduh, %o1, %o4), memcpy_retl_o2_plus_o3) ! load 2 bytes 629 629 sllx %o4, 32, %o5 ! shift left 630 - EX_LD_FP(LOAD(lduw, %o1+2, %o4)) 630 + EX_LD_FP(LOAD(lduw, %o1+2, %o4), memcpy_retl_o2_plus_o3) 631 631 or %o4, %o5, %o5 632 632 sllx %o5, 16, %o5 633 - EX_LD_FP(LOAD(lduh, %o1+6, %o4)) 633 + EX_LD_FP(LOAD(lduh, %o1+6, %o4), memcpy_retl_o2_plus_o3) 634 634 or %o4, %o5, %o5 635 - EX_ST_FP(STORE(stx, %o5, %o0)) 635 + EX_ST_FP(STORE(stx, %o5, %o0), memcpy_retl_o2_plus_o3) 636 636 add %o1, 8, %o1 637 637 subcc %o3, 8, %o3 638 638 bnz %xcc, .Lunalignhalf ··· 644 644 .Lunalignbyte: 645 645 sub %o0, %o1, %o0 ! share pointer advance 646 646 .Lunalignbyte_loop: 647 - EX_LD_FP(LOAD(ldub, %o1, %o4)) 647 + EX_LD_FP(LOAD(ldub, %o1, %o4), memcpy_retl_o2_plus_o3) 648 648 sllx %o4, 56, %o5 649 - EX_LD_FP(LOAD(lduh, %o1+1, %o4)) 649 + EX_LD_FP(LOAD(lduh, %o1+1, %o4), memcpy_retl_o2_plus_o3) 650 650 sllx %o4, 40, %o4 651 651 or %o4, %o5, %o5 652 - EX_LD_FP(LOAD(lduh, %o1+3, %o4)) 652 + EX_LD_FP(LOAD(lduh, %o1+3, %o4), memcpy_retl_o2_plus_o3) 653 653 sllx %o4, 24, %o4 654 654 or %o4, %o5, %o5 655 - EX_LD_FP(LOAD(lduh, %o1+5, %o4)) 655 + EX_LD_FP(LOAD(lduh, %o1+5, %o4), memcpy_retl_o2_plus_o3) 656 656 sllx %o4, 8, %o4 657 657 or %o4, %o5, %o5 658 - EX_LD_FP(LOAD(ldub, %o1+7, %o4)) 658 + EX_LD_FP(LOAD(ldub, %o1+7, %o4), memcpy_retl_o2_plus_o3) 659 659 or %o4, %o5, %o5 660 660 add %o0, %o1, %o0 661 - EX_ST_FP(STORE(stx, %o5, %o0)) 661 + EX_ST_FP(STORE(stx, %o5, %o0), memcpy_retl_o2_plus_o3) 662 662 sub %o0, %o1, %o0 663 663 subcc %o3, 8, %o3 664 664 bnz %xcc, .Lunalignbyte_loop ··· 676 676 alignaddr %o1, %g0, %g0 ! generate %gsr 677 677 add %o1, %o5, %o1 ! advance %o1 to after blocks 678 678 679 - EX_LD_FP(LOAD(ldd, %o4, %f14)) 679 + EX_LD_FP(LOAD(ldd, %o4, %f14), memcpy_retl_o2_plus_o5) 680 680 add %o4, 8, %o4 681 681 .Lunalign_sloop: 682 - EX_LD_FP(LOAD(ldd, %o4, %f16)) 682 + EX_LD_FP(LOAD(ldd, %o4, %f16), memcpy_retl_o2_plus_o5) 683 683 faligndata %f14, %f16, %f0 684 - EX_LD_FP(LOAD(ldd, %o4+8, %f18)) 684 + EX_LD_FP(LOAD(ldd, %o4+8, %f18), memcpy_retl_o2_plus_o5) 685 685 faligndata %f16, %f18, %f2 686 - EX_LD_FP(LOAD(ldd, %o4+16, %f20)) 686 + EX_LD_FP(LOAD(ldd, %o4+16, %f20), memcpy_retl_o2_plus_o5) 687 687 faligndata %f18, %f20, %f4 688 - EX_ST_FP(STORE(std, %f0, %o0)) 688 + EX_ST_FP(STORE(std, %f0, %o0), memcpy_retl_o2_plus_o5) 689 689 subcc %o5, 64, %o5 690 - EX_LD_FP(LOAD(ldd, %o4+24, %f22)) 690 + EX_LD_FP(LOAD(ldd, %o4+24, %f22), memcpy_retl_o2_plus_o5_plus_56) 691 691 faligndata %f20, %f22, %f6 692 - EX_ST_FP(STORE(std, %f2, %o0+8)) 693 - EX_LD_FP(LOAD(ldd, %o4+32, %f24)) 692 + EX_ST_FP(STORE(std, %f2, %o0+8), memcpy_retl_o2_plus_o5_plus_56) 693 + EX_LD_FP(LOAD(ldd, %o4+32, %f24), memcpy_retl_o2_plus_o5_plus_48) 694 694 faligndata %f22, %f24, %f8 695 - EX_ST_FP(STORE(std, %f4, %o0+16)) 696 - EX_LD_FP(LOAD(ldd, %o4+40, %f26)) 695 + EX_ST_FP(STORE(std, %f4, %o0+16), memcpy_retl_o2_plus_o5_plus_48) 696 + EX_LD_FP(LOAD(ldd, %o4+40, %f26), memcpy_retl_o2_plus_o5_plus_40) 697 697 faligndata %f24, %f26, %f10 698 - EX_ST_FP(STORE(std, %f6, %o0+24)) 699 - EX_LD_FP(LOAD(ldd, %o4+48, %f28)) 698 + EX_ST_FP(STORE(std, %f6, %o0+24), memcpy_retl_o2_plus_o5_plus_40) 699 + EX_LD_FP(LOAD(ldd, %o4+48, %f28), memcpy_retl_o2_plus_o5_plus_40) 700 700 faligndata %f26, %f28, %f12 701 - EX_ST_FP(STORE(std, %f8, %o0+32)) 701 + EX_ST_FP(STORE(std, %f8, %o0+32), memcpy_retl_o2_plus_o5_plus_40) 702 702 add %o4, 64, %o4 703 - EX_LD_FP(LOAD(ldd, %o4-8, %f30)) 703 + EX_LD_FP(LOAD(ldd, %o4-8, %f30), memcpy_retl_o2_plus_o5_plus_40) 704 704 faligndata %f28, %f30, %f14 705 - EX_ST_FP(STORE(std, %f10, %o0+40)) 706 - EX_ST_FP(STORE(std, %f12, %o0+48)) 705 + EX_ST_FP(STORE(std, %f10, %o0+40), memcpy_retl_o2_plus_o5_plus_40) 706 + EX_ST_FP(STORE(std, %f12, %o0+48), memcpy_retl_o2_plus_o5_plus_40) 707 707 add %o0, 64, %o0 708 - EX_ST_FP(STORE(std, %f14, %o0-8)) 708 + EX_ST_FP(STORE(std, %f14, %o0-8), memcpy_retl_o2_plus_o5_plus_40) 709 709 fsrc2 %f30, %f14 710 710 bgu,pt %xcc, .Lunalign_sloop 711 711 prefetch [%o4 + (8 * BLOCK_SIZE)], 20 ··· 722 722 sub %o5, 8, %o5 ! insure we do not load past end of src 723 723 andn %o1, 0x7, %o4 ! %o4 has long word aligned src address 724 724 add %o1, %o5, %o1 ! advance %o1 to after multiple of 8 725 - EX_LD_FP(LOAD(ldd, %o4, %f0)) ! fetch partial word 725 + EX_LD_FP(LOAD(ldd, %o4, %f0), memcpy_retl_o2_plus_o5)! fetch partialword 726 726 .Lunalign_by8: 727 - EX_LD_FP(LOAD(ldd, %o4+8, %f2)) 727 + EX_LD_FP(LOAD(ldd, %o4+8, %f2), memcpy_retl_o2_plus_o5) 728 728 add %o4, 8, %o4 729 729 faligndata %f0, %f2, %f16 730 730 subcc %o5, 8, %o5 731 - EX_ST_FP(STORE(std, %f16, %o0)) 731 + EX_ST_FP(STORE(std, %f16, %o0), memcpy_retl_o2_plus_o5) 732 732 fsrc2 %f2, %f0 733 733 bgu,pt %xcc, .Lunalign_by8 734 734 add %o0, 8, %o0 ··· 764 764 andncc %o2, 0x20 - 1, %o5 765 765 be,pn %xcc, 2f 766 766 sub %o2, %o5, %o2 767 - 1: EX_LD(LOAD(ldx, %o1 + 0x00, %o3)) 768 - EX_LD(LOAD(ldx, %o1 + 0x08, %g2)) 769 - EX_LD(LOAD(ldx, %o1 + 0x10, %g7)) 770 - EX_LD(LOAD(ldx, %o1 + 0x18, %o4)) 767 + 1: EX_LD(LOAD(ldx, %o1 + 0x00, %o3), memcpy_retl_o2_plus_o5) 768 + EX_LD(LOAD(ldx, %o1 + 0x08, %g2), memcpy_retl_o2_plus_o5) 769 + EX_LD(LOAD(ldx, %o1 + 0x10, %g7), memcpy_retl_o2_plus_o5) 770 + EX_LD(LOAD(ldx, %o1 + 0x18, %o4), memcpy_retl_o2_plus_o5) 771 771 add %o1, 0x20, %o1 772 772 subcc %o5, 0x20, %o5 773 - EX_ST(STORE(stx, %o3, %o0 + 0x00)) 774 - EX_ST(STORE(stx, %g2, %o0 + 0x08)) 775 - EX_ST(STORE(stx, %g7, %o0 + 0x10)) 776 - EX_ST(STORE(stx, %o4, %o0 + 0x18)) 773 + EX_ST(STORE(stx, %o3, %o0 + 0x00), memcpy_retl_o2_plus_o5_plus_32) 774 + EX_ST(STORE(stx, %g2, %o0 + 0x08), memcpy_retl_o2_plus_o5_plus_24) 775 + EX_ST(STORE(stx, %g7, %o0 + 0x10), memcpy_retl_o2_plus_o5_plus_24) 776 + EX_ST(STORE(stx, %o4, %o0 + 0x18), memcpy_retl_o2_plus_o5_plus_8) 777 777 bne,pt %xcc, 1b 778 778 add %o0, 0x20, %o0 779 779 2: andcc %o2, 0x18, %o5 780 780 be,pt %xcc, 3f 781 781 sub %o2, %o5, %o2 782 - 1: EX_LD(LOAD(ldx, %o1 + 0x00, %o3)) 782 + 1: EX_LD(LOAD(ldx, %o1 + 0x00, %o3), memcpy_retl_o2_plus_o5) 783 783 add %o1, 0x08, %o1 784 784 add %o0, 0x08, %o0 785 785 subcc %o5, 0x08, %o5 786 786 bne,pt %xcc, 1b 787 - EX_ST(STORE(stx, %o3, %o0 - 0x08)) 787 + EX_ST(STORE(stx, %o3, %o0 - 0x08), memcpy_retl_o2_plus_o5_plus_8) 788 788 3: brz,pt %o2, .Lexit_cp 789 789 cmp %o2, 0x04 790 790 bl,pn %xcc, .Ltiny_cp 791 791 nop 792 - EX_LD(LOAD(lduw, %o1 + 0x00, %o3)) 792 + EX_LD(LOAD(lduw, %o1 + 0x00, %o3), memcpy_retl_o2) 793 793 add %o1, 0x04, %o1 794 794 add %o0, 0x04, %o0 795 795 subcc %o2, 0x04, %o2 796 796 bne,pn %xcc, .Ltiny_cp 797 - EX_ST(STORE(stw, %o3, %o0 - 0x04)) 797 + EX_ST(STORE(stw, %o3, %o0 - 0x04), memcpy_retl_o2_plus_4) 798 798 ba,a,pt %xcc, .Lexit_cp 799 799 800 800 .Lmedium_unaligned_cp: ··· 804 804 brz,pt %o3, 2f 805 805 sub %o2, %o3, %o2 806 806 807 - 1: EX_LD(LOAD(ldub, %o1 + 0x00, %g2)) 807 + 1: EX_LD(LOAD(ldub, %o1 + 0x00, %g2), memcpy_retl_o2_plus_g1) 808 808 add %o1, 1, %o1 809 809 subcc %o3, 1, %o3 810 810 add %o0, 1, %o0 811 811 bne,pt %xcc, 1b 812 - EX_ST(STORE(stb, %g2, %o0 - 0x01)) 812 + EX_ST(STORE(stb, %g2, %o0 - 0x01), memcpy_retl_o2_plus_g1_plus_1) 813 813 2: 814 814 and %o1, 0x7, %o3 815 815 brz,pn %o3, .Lmedium_noprefetch_cp ··· 817 817 mov 64, %g2 818 818 sub %g2, %o3, %g2 819 819 andn %o1, 0x7, %o1 820 - EX_LD(LOAD(ldx, %o1 + 0x00, %o4)) 820 + EX_LD(LOAD(ldx, %o1 + 0x00, %o4), memcpy_retl_o2) 821 821 sllx %o4, %o3, %o4 822 822 andn %o2, 0x08 - 1, %o5 823 823 sub %o2, %o5, %o2 824 824 825 - 1: EX_LD(LOAD(ldx, %o1 + 0x08, %g3)) 825 + 1: EX_LD(LOAD(ldx, %o1 + 0x08, %g3), memcpy_retl_o2_plus_o5) 826 826 add %o1, 0x08, %o1 827 827 subcc %o5, 0x08, %o5 828 828 srlx %g3, %g2, %g7 829 829 or %g7, %o4, %g7 830 - EX_ST(STORE(stx, %g7, %o0 + 0x00)) 830 + EX_ST(STORE(stx, %g7, %o0 + 0x00), memcpy_retl_o2_plus_o5_plus_8) 831 831 add %o0, 0x08, %o0 832 832 bne,pt %xcc, 1b 833 833 sllx %g3, %o3, %o4 ··· 838 838 ba,pt %xcc, .Lsmall_unaligned_cp 839 839 840 840 .Ltiny_cp: 841 - EX_LD(LOAD(ldub, %o1 + 0x00, %o3)) 841 + EX_LD(LOAD(ldub, %o1 + 0x00, %o3), memcpy_retl_o2) 842 842 subcc %o2, 1, %o2 843 843 be,pn %xcc, .Lexit_cp 844 - EX_ST(STORE(stb, %o3, %o0 + 0x00)) 845 - EX_LD(LOAD(ldub, %o1 + 0x01, %o3)) 844 + EX_ST(STORE(stb, %o3, %o0 + 0x00), memcpy_retl_o2_plus_1) 845 + EX_LD(LOAD(ldub, %o1 + 0x01, %o3), memcpy_retl_o2) 846 846 subcc %o2, 1, %o2 847 847 be,pn %xcc, .Lexit_cp 848 - EX_ST(STORE(stb, %o3, %o0 + 0x01)) 849 - EX_LD(LOAD(ldub, %o1 + 0x02, %o3)) 848 + EX_ST(STORE(stb, %o3, %o0 + 0x01), memcpy_retl_o2_plus_1) 849 + EX_LD(LOAD(ldub, %o1 + 0x02, %o3), memcpy_retl_o2) 850 850 ba,pt %xcc, .Lexit_cp 851 - EX_ST(STORE(stb, %o3, %o0 + 0x02)) 851 + EX_ST(STORE(stb, %o3, %o0 + 0x02), memcpy_retl_o2) 852 852 853 853 .Lsmall_cp: 854 854 andcc %g2, 0x3, %g0 ··· 856 856 andn %o2, 0x4 - 1, %o5 857 857 sub %o2, %o5, %o2 858 858 1: 859 - EX_LD(LOAD(lduw, %o1 + 0x00, %o3)) 859 + EX_LD(LOAD(lduw, %o1 + 0x00, %o3), memcpy_retl_o2_plus_o5) 860 860 add %o1, 0x04, %o1 861 861 subcc %o5, 0x04, %o5 862 862 add %o0, 0x04, %o0 863 863 bne,pt %xcc, 1b 864 - EX_ST(STORE(stw, %o3, %o0 - 0x04)) 864 + EX_ST(STORE(stw, %o3, %o0 - 0x04), memcpy_retl_o2_plus_o5_plus_4) 865 865 brz,pt %o2, .Lexit_cp 866 866 nop 867 867 ba,a,pt %xcc, .Ltiny_cp 868 868 869 869 .Lsmall_unaligned_cp: 870 - 1: EX_LD(LOAD(ldub, %o1 + 0x00, %o3)) 870 + 1: EX_LD(LOAD(ldub, %o1 + 0x00, %o3), memcpy_retl_o2) 871 871 add %o1, 1, %o1 872 872 add %o0, 1, %o0 873 873 subcc %o2, 1, %o2 874 874 bne,pt %xcc, 1b 875 - EX_ST(STORE(stb, %o3, %o0 - 0x01)) 875 + EX_ST(STORE(stb, %o3, %o0 - 0x01), memcpy_retl_o2_plus_1) 876 876 ba,a,pt %xcc, .Lexit_cp 877 877 878 878 .Lsmallrest: ··· 883 883 nop 884 884 sub %o2, 3, %o2 885 885 .Lsmallnotalign4: 886 - EX_LD(LOAD(ldub, %o1, %o3))! read byte 886 + EX_LD(LOAD(ldub, %o1, %o3), memcpy_retl_o2_plus_3)! read byte 887 887 subcc %o2, 4, %o2 ! reduce count by 4 888 - EX_ST(STORE(stb, %o3, %o0)) ! write byte 889 - EX_LD(LOAD(ldub, %o1+1, %o3))! repeat for total of 4 bytes 888 + EX_ST(STORE(stb, %o3, %o0), memcpy_retl_o2_plus_7)! write byte & repeat 889 + EX_LD(LOAD(ldub, %o1+1, %o3), memcpy_retl_o2_plus_6)! for total of 4 890 890 add %o1, 4, %o1 ! advance SRC by 4 891 - EX_ST(STORE(stb, %o3, %o0+1)) 892 - EX_LD(LOAD(ldub, %o1-2, %o3)) 891 + EX_ST(STORE(stb, %o3, %o0+1), memcpy_retl_o2_plus_6) 892 + EX_LD(LOAD(ldub, %o1-2, %o3), memcpy_retl_o2_plus_5) 893 893 add %o0, 4, %o0 ! advance DST by 4 894 - EX_ST(STORE(stb, %o3, %o0-2)) 895 - EX_LD(LOAD(ldub, %o1-1, %o3)) 894 + EX_ST(STORE(stb, %o3, %o0-2), memcpy_retl_o2_plus_5) 895 + EX_LD(LOAD(ldub, %o1-1, %o3), memcpy_retl_o2_plus_4) 896 896 bgu,pt %xcc, .Lsmallnotalign4 ! loop til 3 or fewer bytes remain 897 - EX_ST(STORE(stb, %o3, %o0-1)) 897 + EX_ST(STORE(stb, %o3, %o0-1), memcpy_retl_o2_plus_4) 898 898 addcc %o2, 3, %o2 ! restore count 899 899 bz,pt %xcc, .Lsmallx 900 900 .Lsmallleft3: ! 1, 2, or 3 bytes remain 901 901 subcc %o2, 1, %o2 902 - EX_LD(LOAD(ldub, %o1, %o3)) ! load one byte 902 + EX_LD(LOAD(ldub, %o1, %o3), memcpy_retl_o2_plus_1) ! load one byte 903 903 bz,pt %xcc, .Lsmallx 904 - EX_ST(STORE(stb, %o3, %o0)) ! store one byte 905 - EX_LD(LOAD(ldub, %o1+1, %o3)) ! load second byte 904 + EX_ST(STORE(stb, %o3, %o0), memcpy_retl_o2_plus_1) ! store one byte 905 + EX_LD(LOAD(ldub, %o1+1, %o3), memcpy_retl_o2) ! load second byte 906 906 subcc %o2, 1, %o2 907 907 bz,pt %xcc, .Lsmallx 908 - EX_ST(STORE(stb, %o3, %o0+1))! store second byte 909 - EX_LD(LOAD(ldub, %o1+2, %o3)) ! load third byte 910 - EX_ST(STORE(stb, %o3, %o0+2)) ! store third byte 908 + EX_ST(STORE(stb, %o3, %o0+1), memcpy_retl_o2_plus_1)! store second byte 909 + EX_LD(LOAD(ldub, %o1+2, %o3), memcpy_retl_o2) ! load third byte 910 + EX_ST(STORE(stb, %o3, %o0+2), memcpy_retl_o2) ! store third byte 911 911 .Lsmallx: 912 912 retl 913 913 mov EX_RETVAL(%g1), %o0
+182
arch/sparc/lib/Memcpy_utils.S
··· 24 24 ba,pt %xcc, __restore_asi 25 25 add %o2, 1, %o0 26 26 ENDPROC(memcpy_retl_o2_plus_1) 27 + ENTRY(memcpy_retl_o2_plus_3) 28 + ba,pt %xcc, __restore_asi 29 + add %o2, 3, %o0 30 + ENDPROC(memcpy_retl_o2_plus_3) 27 31 ENTRY(memcpy_retl_o2_plus_4) 28 32 ba,pt %xcc, __restore_asi 29 33 add %o2, 4, %o0 30 34 ENDPROC(memcpy_retl_o2_plus_4) 35 + ENTRY(memcpy_retl_o2_plus_5) 36 + ba,pt %xcc, __restore_asi 37 + add %o2, 5, %o0 38 + ENDPROC(memcpy_retl_o2_plus_5) 39 + ENTRY(memcpy_retl_o2_plus_6) 40 + ba,pt %xcc, __restore_asi 41 + add %o2, 6, %o0 42 + ENDPROC(memcpy_retl_o2_plus_6) 43 + ENTRY(memcpy_retl_o2_plus_7) 44 + ba,pt %xcc, __restore_asi 45 + add %o2, 7, %o0 46 + ENDPROC(memcpy_retl_o2_plus_7) 47 + ENTRY(memcpy_retl_o2_plus_8) 48 + ba,pt %xcc, __restore_asi 49 + add %o2, 8, %o0 50 + ENDPROC(memcpy_retl_o2_plus_8) 51 + ENTRY(memcpy_retl_o2_plus_15) 52 + ba,pt %xcc, __restore_asi 53 + add %o2, 15, %o0 54 + ENDPROC(memcpy_retl_o2_plus_15) 55 + ENTRY(memcpy_retl_o2_plus_15_8) 56 + add %o2, 15, %o2 57 + ba,pt %xcc, __restore_asi 58 + add %o2, 8, %o0 59 + ENDPROC(memcpy_retl_o2_plus_15_8) 60 + ENTRY(memcpy_retl_o2_plus_16) 61 + ba,pt %xcc, __restore_asi 62 + add %o2, 16, %o0 63 + ENDPROC(memcpy_retl_o2_plus_16) 64 + ENTRY(memcpy_retl_o2_plus_24) 65 + ba,pt %xcc, __restore_asi 66 + add %o2, 24, %o0 67 + ENDPROC(memcpy_retl_o2_plus_24) 68 + ENTRY(memcpy_retl_o2_plus_31) 69 + ba,pt %xcc, __restore_asi 70 + add %o2, 31, %o0 71 + ENDPROC(memcpy_retl_o2_plus_31) 72 + ENTRY(memcpy_retl_o2_plus_32) 73 + ba,pt %xcc, __restore_asi 74 + add %o2, 32, %o0 75 + ENDPROC(memcpy_retl_o2_plus_32) 76 + ENTRY(memcpy_retl_o2_plus_31_32) 77 + add %o2, 31, %o2 78 + ba,pt %xcc, __restore_asi 79 + add %o2, 32, %o0 80 + ENDPROC(memcpy_retl_o2_plus_31_32) 81 + ENTRY(memcpy_retl_o2_plus_31_24) 82 + add %o2, 31, %o2 83 + ba,pt %xcc, __restore_asi 84 + add %o2, 24, %o0 85 + ENDPROC(memcpy_retl_o2_plus_31_24) 86 + ENTRY(memcpy_retl_o2_plus_31_16) 87 + add %o2, 31, %o2 88 + ba,pt %xcc, __restore_asi 89 + add %o2, 16, %o0 90 + ENDPROC(memcpy_retl_o2_plus_31_16) 91 + ENTRY(memcpy_retl_o2_plus_31_8) 92 + add %o2, 31, %o2 93 + ba,pt %xcc, __restore_asi 94 + add %o2, 8, %o0 95 + ENDPROC(memcpy_retl_o2_plus_31_8) 96 + ENTRY(memcpy_retl_o2_plus_63) 97 + ba,pt %xcc, __restore_asi 98 + add %o2, 63, %o0 99 + ENDPROC(memcpy_retl_o2_plus_63) 100 + ENTRY(memcpy_retl_o2_plus_63_64) 101 + add %o2, 63, %o2 102 + ba,pt %xcc, __restore_asi 103 + add %o2, 64, %o0 104 + ENDPROC(memcpy_retl_o2_plus_63_64) 105 + ENTRY(memcpy_retl_o2_plus_63_56) 106 + add %o2, 63, %o2 107 + ba,pt %xcc, __restore_asi 108 + add %o2, 56, %o0 109 + ENDPROC(memcpy_retl_o2_plus_63_56) 110 + ENTRY(memcpy_retl_o2_plus_63_48) 111 + add %o2, 63, %o2 112 + ba,pt %xcc, __restore_asi 113 + add %o2, 48, %o0 114 + ENDPROC(memcpy_retl_o2_plus_63_48) 115 + ENTRY(memcpy_retl_o2_plus_63_40) 116 + add %o2, 63, %o2 117 + ba,pt %xcc, __restore_asi 118 + add %o2, 40, %o0 119 + ENDPROC(memcpy_retl_o2_plus_63_40) 120 + ENTRY(memcpy_retl_o2_plus_63_32) 121 + add %o2, 63, %o2 122 + ba,pt %xcc, __restore_asi 123 + add %o2, 32, %o0 124 + ENDPROC(memcpy_retl_o2_plus_63_32) 125 + ENTRY(memcpy_retl_o2_plus_63_24) 126 + add %o2, 63, %o2 127 + ba,pt %xcc, __restore_asi 128 + add %o2, 24, %o0 129 + ENDPROC(memcpy_retl_o2_plus_63_24) 130 + ENTRY(memcpy_retl_o2_plus_63_16) 131 + add %o2, 63, %o2 132 + ba,pt %xcc, __restore_asi 133 + add %o2, 16, %o0 134 + ENDPROC(memcpy_retl_o2_plus_63_16) 135 + ENTRY(memcpy_retl_o2_plus_63_8) 136 + add %o2, 63, %o2 137 + ba,pt %xcc, __restore_asi 138 + add %o2, 8, %o0 139 + ENDPROC(memcpy_retl_o2_plus_63_8) 31 140 ENTRY(memcpy_retl_o2_plus_o5) 32 141 ba,pt %xcc, __restore_asi 33 142 add %o2, %o5, %o0 34 143 ENDPROC(memcpy_retl_o2_plus_o5) 144 + ENTRY(memcpy_retl_o2_plus_o5_plus_1) 145 + add %o5, 1, %o5 146 + ba,pt %xcc, __restore_asi 147 + add %o2, %o5, %o0 148 + ENDPROC(memcpy_retl_o2_plus_o5_plus_1) 35 149 ENTRY(memcpy_retl_o2_plus_o5_plus_4) 36 150 add %o5, 4, %o5 37 151 ba,pt %xcc, __restore_asi ··· 171 57 ba,pt %xcc, __restore_asi 172 58 add %o2, %o5, %o0 173 59 ENDPROC(memcpy_retl_o2_plus_o5_plus_32) 60 + ENTRY(memcpy_retl_o2_plus_o5_64) 61 + add %o5, 32, %o5 62 + ba,pt %xcc, __restore_asi 63 + add %o2, %o5, %o0 64 + ENDPROC(memcpy_retl_o2_plus_o5_64) 174 65 ENTRY(memcpy_retl_o2_plus_g1) 175 66 ba,pt %xcc, __restore_asi 176 67 add %o2, %g1, %o0 ··· 234 115 ba,pt %xcc, __restore_asi 235 116 add %o2, %o4, %o0 236 117 ENDPROC(memcpy_retl_o2_plus_o4_plus_64) 118 + ENTRY(memcpy_retl_o2_plus_o5_plus_64) 119 + add %o5, 64, %o5 120 + ba,pt %xcc, __restore_asi 121 + add %o2, %o5, %o0 122 + ENDPROC(memcpy_retl_o2_plus_o5_plus_64) 123 + ENTRY(memcpy_retl_o2_plus_o3_fp) 124 + ba,pt %xcc, __restore_asi_fp 125 + add %o2, %o3, %o0 126 + ENDPROC(memcpy_retl_o2_plus_o3_fp) 127 + ENTRY(memcpy_retl_o2_plus_o3_plus_1_fp) 128 + add %o3, 1, %o3 129 + ba,pt %xcc, __restore_asi_fp 130 + add %o2, %o3, %o0 131 + ENDPROC(memcpy_retl_o2_plus_o3_plus_1_fp) 132 + ENTRY(memcpy_retl_o2_plus_o3_plus_4_fp) 133 + add %o3, 4, %o3 134 + ba,pt %xcc, __restore_asi_fp 135 + add %o2, %o3, %o0 136 + ENDPROC(memcpy_retl_o2_plus_o3_plus_4_fp) 237 137 ENTRY(memcpy_retl_o2_plus_o4_fp) 238 138 ba,pt %xcc, __restore_asi_fp 239 139 add %o2, %o4, %o0 ··· 297 159 ba,pt %xcc, __restore_asi_fp 298 160 add %o2, %o4, %o0 299 161 ENDPROC(memcpy_retl_o2_plus_o4_plus_64_fp) 162 + ENTRY(memcpy_retl_o2_plus_o5_fp) 163 + ba,pt %xcc, __restore_asi_fp 164 + add %o2, %o5, %o0 165 + ENDPROC(memcpy_retl_o2_plus_o5_fp) 166 + ENTRY(memcpy_retl_o2_plus_o5_plus_64_fp) 167 + add %o5, 64, %o5 168 + ba,pt %xcc, __restore_asi_fp 169 + add %o2, %o5, %o0 170 + ENDPROC(memcpy_retl_o2_plus_o5_plus_64_fp) 171 + ENTRY(memcpy_retl_o2_plus_o5_plus_56_fp) 172 + add %o5, 56, %o5 173 + ba,pt %xcc, __restore_asi_fp 174 + add %o2, %o5, %o0 175 + ENDPROC(memcpy_retl_o2_plus_o5_plus_56_fp) 176 + ENTRY(memcpy_retl_o2_plus_o5_plus_48_fp) 177 + add %o5, 48, %o5 178 + ba,pt %xcc, __restore_asi_fp 179 + add %o2, %o5, %o0 180 + ENDPROC(memcpy_retl_o2_plus_o5_plus_48_fp) 181 + ENTRY(memcpy_retl_o2_plus_o5_plus_40_fp) 182 + add %o5, 40, %o5 183 + ba,pt %xcc, __restore_asi_fp 184 + add %o2, %o5, %o0 185 + ENDPROC(memcpy_retl_o2_plus_o5_plus_40_fp) 186 + ENTRY(memcpy_retl_o2_plus_o5_plus_32_fp) 187 + add %o5, 32, %o5 188 + ba,pt %xcc, __restore_asi_fp 189 + add %o2, %o5, %o0 190 + ENDPROC(memcpy_retl_o2_plus_o5_plus_32_fp) 191 + ENTRY(memcpy_retl_o2_plus_o5_plus_24_fp) 192 + add %o5, 24, %o5 193 + ba,pt %xcc, __restore_asi_fp 194 + add %o2, %o5, %o0 195 + ENDPROC(memcpy_retl_o2_plus_o5_plus_24_fp) 196 + ENTRY(memcpy_retl_o2_plus_o5_plus_16_fp) 197 + add %o5, 16, %o5 198 + ba,pt %xcc, __restore_asi_fp 199 + add %o2, %o5, %o0 200 + ENDPROC(memcpy_retl_o2_plus_o5_plus_16_fp) 201 + ENTRY(memcpy_retl_o2_plus_o5_plus_8_fp) 202 + add %o5, 8, %o5 203 + ba,pt %xcc, __restore_asi_fp 204 + add %o2, %o5, %o0 205 + ENDPROC(memcpy_retl_o2_plus_o5_plus_8_fp) 300 206 301 207 #endif