#include "combine.h"
/* Combining functions */
char combine1_descr[] = "combine1: Maximum use of data abstraction";
/* $begin combine1 */
/* Implementation with maximum use of data abstraction */
void combine1(vec_ptr v, data_t *dest)
{
int i;
*dest = IDENT;
for (i = 0; i < vec_length(v); i++) {
data_t val;
get_vec_element(v, i, &val);
/* $begin combineline */
*dest = *dest OPER val;
/* $end combineline */
}
}
/* $end combine1 */
char combine2_descr[] = "combine2: Take vec_length() out of loop";
/* $begin combine2 */
/* Move call to vec_length out of loop */
void combine2(vec_ptr v, data_t *dest)
{
int i;
int length = vec_length(v);
*dest = IDENT;
for (i = 0; i < length; i++) {
data_t val;
get_vec_element(v, i, &val);
*dest = *dest OPER val;
}
}
/* $end combine2 */
char combine3_descr[] = "combine3: Array reference to vector data";
/* $begin combine3 */
/* Direct access to vector data */
void combine3(vec_ptr v, data_t *dest)
{
int i;
int length = vec_length(v);
data_t *data = get_vec_start(v);
*dest = IDENT;
for (i = 0; i < length; i++) {
*dest = *dest OPER data[i];
}
}
/* $end combine3 */
char combine4_descr[] = "combine4: Array reference, accumulate in temporary";
/* $begin combine4 */
/* Accumulate result in local variable */
void combine4(vec_ptr v, data_t *dest)
{
int i;
int length = vec_length(v);
data_t *data = get_vec_start(v);
data_t x = IDENT;
for (i = 0; i < length; i++) {
x = x OPER data[i];
}
*dest = x;
}
/* $end combine4 */
char combine4p_descr[] = "combine4p: Pointer reference, accumulate in temporary";
/* $begin combine4p */
/* Accumulate in local variable, pointer version */
void combine4p(vec_ptr v, data_t *dest)
{
int length = vec_length(v);
data_t *data = get_vec_start(v);
data_t *dend = data+length;
data_t x = IDENT;
for (; data < dend; data++)
x = x OPER *data;
*dest = x;
}
/* $end combine4p */
char unroll2a_descr[] = "Array code, unrolled by 2";
void unroll2a_combine(vec_ptr v, data_t *dest)
{
int length = vec_length(v);
int limit = length-1;
data_t *data = get_vec_start(v);
data_t x = IDENT;
int i;
/* Combine 2 elements at a time */
for (i = 0; i < limit; i+=2) {
x = x OPER data[i] OPER data[i+1];
}
/* Finish any remaining elements */
for (; i < length; i++) {
x = x OPER data[i];
}
*dest = x;
}
char combine5_descr[] = "combine5: Array code, unrolled by 3";
/* $begin combine5 */
/* Unroll loop by 3 */
void combine5(vec_ptr v, data_t *dest)
{
int length = vec_length(v);
int limit = length-2;
data_t *data = get_vec_start(v);
data_t x = IDENT;
int i;
/* Combine 3 elements at a time */
for (i = 0; i < limit; i+=3) {
x = x OPER data[i] OPER data[i+1] OPER data[i+2];
}
/* Finish any remaining elements */
for (; i < length; i++) {
x = x OPER data[i];
}
*dest = x;
}
/* $end combine5 */
char combine5p_descr[] = "combine5p: Pointer code, unrolled by 3, for loop";
/* $begin combine5p */
/* Unroll loop by 3, pointer version */
void combine5p(vec_ptr v, data_t *dest)
{
data_t *data = get_vec_start(v);
data_t *dend = data+vec_length(v);
data_t *dlimit = dend-2;
data_t x = IDENT;
/* Combine 3 elements at a time */
for (; data < dlimit; data += 3) {
x = x OPER data[0] OPER data[1] OPER data[2];
}
/* Finish any remaining elements */
for (; data < dend; data++) {
x = x OPER data[0];
}
*dest = x;
}
/* $end combine5p */
char unroll3aw_descr[] = "Array code, unrolled by 3, while loop";
void unroll3aw_combine(vec_ptr v, data_t *dest)
{
int length = vec_length(v);
int limit = length-1;
data_t *data = get_vec_start(v);
data_t x = IDENT;
int i = 0;
/* Combine 3 elements at a time */
while (i < limit) {
x = x OPER data[i];
i+= 3;
x = x OPER data[i-2] OPER data[i-1];
}
/* Finish any remaining elements */
for (; i < length; i++) {
x = x OPER data[i];
}
*dest = x;
}
char unroll4a_descr[] = "Array code, unrolled by 4";
void unroll4a_combine(vec_ptr v, data_t *dest)
{
int length = vec_length(v);
int limit = length-3;
data_t *data = get_vec_start(v);
data_t x = IDENT;
int i;
/* Combine 4 elements at a time */
for (i = 0; i < limit; i+=4) {
x = x OPER data[i] OPER data[i+1];
x = x OPER data[i+2] OPER data[i+3];
}
/* Finish any remaining elements */
for (; i < length; i++) {
x = x OPER data[i];
}
*dest = x;
}
char unroll8a_descr[] = "Array code, unrolled by 8";
void unroll8a_combine(vec_ptr v, data_t *dest)
{
int length = vec_length(v);
int limit = length-7;
data_t *data = get_vec_start(v);
data_t x = IDENT;
int i;
/* Combine 8 elements at a time */
for (i = 0; i < limit; i+=8) {
x = x OPER data[i] OPER data[i+1];
x = x OPER data[i+2] OPER data[i+3];
x = x OPER data[i+4] OPER data[i+5];
x = x OPER data[i+6] OPER data[i+7];
}
/* Finish any remaining elements */
for (; i < length; i++) {
x = x OPER data[i];
}
*dest = x;
}
char unroll16a_descr[] = "Array code, unrolled by 16";
void unroll16a_combine(vec_ptr v, data_t *dest)
{
int length = vec_length(v);
int limit = length-15;
data_t *data = get_vec_start(v);
data_t x = IDENT;
int i;
/* Combine 16 elements at a time */
for (i = 0; i < limit; i+=16) {
x = x OPER data[i] OPER data[i+1];
x = x OPER data[i+2] OPER data[i+3];
x = x OPER data[i+4] OPER data[i+5];
x = x OPER data[i+6] OPER data[i+7];
x = x OPER data[i+8] OPER data[i+9];
x = x OPER data[i+10] OPER data[i+11];
x = x OPER data[i+12] OPER data[i+13];
x = x OPER data[i+14] OPER data[i+15];
}
/* Finish any remaining elements */
for (; i < length; i++) {
x = x OPER data[i];
}
*dest = x;
}
char unroll2_descr[] = "Pointer code, unrolled by 2";
void unroll2_combine(vec_ptr v, data_t *dest)
{
int length = vec_length(v);
data_t *data = get_vec_start(v);
int over = length%2;
data_t *dend = data+length-over;
data_t x = IDENT;
while (data < dend) {
x = x OPER data[0];
x = x OPER data[1];
data += 2;
}
dend += over;
while (data < dend) {
x = x OPER *data;
data ++;
}
*dest = x;
}
char unroll3_descr[] = "Pointer code, unrolled by 3";
void unroll3_combine(vec_ptr v, data_t *dest)
{
int length = vec_length(v);
data_t *data = get_vec_start(v);
data_t *dend = data+length-2;
data_t x = IDENT;
while (data < dend) {
x = x OPER data[0];
x = x OPER data[1];
x = x OPER data[2];
data += 3;
}
dend += 2;
while (data < dend) {
x = x OPER *data;
data ++;
}
*dest = x;
}
char unroll4_descr[] = "Pointer code, unrolled by 4";
void unroll4_combine(vec_ptr v, data_t *dest)
{
int length = vec_length(v);
data_t *data = get_vec_start(v);
data_t *dend = data+length-3;
data_t x = IDENT;
while (data < dend) {
x = x OPER data[0];
x = x OPER data[1];
x = x OPER data[2];
x = x OPER data[3];
data += 4;
}
dend += 3;
while (data < dend) {
x = x OPER *data;
data ++;
}
*dest = x;
}
char unroll8_descr[] = "Pointer code, unrolled by 8";
void unroll8_combine(vec_ptr v, data_t *dest)
{
int length = vec_length(v);
data_t *data = get_vec_start(v);
int over = length%8;
data_t *dend = data+length-over;
data_t x = IDENT;
while (data < dend) {
x = x OPER data[0];
x = x OPER data[1];
x = x OPER data[2];
x = x OPER data[3];
x = x OPER data[4];
x = x OPER data[5];
x = x OPER data[6];
x = x OPER data[7];
data += 8;
}
dend += over;
while (data < dend) {
x = x OPER *data;
data ++;
}
*dest = x;
}
char unroll16_descr[] = "Pointer code, unrolled by 16";
void unroll16_combine(vec_ptr v, data_t *dest)
{
int length = vec_length(v);
data_t *data = get_vec_start(v);
int over = length%16;
data_t *dend =
没有合适的资源?快使用搜索试试~ 我知道了~
深入理解计算机系统(代码).rar
共108个文件
c:89个
h:10个
hcl:3个
3星 · 超过75%的资源 需积分: 0 73 下载量 113 浏览量
2008-06-23
16:55:56
上传
评论
收藏 73KB RAR 举报
温馨提示
深入理解计算机系统(代码)
资源详情
资源评论
资源推荐
收起资源包目录
深入理解计算机系统(代码).rar (108个子文件)
combine.c 21KB
csapp.c 17KB
malloc.c 8KB
tiny.c 6KB
copy.c 6KB
clock.c 5KB
bmm.c 5KB
list.c 5KB
fcyc.c 4KB
okmul.c 4KB
echoservers.c 3KB
mm.c 3KB
fcomp.c 3KB
array.c 3KB
mountain.c 2KB
shellex.c 2KB
lower.c 2KB
show-bytes.c 2KB
tod.c 2KB
sbuf.c 2KB
vec.c 2KB
bufbomb.c 1KB
gethostbyname_ts.c 1KB
fib.c 1KB
echoservert_pre.c 1KB
switch.c 1KB
memlib.c 1KB
select.c 1KB
time_p.c 1024B
echoserverp.c 979B
adder.c 958B
procmask.c 953B
echoserveri.c 902B
dll.c 870B
echoservert.c 866B
signal3.c 858B
bufovf.c 831B
signal4.c 827B
echo_cnt.c 807B
signal2.c 806B
signal1.c 775B
hostinfo.c 759B
elfstructs.c 728B
waitpid2.c 683B
badcnt.c 661B
statcheck.c 646B
echoclient.c 626B
waitpid1.c 581B
setjmp.c 580B
norace.c 556B
abs.c 526B
sharing.c 525B
race.c 484B
alarm.c 482B
counterprob.c 470B
rand.c 451B
rand_r.c 411B
decimal5.c 394B
kill.c 386B
echo.c 378B
vsum.c 371B
hello.c 361B
hellobug.c 358B
sigint1.c 354B
waitprob1.c 352B
cpfile.c 339B
restart.c 336B
simple-if.c 335B
swapadd.c 324B
fork.c 267B
tfgets-main.c 263B
main2.c 235B
forkprob7.c 232B
forkprob2.c 227B
forkprob5.c 226B
forkprob6.c 225B
swap.c 214B
forkprob4.c 207B
forkprob0.c 200B
arith.c 193B
forkprob3.c 183B
cpstdin.c 179B
multvec.c 174B
addvec.c 168B
forkprob1.c 167B
exchange.c 128B
main.c 126B
hello.c 103B
absval.c 96B
p-exe.d 17KB
pdata-exe.d 9KB
d2h 169B
csapp.h 5KB
fcyc.h 1KB
fcyc.h 1KB
combine.h 1KB
vec.h 785B
sbuf.h 658B
clock.h 542B
clock.h 541B
共 108 条
- 1
- 2
wfl80152
- 粉丝: 3
- 资源: 52
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论1