1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
|
# Pure Data Packet mmx routine.
# Copyright (c) by Tom Schouten <tom@zwizwa.be>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#
# this file contains assembler routines for 2D 1 bit cellular automata
# processing. it is organized around a feeder kernel and a
# stack based bit processor (virtual forth machine)
#
# the feeder kernel is responsable for loading/storing CA cells
# from/to memory. data in memory is organized as a scanline
# encoded toroidial bitplane (lsb = left). to simplify the kernel, the top
# left corner of the rectangular grid of pixels will shift down
# every processing step.
#
# the stack machine has the following architecture:
# CA stack: %esi, TOS: %mm0 (32x2 pixels. lsw = top row)
# CA horizon: %mm4-%mm7 (64x4 pixels. %mm4 = top row)
#
# the stack size / organization is not known to the stack machine.
# it can be thought of as operating on a 3x3 cell neightbourhood.
# the only purpose of forth program is to determine the CA local update rule.
#
# the machine is supposed to be very minimal. no looping control.
# no adressing modes. no conditional code (hey, this is an experiment!)
# so recursion is not allowed (no way to stop it)
# there are 9 words to load the cell neigbourhood on the stack.
# the rest is just logic and stack manips.
# this file contains pure asm macros. it is to be included before assembly
# after scaforth.pl has processed the .scaf file
# *************************** CA CELL ACCESS MACROS *****************************
# fetchTL - fetchBR
# shift / load rectangle macros:
# shift rectangle horizontal
# result is in reg1
.macro shift reg1 reg2 count
psllq $(32+\count), \reg1
psrlq $(32-\count), \reg2
psrlq $32, \reg1
psllq $32, \reg2
por \reg2, \reg1
.endm
.macro ldtop reg1 reg2
movq %mm4, \reg1
movq %mm5, \reg2
.endm
.macro ldcenter reg1 reg2
movq %mm5, \reg1
movq %mm6, \reg2
.endm
.macro ldbottom reg1 reg2
movq %mm6, \reg1
movq %mm7, \reg2
.endm
# fetch from top row
# fetch the top left square
.macro fetchTL
ldtop %mm0, %mm1
shift %mm0, %mm1, -1
.endm
# fetch the top mid square
.macro fetchTM
ldtop %mm0, %mm1
shift %mm0, %mm1, 0
.endm
# fetch the top right square
.macro fetchTR
ldtop %mm0, %mm1
shift %mm0, %mm1, 1
.endm
# fetch from center row
# fetch the mid left square
.macro fetchML
ldcenter %mm0, %mm1
shift %mm0, %mm1, -1
.endm
# fetch the mid mid square
.macro fetchMM
ldcenter %mm0, %mm1
shift %mm0, %mm1, 0
.endm
# fetch the mid right square
.macro fetchMR
ldcenter %mm0, %mm1
shift %mm0, %mm1, 1
.endm
# fetch from bottom row
# fetch the bottom left square
.macro fetchBL
ldbottom %mm0, %mm1
shift %mm0, %mm1, -1
.endm
# fetch the bottom mid square
.macro fetchBM
ldbottom %mm0, %mm1
shift %mm0, %mm1, 0
.endm
# fetch the bottom right square
.macro fetchBR
ldbottom %mm0, %mm1
shift %mm0, %mm1, 1
.endm
# *************************** CA STACK MANIP MACROS *****************************
# dup drop dropdup swap nip dropover
.macro dup
lea -8(%esi), %esi
movq %mm0, (%esi)
.endm
.macro drop
movq (%esi), %mm0
lea 8(%esi), %esi
.endm
.macro dropdup
movq (%esi), %mm0
.endm
.macro swap
movq (%esi), %mm1
movq %mm0, (%esi)
movq %mm1, %mm0
.endm
.macro nip
lea 8(%esi), %esi
.endm
.macro dropover
movq 8(%esi), %mm0
.endm
# *************************** CA BOOLEAN LOGIC MACROS *****************************
# overxor
.macro overxor
pxor (%esi), %mm0
.endm
|