Module: common-dylan-internals Copyright: Original Code is Copyright (c) 1995-2004 Functional Objects, Inc. All rights reserved. License: Functional Objects Library Public License Version 1.0 Dual-license: GNU Lesser General Public License Warranty: Distributed WITHOUT WARRANTY OF ANY KIND ////////////////////////////////////////////////////////////////////////////// // %logior (#rest machine-words) => result :: // %logxor (#rest machine-words) => result :: // %logand (#rest machine-words) => result :: // --- TBD: figure out how to get the compiler to transform the n-ary // --- versions into chained calls to binary versions. define macro logical-definer { define logical ?:name, ?binary:name, ?lowlevel:name, ?init:expression } => { define function ?name (#rest machine-words) => result :: ; for (x in machine-words, result = as(, ?init) then ?binary(result, x)) finally result; end for; end; define sealed generic ?binary (x :: , y :: ) => result :: ; define inline method ?binary (x :: , y :: ) => result :: ; ?lowlevel(x, y); end method; define inline method ?binary (x :: , y :: ) => result :: ; ?lowlevel(x, coerce-abstract-integer-to-machine-word(y)); end method; define inline method ?binary (x :: , y :: ) => result :: ; ?lowlevel(coerce-abstract-integer-to-machine-word(x), y); end method; define inline method ?binary (x :: , y :: ) => result :: ; ?lowlevel(coerce-abstract-integer-to-machine-word(x), coerce-abstract-integer-to-machine-word(y)); end method; } end macro; define logical %logior, binary-%logior, machine-word-logior, 0; define logical %logxor, binary-%logxor, machine-word-logxor, 0; define logical %logand, binary-%logand, machine-word-logand, -1; ////////////////////////////////////////////////////////////////////////////// // %lognot (m :: ) // => result :: define sealed generic %lognot (x :: ) => result :: ; define inline method %lognot (x :: ) => result :: ; machine-word-lognot(x); end method; define inline method %lognot (x :: ) => result :: ; machine-word-lognot(coerce-abstract-integer-to-machine-word(x)); end method; ////////////////////////////////////////////////////////////////////////////// // %logbit? (index :: , m :: ) => result :: define sealed generic %logbit? (index :: , m :: ) => result :: ; define inline method %logbit? (index :: , m :: ) => result :: ; check-bit-index(index); machine-word-logbit?(index, m); end method %logbit?; define method %logbit? (index :: , m :: ) => result :: ; check-bit-index(index); machine-word-logbit?(index, coerce-abstract-integer-to-machine-word(m)); end method %logbit?; ////////////////////////////////////////////////////////////////////////////// // %count-low-zeros (x :: ) => count :: // %count-high-zeros (x :: ) => count :: define macro count-zeros-definer { define count-zeros ?:name ?counter:name } => { define sealed generic ?name (x :: ) => count :: ; define inline method ?name (x :: ) => count :: ; ?counter(x); end method; define inline method ?name (x :: ) => count :: ; ?counter(coerce-abstract-integer-to-machine-word(x)); end method; } end macro; define count-zeros %count-low-zeros machine-word-count-low-zeros; define count-zeros %count-high-zeros machine-word-count-high-zeros;