1*0b3a3609Snakayama /* $NetBSD: asm.h,v 1.22 2015/10/17 19:29:48 nakayama Exp $ */ 201e2e698Seeh 3154a2d2aSmrg #include <sparc/asm.h> 4ca64aca7Schristos 5ca64aca7Schristos /* 6ca64aca7Schristos * Here are some defines to try to maintain consistency but still 7ca64aca7Schristos * support 32-and 64-bit compilers. 8ca64aca7Schristos */ 9ca64aca7Schristos #ifdef _LP64 10ca64aca7Schristos /* reg that points to base of data/text segment */ 11ca64aca7Schristos #define BASEREG %g4 12ca64aca7Schristos /* first constants for storage allocation */ 13ca64aca7Schristos #define LNGSZ 8 14ca64aca7Schristos #define LNGSHFT 3 15ca64aca7Schristos #define PTRSZ 8 16ca64aca7Schristos #define PTRSHFT 3 17ca64aca7Schristos #define POINTER .xword 18ca64aca7Schristos #define ULONG .xword 19ca64aca7Schristos /* Now instructions to load/store pointers & long ints */ 20ca64aca7Schristos #define LDLNG ldx 21ca64aca7Schristos #define LDULNG ldx 22ca64aca7Schristos #define STLNG stx 23ca64aca7Schristos #define STULNG stx 24ca64aca7Schristos #define LDPTR ldx 25ca64aca7Schristos #define LDPTRA ldxa 26ca64aca7Schristos #define STPTR stx 27ca64aca7Schristos #define STPTRA stxa 28aa19dc53Snakayama #define CASPTR casx 29aa19dc53Snakayama #define CASPTRA casxa 30ca64aca7Schristos /* Now something to calculate the stack bias */ 31ca64aca7Schristos #define STKB BIAS 32ca64aca7Schristos #define CCCR %xcc 33ca64aca7Schristos #else 34ca64aca7Schristos #define BASEREG %g0 35ca64aca7Schristos #define LNGSZ 4 36ca64aca7Schristos #define LNGSHFT 2 37ca64aca7Schristos #define PTRSZ 4 38ca64aca7Schristos #define PTRSHFT 2 39ca64aca7Schristos #define POINTER .word 40ca64aca7Schristos #define ULONG .word 41ca64aca7Schristos /* Instructions to load/store pointers & long ints */ 42ca64aca7Schristos #define LDLNG ldsw 43ca64aca7Schristos #define LDULNG lduw 44ca64aca7Schristos #define STLNG stw 45ca64aca7Schristos #define STULNG stw 46ca64aca7Schristos #define LDPTR lduw 47ca64aca7Schristos #define LDPTRA lduwa 48ca64aca7Schristos #define STPTR stw 49ca64aca7Schristos #define STPTRA stwa 50aa19dc53Snakayama #define CASPTR cas 51aa19dc53Snakayama #define CASPTRA casa 52ca64aca7Schristos #define STKB 0 53ca64aca7Schristos #define CCCR %icc 54ca64aca7Schristos #endif 55ca64aca7Schristos 56ca64aca7Schristos #if defined(_KERNEL) || defined(_RUMPKERNEL) 57ca64aca7Schristos /* Give this real authority: reset the machine */ 58ca64aca7Schristos #define NOTREACHED sir 59ca64aca7Schristos #else 60ca64aca7Schristos #define NOTREACHED 61ca64aca7Schristos #endif 62ca64aca7Schristos 63ca64aca7Schristos /* if < 32, copy by bytes, memcpy, kcopy, ... */ 64ca64aca7Schristos #define BCOPY_SMALL 32 65ca64aca7Schristos 66ca64aca7Schristos /* use as needed to align things on longword boundaries */ 67ca64aca7Schristos #define _ALIGN .align 8 68ca64aca7Schristos #define ICACHE_ALIGN .align 32 69*0b3a3609Snakayama 70*0b3a3609Snakayama /* 71*0b3a3609Snakayama * Combine 2 regs -- used to convert 64-bit ILP32 72*0b3a3609Snakayama * values to LP64. 73*0b3a3609Snakayama */ 74*0b3a3609Snakayama #define COMBINE(r1, r2, d) \ 75*0b3a3609Snakayama clruw r2; \ 76*0b3a3609Snakayama sllx r1, 32, d; \ 77*0b3a3609Snakayama or d, r2, d 78*0b3a3609Snakayama 79*0b3a3609Snakayama /* 80*0b3a3609Snakayama * Split 64-bit value in 1 reg into high and low halves. 81*0b3a3609Snakayama * Used for ILP32 return values. 82*0b3a3609Snakayama */ 83*0b3a3609Snakayama #define SPLIT(s, r0, r1) \ 84*0b3a3609Snakayama srl s, 0, r1; \ 85*0b3a3609Snakayama srlx s, 32, r0 86*0b3a3609Snakayama 87*0b3a3609Snakayama #define SPLIT_RETL(s, r0, r1) \ 88*0b3a3609Snakayama srl s, 0, r1; \ 89*0b3a3609Snakayama retl; \ 90*0b3a3609Snakayama srlx s, 32, r0 91