Changeset 9e1c942 in mainline
- Timestamp:
- 2006-03-15T18:25:45Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 9a2d6e1
- Parents:
- 8e0eb63
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
arch/ia64/include/fpu_context.h
r8e0eb63 r9e1c942 30 30 #define __ia64_FPU_CONTEXT_H__ 31 31 32 #define ARCH_HAS_FPU 1 33 #define FPU_CONTEXT_ALIGN 16 34 32 35 #include <arch/types.h> 33 36 -
arch/ia64/include/interrupt.h
r8e0eb63 r9e1c942 79 79 extern int break_instruction(__u64 vector, istate_t *istate); 80 80 extern void universal_handler(__u64 vector, istate_t *istate); 81 extern void nop_handler(__u64 vector, istate_t *istate); 81 82 extern void external_interrupt(__u64 vector, istate_t *istate); 83 extern void disabled_fp_register(__u64 vector, istate_t *istate); 84 85 82 86 83 87 #endif -
arch/ia64/include/register.h
r8e0eb63 r9e1c942 37 37 #define PSR_DT_MASK (1<<17) 38 38 #define PSR_RT_MASK (1<<27) 39 40 #define PSR_DFL_MASK (1<<18) 41 #define PSR_DFH_MASK (1<<19) 42 39 43 #define PSR_IT_MASK 0x0000001000000000 40 44 -
arch/ia64/src/dummy.s
r8e0eb63 r9e1c942 33 33 .global cpu_sleep 34 34 .global dummy 35 .global fpu_enable36 .global fpu_disable37 .global fpu_init38 35 39 36 calibrate_delay_loop: 40 37 asm_delay_loop: 41 38 cpu_sleep: 42 fpu_init:43 fpu_enable:44 fpu_disable:45 39 46 40 dummy: -
arch/ia64/src/fpu_context.c
r8e0eb63 r9e1c942 29 29 30 30 #include <fpu_context.h> 31 #include <arch/register.h> 31 32 #include <print.h> 32 33 33 34 void fpu_context_save(fpu_context_t *fctx){ 34 return;35 35 asm volatile( 36 36 "stf.spill [%2]=f2,0x80\n" … … 189 189 void fpu_context_restore(fpu_context_t *fctx) 190 190 { 191 return;192 191 asm volatile( 193 192 "ldf.fill f2=[%2],0x80\n" … … 344 343 } 345 344 346 347 345 void fpu_disable(void) 346 { 347 asm volatile( 348 "ssm %0;;\n" 349 "srlz.i\n" 350 "srlz.d;;\n" 351 : 352 :"i" (PSR_DFL_MASK|PSR_DFH_MASK) 353 ); 354 355 } 356 357 void fpu_enable(void) 358 { 359 asm volatile( 360 "rsm %0;;\n" 361 "srlz.i\n" 362 "srlz.d;;\n" 363 : 364 :"i" (PSR_DFL_MASK|PSR_DFH_MASK) 365 ); 366 367 } 368 369 void fpu_init(void) 370 { 371 __u64 a = 0; 372 fpu_enable(); 373 asm volatile 374 ( 375 "mov %0=ar.fpsr;;\n" 376 "or %0=%0,%1;;\n" 377 "mov ar.fpsr=%0;;\n" 378 : "+r" (a) 379 : "r" (0x38) 380 ); 381 382 asm volatile( 383 "mov f2=f0\n" 384 "mov f3=f0\n" 385 "mov f4=f0\n" 386 "mov f5=f0\n" 387 "mov f6=f0\n" 388 "mov f7=f0\n" 389 "mov f8=f0\n" 390 "mov f9=f0\n" 391 392 "mov f10=f0\n" 393 "mov f11=f0\n" 394 "mov f12=f0\n" 395 "mov f13=f0\n" 396 "mov f14=f0\n" 397 "mov f15=f0\n" 398 "mov f16=f0\n" 399 "mov f17=f0\n" 400 "mov f18=f0\n" 401 "mov f19=f0\n" 402 403 "mov f20=f0\n" 404 "mov f21=f0\n" 405 "mov f22=f0\n" 406 "mov f23=f0\n" 407 "mov f24=f0\n" 408 "mov f25=f0\n" 409 "mov f26=f0\n" 410 "mov f27=f0\n" 411 "mov f28=f0\n" 412 "mov f29=f0\n" 413 414 "mov f30=f0\n" 415 "mov f31=f0\n" 416 "mov f32=f0\n" 417 "mov f33=f0\n" 418 "mov f34=f0\n" 419 "mov f35=f0\n" 420 "mov f36=f0\n" 421 "mov f37=f0\n" 422 "mov f38=f0\n" 423 "mov f39=f0\n" 424 425 "mov f40=f0\n" 426 "mov f41=f0\n" 427 "mov f42=f0\n" 428 "mov f43=f0\n" 429 "mov f44=f0\n" 430 "mov f45=f0\n" 431 "mov f46=f0\n" 432 "mov f47=f0\n" 433 "mov f48=f0\n" 434 "mov f49=f0\n" 435 436 "mov f50=f0\n" 437 "mov f51=f0\n" 438 "mov f52=f0\n" 439 "mov f53=f0\n" 440 "mov f54=f0\n" 441 "mov f55=f0\n" 442 "mov f56=f0\n" 443 "mov f57=f0\n" 444 "mov f58=f0\n" 445 "mov f59=f0\n" 446 447 "mov f60=f0\n" 448 "mov f61=f0\n" 449 "mov f62=f0\n" 450 "mov f63=f0\n" 451 "mov f64=f0\n" 452 "mov f65=f0\n" 453 "mov f66=f0\n" 454 "mov f67=f0\n" 455 "mov f68=f0\n" 456 "mov f69=f0\n" 457 458 "mov f70=f0\n" 459 "mov f71=f0\n" 460 "mov f72=f0\n" 461 "mov f73=f0\n" 462 "mov f74=f0\n" 463 "mov f75=f0\n" 464 "mov f76=f0\n" 465 "mov f77=f0\n" 466 "mov f78=f0\n" 467 "mov f79=f0\n" 468 469 "mov f80=f0\n" 470 "mov f81=f0\n" 471 "mov f82=f0\n" 472 "mov f83=f0\n" 473 "mov f84=f0\n" 474 "mov f85=f0\n" 475 "mov f86=f0\n" 476 "mov f87=f0\n" 477 "mov f88=f0\n" 478 "mov f89=f0\n" 479 480 "mov f90=f0\n" 481 "mov f91=f0\n" 482 "mov f92=f0\n" 483 "mov f93=f0\n" 484 "mov f94=f0\n" 485 "mov f95=f0\n" 486 "mov f96=f0\n" 487 "mov f97=f0\n" 488 "mov f98=f0\n" 489 "mov f99=f0\n" 490 491 "mov f100=f0\n" 492 "mov f101=f0\n" 493 "mov f102=f0\n" 494 "mov f103=f0\n" 495 "mov f104=f0\n" 496 "mov f105=f0\n" 497 "mov f106=f0\n" 498 "mov f107=f0\n" 499 "mov f108=f0\n" 500 "mov f109=f0\n" 501 502 "mov f110=f0\n" 503 "mov f111=f0\n" 504 "mov f112=f0\n" 505 "mov f113=f0\n" 506 "mov f114=f0\n" 507 "mov f115=f0\n" 508 "mov f116=f0\n" 509 "mov f117=f0\n" 510 "mov f118=f0\n" 511 "mov f119=f0\n" 512 513 "mov f120=f0\n" 514 "mov f121=f0\n" 515 "mov f122=f0\n" 516 "mov f123=f0\n" 517 "mov f124=f0\n" 518 "mov f125=f0\n" 519 "mov f126=f0\n" 520 "mov f127=f0\n" 521 522 ); 523 524 fpu_enable(); 525 } 526 -
arch/ia64/src/interrupt.c
r8e0eb63 r9e1c942 43 43 #include <syscall/syscall.h> 44 44 #include <print.h> 45 #include <proc/scheduler.h> 45 46 46 47 #define VECTORS_64_BUNDLE 20 … … 174 175 } 175 176 177 178 void disabled_fp_register(__u64 vector, istate_t *istate) 179 { 180 #ifdef CONFIG_CPU_LAZY 181 scheduler_fpu_lazy_request(); 182 #endif 183 } 184 185 186 void nop_handler(__u64 vector, istate_t *istate) 187 { 188 } 189 190 191 176 192 /** Handle syscall. */ 177 193 int break_instruction(__u64 vector, istate_t *istate) -
arch/ia64/src/ivt.S
r8e0eb63 r9e1c942 434 434 HEAVYWEIGHT_HANDLER 0x5300 435 435 HEAVYWEIGHT_HANDLER 0x5400 general_exception 436 HEAVYWEIGHT_HANDLER 0x5500 436 HEAVYWEIGHT_HANDLER 0x5500 disabled_fp_register 437 437 HEAVYWEIGHT_HANDLER 0x5600 438 438 HEAVYWEIGHT_HANDLER 0x5700 … … 442 442 HEAVYWEIGHT_HANDLER 0x5b00 443 443 HEAVYWEIGHT_HANDLER 0x5c00 444 HEAVYWEIGHT_HANDLER 0x5d00 444 HEAVYWEIGHT_HANDLER 0x5d00 445 445 HEAVYWEIGHT_HANDLER 0x5e00 446 446 HEAVYWEIGHT_HANDLER 0x5f00 -
kernel.config
r8e0eb63 r9e1c942 58 58 59 59 # Lazy FPU context switching 60 ! [(ARCH=mips32&MIPS_MACHINE!=msim&MIPS_MACHINE!=simics)|ARCH=amd64|ARCH=ia32 ] CONFIG_FPU_LAZY (y/n)60 ! [(ARCH=mips32&MIPS_MACHINE!=msim&MIPS_MACHINE!=simics)|ARCH=amd64|ARCH=ia32|ARCH=ia64] CONFIG_FPU_LAZY (y/n) 61 61 62 62 # Power off on halt … … 82 82 @ "synch/semaphore1" Semaphore test 1 83 83 @ "synch/semaphore2" Sempahore test 2 84 @ [ARCH=ia32|ARCH=amd64 ] "fpu/fpu1" Intel fpu test 184 @ [ARCH=ia32|ARCH=amd64|ARCH=ia64] "fpu/fpu1" Intel fpu test 1 85 85 @ [ARCH=ia32|ARCH=amd64] "fpu/sse1" Intel Sse test 1 86 86 @ [ARCH=mips32&MIPS_MACHINE!=msim&MIPS_MACHINE!=simics] "fpu/mips1" Mips FPU test 1 -
test/fpu/fpu1/test.c
r8e0eb63 r9e1c942 37 37 38 38 #include <arch.h> 39 40 #define THREADS 150*2 41 #define ATTEMPTS 100 39 #include <arch/arch.h> 40 41 #define THREADS 15*2 42 #define ATTEMPTS 10 42 43 43 44 #define E_10e8 271828182 44 45 #define PI_10e8 314159265 45 46 47 48 #ifdef __ia32_ARCH_H__ 46 49 static inline double sqrt(double x) { double v; __asm__ ("fsqrt\n" : "=t" (v) : "0" (x)); return v; } 50 #endif 51 52 #ifdef __amd64_ARCH_H__ 53 static inline double sqrt(double x) { double v; __asm__ ("fsqrt\n" : "=t" (v) : "0" (x)); return v; } 54 #endif 55 56 #ifdef __ia64_ARCH_H__ 57 static inline long double sqrt(long double a) 58 { 59 long double x = 1; 60 long double lx = 0; 61 62 if(a<0.00000000000000001) return 0; 63 64 while(x!=lx) 65 { 66 lx=x; 67 x=(x+(a/x))/2; 68 } 69 return x; 70 } 71 #endif 72 73 47 74 48 75 static atomic_t threads_ok; … … 76 103 static void pi(void *data) 77 104 { 105 106 #ifdef __ia64_ARCH_H__ 107 #undef PI_10e8 108 #define PI_10e8 3141592 109 #endif 110 78 111 int i; 79 112 double lpi, pi; … … 97 130 } 98 131 132 #ifdef __ia64_ARCH_H__ 133 if((int)(1000000*pi)!=PI_10e8) 134 panic("tid%d: pi*10e8=%d should be %d\n", THREAD->tid, (__native) (1000000*pi),(__native) (PI_10e8/100)); 135 #else 99 136 if((int)(100000000*pi)!=PI_10e8) 100 137 panic("tid%d: pi*10e8=%d should be %d\n", THREAD->tid, (__native) (100000000*pi),(__native) PI_10e8); 138 #endif 139 101 140 } 102 141 … … 134 173 printf("Test passed.\n"); 135 174 } 175 176 /* 177 static void pi(void *data) 178 { 179 #undef PI_10e8 180 #define PI_10e8 3141592 181 182 183 int i; 184 double lpi, pi; 185 double n, ab, ad; 186 187 188 printf("pi test\n"); 189 190 waitq_sleep(&can_start); 191 192 193 for (i = 0; i<ATTEMPTS; i++) { 194 lpi = -1; 195 pi = 0; 196 197 for (n=2, ab = sqrt(2); lpi != pi; n *= 2, ab = ad) { 198 double sc, cd; 199 200 sc = sqrt(1 - (ab*ab/4)); 201 cd = 1 - sc; 202 ad = sqrt(ab*ab/4 + cd*cd); 203 lpi = pi; 204 pi = 2 * n * ad; 205 } 206 207 atomic_inc(&threads_ok); 208 if((int)(1000000*pi)!=PI_10e8) 209 panic("tid%d: pi*10e6=%d\n", THREAD->tid, (int) 1000000*pi); 210 } 211 212 printf("tid%d: pi*10e6=%d\n", THREAD->tid, (int) 1000000*pi); 213 } 214 */
Note:
See TracChangeset
for help on using the changeset viewer.