diff options
author | joseph <joseph@7b3dc134-2b1b-0410-93df-9e9f96275f8d> | 2012-06-01 21:32:32 +0000 |
---|---|---|
committer | joseph <joseph@7b3dc134-2b1b-0410-93df-9e9f96275f8d> | 2012-06-01 21:32:32 +0000 |
commit | 0a57a4f8f1e443295267885e3d2048f6bbb0899f (patch) | |
tree | 2b33c4c6e67c3a7a0240e7e8ec164aa9294987f8 /libc | |
parent | b7c6870709b68725080ae00a7accbc0463bce578 (diff) | |
download | eglibc2-0a57a4f8f1e443295267885e3d2048f6bbb0899f.tar.gz |
Merge changes between r18892 and r18907 from /fsf/trunk.
git-svn-id: svn://svn.eglibc.org/trunk@18908 7b3dc134-2b1b-0410-93df-9e9f96275f8d
Diffstat (limited to 'libc')
23 files changed, 173 insertions, 44 deletions
diff --git a/libc/ChangeLog b/libc/ChangeLog index 009e75ed1..49daa0e35 100644 --- a/libc/ChangeLog +++ b/libc/ChangeLog @@ -1,3 +1,69 @@ +2012-06-01 Joseph Myers <joseph@codesourcery.com> + + * sysdeps/unix/sysv/linux/powerpc/powerpc32/Makefile + (default-abi): New variable. + * sysdeps/unix/sysv/linux/powerpc/powerpc64/Makefile: New file. + * sysdeps/unix/sysv/linux/s390/s390-32/Makefile (default-abi): New + variable. + * sysdeps/unix/sysv/linux/s390/s390-64/Makefile (default-abi): + Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc32/Makefile (default-abi): + Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc64/Makefile (default-abi): + Likewise. + + * Makeconfig [abi-variants && !default-abi] (default-abi): Remove + definition. Document in comment. + +2012-06-01 David S. Miller <davem@davemloft.net> + + * stdlib/longlong.h: Updated from GCC. + +2012-06-01 H.J. Lu <hongjiu.lu@intel.com> + + [BZ #14117] + * sysdeps/unix/sysv/linux/i386/Makefile (sysdep_headers): + Don't add sys/elf.h sys/perm.h sys/reg.h sys/vm86.h + sys/debugreg.h sys/io.h here. + * sysdeps/unix/sysv/linux/x86/Makefile (sysdep_headers): Add + sys/elf.h sys/perm.h sys/reg.h sys/vm86.h sys/debugreg.h + sys/io.h. + * sysdeps/unix/sysv/linux/x86_64/Makefile (sysdep_headers): + Don't add sys/perm.h sys/reg.h sys/debugreg.h sys/io.h here. + * sysdeps/unix/sysv/linux/i386/sys/elf.h: Renamed to ... + * sysdeps/unix/sysv/linux/x86/sys/elf.h: This. + * sysdeps/unix/sysv/linux/i386/sys/vm86.h: Renamed to ... + * sysdeps/unix/sysv/linux/x86/sys/vm86.h: This. + + * sysdeps/unix/sysv/linux/x86_64/sys/debugreg.h (DR_LEN_8): + Define only if __x86_64__ is defined. + +2012-06-01 Joseph Myers <joseph@codesourcery.com> + + [BZ #14048] + * sysdeps/ieee754/dbl-64/wordsize-64/e_fmod.c (__ieee754_fmod): + Use int64_t for variable i. + * math/libm-test.inc (fmod_test): Add more tests. + + * sysdeps/ieee754/dbl-64/s_fmaf.c (__fmaf): Ensure temp + (double) + z computation is not scheduled after fetestexcept. + * sysdeps/ieee754/ldbl-128/s_fmal.c: Include <math_private.h>. + Use math_force_eval instead of asm to ensure calculation scheduled + before exception test. + * sysdeps/ieee754/ldbl-96/s_fmal.c: Include <math_private.h>. + Ensure a1 + u.d computation is not scheduled after fetestexcept. + +2012-06-01 Aurelien Jarno <aurelien@aurel32.net> + + * sysdeps/ieee754/dbl-64/s_fma.c (__fma): Ensure a1 + u.d + computation is not scheduled after fetestexcept. + +2012-06-01 H.J. Lu <hongjiu.lu@intel.com> + + [BZ #14117] + * sysdeps/unix/sysv/linux/i386/bits/wchar.h: Renamed to ... + * sysdeps/unix/sysv/linux/x86/bits/wchar.h: This. + 2012-06-01 Adhemerval Zanella <azanella@linux.vnet.ibm.com> * sysdeps/powerpc/fpu/k_cosf.c: Fix underflow generation. diff --git a/libc/Makeconfig b/libc/Makeconfig index f3c8802f8..ef0421c95 100644 --- a/libc/Makeconfig +++ b/libc/Makeconfig @@ -805,13 +805,8 @@ ifeq (yes, $(build-shared)) # defines abi-$(variant)-condition to be the condition for those options # to use in a C #if condition. abi-includes may be defined to a list of # headers to include in the generated header, if the default does not -# suffice. - -ifdef abi-variants -ifndef default-abi -default-abi = $(firstword $(abi-variants)) -endif -endif +# suffice. default-abi is defined to be the ABI for the current glibc +# build. ifndef abi-includes abi-includes := bits/wordsize.h @@ -27,8 +27,9 @@ Version 2.16 13916, 13917, 13918, 13919, 13920, 13921, 13922, 13923, 13924, 13926, 13927, 13928, 13938, 13941, 13942, 13954, 13955, 13956, 13963, 13967, 13968, 13970, 13973, 13979, 13983, 13986, 14012, 14027, 14033, 14034, - 14036, 14040, 14043, 14044, 14049, 14053, 14055, 14059, 14064, 14075, - 14080, 14083, 14103, 14104, 14109, 14112, 14122, 14123, 14153, 14183 + 14036, 14040, 14043, 14044, 14048, 14049, 14053, 14055, 14059, 14064, + 14075, 14080, 14083, 14103, 14104, 14109, 14112, 14122, 14123, 14153, + 14183 * Support for the x32 ABI on x86-64 added. The x32 target is selected by configuring glibc with: diff --git a/libc/math/libm-test.inc b/libc/math/libm-test.inc index c2176929b..0eed5978a 100644 --- a/libc/math/libm-test.inc +++ b/libc/math/libm-test.inc @@ -4136,6 +4136,14 @@ fmod_test (void) TEST_ff_f (fmod, 6.5, -2.25L, 2.0L); TEST_ff_f (fmod, -6.5, -2.25L, -2.0L); + TEST_ff_f (fmod, 0x0.fffffep-126L, 0x1p-149L, plus_zero); +#ifndef TEST_FLOAT + TEST_ff_f (fmod, 0x0.fffffffffffffp-1022L, 0x1p-1074L, plus_zero); +#endif +#if defined TEST_LDOUBLE && LDBL_MIN_EXP <= -16381 + TEST_ff_f (fmod, 0x0.fffffffffffffffep-16382L, 0x1p-16445L, plus_zero); +#endif + END (fmod); } diff --git a/libc/stdlib/longlong.h b/libc/stdlib/longlong.h index 4fa9d4683..ad42907f5 100644 --- a/libc/stdlib/longlong.h +++ b/libc/stdlib/longlong.h @@ -1127,6 +1127,29 @@ UDItype __umulsidi3 (USItype, USItype); "rJ" ((USItype) (al)), \ "rI" ((USItype) (bl)) \ __CLOBBER_CC) +#if defined (__sparc_v9__) +#define umul_ppmm(w1, w0, u, v) \ + do { \ + register USItype __g1 asm ("g1"); \ + __asm__ ("umul\t%2,%3,%1\n\t" \ + "srlx\t%1, 32, %0" \ + : "=r" ((USItype) (w1)), \ + "=r" (__g1) \ + : "r" ((USItype) (u)), \ + "r" ((USItype) (v))); \ + (w0) = __g1; \ + } while (0) +#define udiv_qrnnd(__q, __r, __n1, __n0, __d) \ + __asm__ ("mov\t%2,%%y\n\t" \ + "udiv\t%3,%4,%0\n\t" \ + "umul\t%0,%4,%1\n\t" \ + "sub\t%3,%1,%1" \ + : "=&r" ((USItype) (__q)), \ + "=&r" ((USItype) (__r)) \ + : "r" ((USItype) (__n1)), \ + "r" ((USItype) (__n0)), \ + "r" ((USItype) (__d))) +#else #if defined (__sparc_v8__) #define umul_ppmm(w1, w0, u, v) \ __asm__ ("umul %2,%3,%1;rd %%y,%0" \ @@ -1292,37 +1315,44 @@ UDItype __umulsidi3 (USItype, USItype); #define UDIV_TIME (3+7*32) /* 7 instructions/iteration. 32 iterations. */ #endif /* __sparclite__ */ #endif /* __sparc_v8__ */ +#endif /* __sparc_v9__ */ #endif /* sparc32 */ #if ((defined (__sparc__) && defined (__arch64__)) || defined (__sparcv9)) \ && W_TYPE_SIZE == 64 #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ - __asm__ ("addcc %r4,%5,%1\n\t" \ - "add %r2,%3,%0\n\t" \ - "bcs,a,pn %%xcc, 1f\n\t" \ - "add %0, 1, %0\n" \ - "1:" \ - : "=r" ((UDItype)(sh)), \ - "=&r" ((UDItype)(sl)) \ - : "%rJ" ((UDItype)(ah)), \ - "rI" ((UDItype)(bh)), \ - "%rJ" ((UDItype)(al)), \ - "rI" ((UDItype)(bl)) \ - __CLOBBER_CC) + do { \ + UDItype __carry = 0; \ + __asm__ ("addcc\t%r5,%6,%1\n\t" \ + "add\t%r3,%4,%0\n\t" \ + "movcs\t%%xcc, 1, %2\n\t" \ + "add\t%0, %2, %0" \ + : "=r" ((UDItype)(sh)), \ + "=&r" ((UDItype)(sl)), \ + "+r" (__carry) \ + : "%rJ" ((UDItype)(ah)), \ + "rI" ((UDItype)(bh)), \ + "%rJ" ((UDItype)(al)), \ + "rI" ((UDItype)(bl)) \ + __CLOBBER_CC); \ + } while (0) -#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ - __asm__ ("subcc %r4,%5,%1\n\t" \ - "sub %r2,%3,%0\n\t" \ - "bcs,a,pn %%xcc, 1f\n\t" \ - "sub %0, 1, %0\n\t" \ - "1:" \ - : "=r" ((UDItype)(sh)), \ - "=&r" ((UDItype)(sl)) \ - : "rJ" ((UDItype)(ah)), \ - "rI" ((UDItype)(bh)), \ - "rJ" ((UDItype)(al)), \ - "rI" ((UDItype)(bl)) \ - __CLOBBER_CC) +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + do { \ + UDItype __carry = 0; \ + __asm__ ("subcc\t%r5,%6,%1\n\t" \ + "sub\t%r3,%4,%0\n\t" \ + "movcs\t%%xcc, 1, %2\n\t" \ + "add\t%0, %2, %0" \ + : "=r" ((UDItype)(sh)), \ + "=&r" ((UDItype)(sl)), \ + "+r" (__carry) \ + : "%rJ" ((UDItype)(ah)), \ + "rI" ((UDItype)(bh)), \ + "%rJ" ((UDItype)(al)), \ + "rI" ((UDItype)(bl)) \ + __CLOBBER_CC); \ + } while (0) #define umul_ppmm(wh, wl, u, v) \ do { \ diff --git a/libc/sysdeps/ieee754/dbl-64/s_fma.c b/libc/sysdeps/ieee754/dbl-64/s_fma.c index ab20a801a..ce3bd36fa 100644 --- a/libc/sysdeps/ieee754/dbl-64/s_fma.c +++ b/libc/sysdeps/ieee754/dbl-64/s_fma.c @@ -1,5 +1,5 @@ /* Compute x * y + z as ternary operation. - Copyright (C) 2010, 2011 Free Software Foundation, Inc. + Copyright (C) 2010-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Jakub Jelinek <jakub@redhat.com>, 2010. @@ -158,6 +158,8 @@ __fma (double x, double y, double z) if ((u.ieee.mantissa1 & 1) == 0) u.ieee.mantissa1 |= libc_fetestexcept (FE_INEXACT) != 0; v.d = a1 + u.d; + /* Ensure the addition is not scheduled after fetestexcept call. */ + math_force_eval (v.d); } /* Reset rounding mode and test for inexact simultaneously. */ diff --git a/libc/sysdeps/ieee754/dbl-64/s_fmaf.c b/libc/sysdeps/ieee754/dbl-64/s_fmaf.c index 7a939aaed..e7a0650f0 100644 --- a/libc/sysdeps/ieee754/dbl-64/s_fmaf.c +++ b/libc/sysdeps/ieee754/dbl-64/s_fmaf.c @@ -1,5 +1,5 @@ /* Compute x * y + z as ternary operation. - Copyright (C) 2010, 2011 Free Software Foundation, Inc. + Copyright (C) 2010-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Jakub Jelinek <jakub@redhat.com>, 2010. @@ -40,6 +40,8 @@ __fmaf (float x, float y, float z) /* Perform addition with round to odd. */ u.d = temp + (double) z; + /* Ensure the addition is not scheduled after fetestexcept call. */ + math_force_eval (u.d); /* Reset rounding mode and test for inexact simultaneously. */ int j = libc_feupdateenv_test (&env, FE_INEXACT) != 0; diff --git a/libc/sysdeps/ieee754/dbl-64/wordsize-64/e_fmod.c b/libc/sysdeps/ieee754/dbl-64/wordsize-64/e_fmod.c index 6d2540447..a630d10fe 100644 --- a/libc/sysdeps/ieee754/dbl-64/wordsize-64/e_fmod.c +++ b/libc/sysdeps/ieee754/dbl-64/wordsize-64/e_fmod.c @@ -24,8 +24,8 @@ static const double one = 1.0, Zero[] = {0.0, -0.0,}; double __ieee754_fmod (double x, double y) { - int32_t n,i,ix,iy; - int64_t hx,hy,hz,sx; + int32_t n,ix,iy; + int64_t hx,hy,hz,sx,i; EXTRACT_WORDS64(hx,x); EXTRACT_WORDS64(hy,y); diff --git a/libc/sysdeps/ieee754/ldbl-128/s_fmal.c b/libc/sysdeps/ieee754/ldbl-128/s_fmal.c index 3b85b17fa..963bbd734 100644 --- a/libc/sysdeps/ieee754/ldbl-128/s_fmal.c +++ b/libc/sysdeps/ieee754/ldbl-128/s_fmal.c @@ -1,5 +1,5 @@ /* Compute x * y + z as ternary operation. - Copyright (C) 2010 Free Software Foundation, Inc. + Copyright (C) 2010-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Jakub Jelinek <jakub@redhat.com>, 2010. @@ -21,6 +21,7 @@ #include <math.h> #include <fenv.h> #include <ieee754.h> +#include <math_private.h> /* This implementation uses rounding to odd to avoid problems with double rounding. See a paper by Boldo and Melquiond: @@ -175,7 +176,7 @@ __fmal (long double x, long double y, long double z) u.ieee.mantissa3 |= fetestexcept (FE_INEXACT) != 0; v.d = a1 + u.d; /* Ensure the addition is not scheduled after fetestexcept call. */ - asm volatile ("" : : "m" (v)); + math_force_eval (v.d); int j = fetestexcept (FE_INEXACT) != 0; feupdateenv (&env); /* Ensure the following computations are performed in default rounding diff --git a/libc/sysdeps/ieee754/ldbl-96/s_fmal.c b/libc/sysdeps/ieee754/ldbl-96/s_fmal.c index 76866fbfa..ca1e0905a 100644 --- a/libc/sysdeps/ieee754/ldbl-96/s_fmal.c +++ b/libc/sysdeps/ieee754/ldbl-96/s_fmal.c @@ -1,5 +1,5 @@ /* Compute x * y + z as ternary operation. - Copyright (C) 2010 Free Software Foundation, Inc. + Copyright (C) 2010-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Jakub Jelinek <jakub@redhat.com>, 2010. @@ -21,6 +21,7 @@ #include <math.h> #include <fenv.h> #include <ieee754.h> +#include <math_private.h> /* This implementation uses rounding to odd to avoid problems with double rounding. See a paper by Boldo and Melquiond: @@ -174,6 +175,8 @@ __fmal (long double x, long double y, long double z) if ((u.ieee.mantissa1 & 1) == 0) u.ieee.mantissa1 |= fetestexcept (FE_INEXACT) != 0; v.d = a1 + u.d; + /* Ensure the addition is not scheduled after fetestexcept call. */ + math_force_eval (v.d); int j = fetestexcept (FE_INEXACT) != 0; feupdateenv (&env); /* Ensure the following computations are performed in default rounding diff --git a/libc/sysdeps/unix/sysv/linux/i386/Makefile b/libc/sysdeps/unix/sysv/linux/i386/Makefile index f4585d788..acc30219e 100644 --- a/libc/sysdeps/unix/sysv/linux/i386/Makefile +++ b/libc/sysdeps/unix/sysv/linux/i386/Makefile @@ -3,7 +3,6 @@ default-abi := 32 ifeq ($(subdir),misc) sysdep_routines += ioperm iopl vm86 call_pselect6 call_fallocate -sysdep_headers += sys/elf.h sys/perm.h sys/reg.h sys/vm86.h sys/debugreg.h sys/io.h endif ifeq ($(subdir),elf) diff --git a/libc/sysdeps/unix/sysv/linux/powerpc/powerpc32/Makefile b/libc/sysdeps/unix/sysv/linux/powerpc/powerpc32/Makefile index 966a7689e..84324aa7e 100644 --- a/libc/sysdeps/unix/sysv/linux/powerpc/powerpc32/Makefile +++ b/libc/sysdeps/unix/sysv/linux/powerpc/powerpc32/Makefile @@ -1,3 +1,6 @@ +# See Makeconfig regarding the use of default-abi. +default-abi := 32 + ifeq ($(subdir),resource) sysdep_routines += oldgetrlimit64 endif diff --git a/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/Makefile b/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/Makefile new file mode 100644 index 000000000..3ba3b1f6e --- /dev/null +++ b/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/Makefile @@ -0,0 +1,2 @@ +# See Makeconfig regarding the use of default-abi. +default-abi := 64 diff --git a/libc/sysdeps/unix/sysv/linux/s390/s390-32/Makefile b/libc/sysdeps/unix/sysv/linux/s390/s390-32/Makefile index a509c9312..3216804f7 100644 --- a/libc/sysdeps/unix/sysv/linux/s390/s390-32/Makefile +++ b/libc/sysdeps/unix/sysv/linux/s390/s390-32/Makefile @@ -1,3 +1,6 @@ +# See Makeconfig regarding the use of default-abi. +default-abi := 32 + ifeq ($(subdir),login) sysdep_routines += utmp32 utmpx32 libutil-routines += login32 diff --git a/libc/sysdeps/unix/sysv/linux/s390/s390-64/Makefile b/libc/sysdeps/unix/sysv/linux/s390/s390-64/Makefile index 283361b3f..1f6ad2106 100644 --- a/libc/sysdeps/unix/sysv/linux/s390/s390-64/Makefile +++ b/libc/sysdeps/unix/sysv/linux/s390/s390-64/Makefile @@ -1,3 +1,6 @@ +# See Makeconfig regarding the use of default-abi. +default-abi := 64 + ifeq ($(subdir),misc) sysdep_headers += sys/elf.h endif diff --git a/libc/sysdeps/unix/sysv/linux/sparc/sparc32/Makefile b/libc/sysdeps/unix/sysv/linux/sparc/sparc32/Makefile index 8f7e76be2..21c7dc168 100644 --- a/libc/sysdeps/unix/sysv/linux/sparc/sparc32/Makefile +++ b/libc/sysdeps/unix/sysv/linux/sparc/sparc32/Makefile @@ -1,3 +1,6 @@ +# See Makeconfig regarding the use of default-abi. +default-abi := 32 + asm-CPPFLAGS = -D__ASSEMBLY__ ASFLAGS-.os += -fPIC LD += -melf32_sparc diff --git a/libc/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile b/libc/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile index df4533af6..3e29dd841 100644 --- a/libc/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile +++ b/libc/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile @@ -1,2 +1,5 @@ +# See Makeconfig regarding the use of default-abi. +default-abi := 64 + sysdep-CFLAGS += -fcall-used-g6 LD += -melf64_sparc diff --git a/libc/sysdeps/unix/sysv/linux/x86/Makefile b/libc/sysdeps/unix/sysv/linux/x86/Makefile index cf4a55cf0..6412a9ef3 100644 --- a/libc/sysdeps/unix/sysv/linux/x86/Makefile +++ b/libc/sysdeps/unix/sysv/linux/x86/Makefile @@ -12,3 +12,7 @@ abi-64-ld-soname := ld-linux-x86-64.so.2 abi-x32-options := -U__i386__ -D__x86_64__ -D__ILP32__ -U__LP64__ abi-x32-condition := defined __x86_64__ && defined __ILP32__ abi-x32-ld-soname := ld-linux-x32.so.2 + +ifeq ($(subdir),misc) +sysdep_headers += sys/elf.h sys/perm.h sys/reg.h sys/vm86.h sys/debugreg.h sys/io.h +endif diff --git a/libc/sysdeps/unix/sysv/linux/i386/bits/wchar.h b/libc/sysdeps/unix/sysv/linux/x86/bits/wchar.h index ec0f34a47..ec0f34a47 100644 --- a/libc/sysdeps/unix/sysv/linux/i386/bits/wchar.h +++ b/libc/sysdeps/unix/sysv/linux/x86/bits/wchar.h diff --git a/libc/sysdeps/unix/sysv/linux/i386/sys/elf.h b/libc/sysdeps/unix/sysv/linux/x86/sys/elf.h index 1f4524cba..1f4524cba 100644 --- a/libc/sysdeps/unix/sysv/linux/i386/sys/elf.h +++ b/libc/sysdeps/unix/sysv/linux/x86/sys/elf.h diff --git a/libc/sysdeps/unix/sysv/linux/i386/sys/vm86.h b/libc/sysdeps/unix/sysv/linux/x86/sys/vm86.h index c41b55d7b..c41b55d7b 100644 --- a/libc/sysdeps/unix/sysv/linux/i386/sys/vm86.h +++ b/libc/sysdeps/unix/sysv/linux/x86/sys/vm86.h diff --git a/libc/sysdeps/unix/sysv/linux/x86_64/Makefile b/libc/sysdeps/unix/sysv/linux/x86_64/Makefile index dd4ab59c5..d6a9d360d 100644 --- a/libc/sysdeps/unix/sysv/linux/x86_64/Makefile +++ b/libc/sysdeps/unix/sysv/linux/x86_64/Makefile @@ -1,6 +1,5 @@ ifeq ($(subdir),misc) sysdep_routines += ioperm iopl -sysdep_headers += sys/perm.h sys/reg.h sys/debugreg.h sys/io.h endif ifeq ($(subdir),stdlib) diff --git a/libc/sysdeps/unix/sysv/linux/x86_64/sys/debugreg.h b/libc/sysdeps/unix/sysv/linux/x86_64/sys/debugreg.h index 84a901743..de10277e2 100644 --- a/libc/sysdeps/unix/sysv/linux/x86_64/sys/debugreg.h +++ b/libc/sysdeps/unix/sysv/linux/x86_64/sys/debugreg.h @@ -54,7 +54,9 @@ #define DR_LEN_1 (0x0) /* Settings for data length to trap on */ #define DR_LEN_2 (0x4) #define DR_LEN_4 (0xC) -#define DR_LEN_8 (0x8) +#ifdef __x86_64__ +# define DR_LEN_8 (0x8) +#endif /* The low byte to the control register determine which registers are enabled. There are 4 fields of two bits. One bit is "local", meaning |