- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
case OP_PSUM_ABS_DIFF:
x86_sse_alu_pd_reg_reg (code, X86_SSE_PSADBW, ins->sreg1, ins->sreg2);
break;
case OP_UNPACK_LOWB:
x86_sse_alu_pd_reg_reg (code, X86_SSE_PUNPCKLBW, ins->sreg1, ins->sreg2);
break;
case OP_UNPACK_LOWW:
x86_sse_alu_pd_reg_reg (code, X86_SSE_PUNPCKLWD, ins->sreg1, ins->sreg2);
break;
case OP_UNPACK_LOWD:
x86_sse_alu_pd_reg_reg (code, X86_SSE_PUNPCKLDQ, ins->sreg1, ins->sreg2);
break;
case OP_UNPACK_LOWQ:
x86_sse_alu_pd_reg_reg (code, X86_SSE_PUNPCKLQDQ, ins->sreg1, ins->sreg2);
break;
case OP_UNPACK_LOWPS:
x86_sse_alu_ps_reg_reg (code, X86_SSE_UNPCKL, ins->sreg1, ins->sreg2);
break;
case OP_UNPACK_LOWPD:
x86_sse_alu_pd_reg_reg (code, X86_SSE_UNPCKL, ins->sreg1, ins->sreg2);
break;
case OP_UNPACK_HIGHB:
x86_sse_alu_pd_reg_reg (code, X86_SSE_PUNPCKHBW, ins->sreg1, ins->sreg2);
break;
case OP_UNPACK_HIGHW:
x86_sse_alu_pd_reg_reg (code, X86_SSE_PUNPCKHWD, ins->sreg1, ins->sreg2);
break;
case OP_UNPACK_HIGHD:
x86_sse_alu_pd_reg_reg (code, X86_SSE_PUNPCKHDQ, ins->sreg1, ins->sreg2);
break;
case OP_UNPACK_HIGHQ:
x86_sse_alu_pd_reg_reg (code, X86_SSE_PUNPCKHQDQ, ins->sreg1, ins->sreg2);
break;
case OP_UNPACK_HIGHPS:
x86_sse_alu_ps_reg_reg (code, X86_SSE_UNPCKH, ins->sreg1, ins->sreg2);
break;
case OP_UNPACK_HIGHPD:
x86_sse_alu_pd_reg_reg (code, X86_SSE_UNPCKH, ins->sreg1, ins->sreg2);
break;
case OP_PACKW:
x86_sse_alu_pd_reg_reg (code, X86_SSE_PACKSSWB, ins->sreg1, ins->sreg2);
break;
case OP_PACKD:
x86_sse_alu_pd_reg_reg (code, X86_SSE_PACKSSDW, ins->sreg1, ins->sreg2);
break;
case OP_PACKW_UN:
x86_sse_alu_pd_reg_reg (code, X86_SSE_PACKUSWB, ins->sreg1, ins->sreg2);
break;
case OP_PACKD_UN:
x86_sse_alu_sse41_reg_reg (code, X86_SSE_PACKUSDW, ins->sreg1, ins->sreg2);
break;
case OP_PADDB_SAT_UN:
x86_sse_alu_pd_reg_reg (code, X86_SSE_PADDUSB, ins->sreg1, ins->sreg2);
break;
case OP_PSUBB_SAT_UN:
x86_sse_alu_pd_reg_reg (code, X86_SSE_PSUBUSB, ins->sreg1, ins->sreg2);
break;
case OP_PADDW_SAT_UN:
x86_sse_alu_pd_reg_reg (code, X86_SSE_PADDUSW, ins->sreg1, ins->sreg2);
break;
case OP_PSUBW_SAT_UN:
x86_sse_alu_pd_reg_reg (code, X86_SSE_PSUBUSW, ins->sreg1, ins->sreg2);
break;
case OP_PADDB_SAT:
x86_sse_alu_pd_reg_reg (code, X86_SSE_PADDSB, ins->sreg1, ins->sreg2);
break;
case OP_PSUBB_SAT:
x86_sse_alu_pd_reg_reg (code, X86_SSE_PSUBSB, ins->sreg1, ins->sreg2);
break;
case OP_PADDW_SAT:
x86_sse_alu_pd_reg_reg (code, X86_SSE_PADDSW, ins->sreg1, ins->sreg2);
break;
case OP_PSUBW_SAT:
x86_sse_alu_pd_reg_reg (code, X86_SSE_PSUBSW, ins->sreg1, ins->sreg2);
break;
3.14159265 22.03.2013 19:59 # −1
Вот еще, довольно банально.
guest 22.03.2013 21:27 # +1
3.14159265 25.03.2013 22:17 # 0
guest 22.03.2013 20:13 # −1
guest 22.03.2013 20:44 # −1
guest 22.03.2013 21:24 # 0
guest 22.03.2013 21:33 # −1
guest 22.03.2013 22:00 # 0
Тупо так категорично заявлять. Есть приложения, которые memory-bound, есть приложения, которые calculation-heavy. В приведённом коде, если ты не заметил, производится генерация машинного кода, а не, блядь сборка мусора. Поэтому и логично думать, при "понятно почему такой тормозной" ты именно имел ввиду производительность самих исчислений, а не память.
Алсо, 99% опенсорсных виртуальных машин и динамических языков (исключение - Ява), которые я знаю, используют Boehm GC, ибо лень.
Но это всё мимо кассы, потому что в mono давно уже есть generational gc (SGen).
3.14159265 25.03.2013 15:52 # +1
Перед нами одна и та же функция, вызывающаяся каждый раз с немного другим параметром.
Вот эта штука x86_sse_alu_pd_reg_reg инлайнится, как и остальные такие функции.
Последствия этого, надеюсь, очевидны.
1. Чудовищное увеличение размера исполняемого файла
2. Из этого следуют LongJumpы в свитче и промахи кеша команд с большими пенальтями.
Хотя этого можно было избежать, разбив свитч на более меньшие, однотипные.
Сгрупировав их по вызываемой функции и добавив таблицу соответствия.
guest 30.03.2013 21:00 # 0
походу ты так и не понял, что такое трансляция IR в native code. там логики нуль. тупое маппирование ОДНО-в-ДРУГОЕ.
плюс, это си, а не с++.
ты дурак.
3.14159265 30.03.2013 21:09 # +1
>плюс, это си, а не с++.
Где ты увидел С++, guest?!
Тем более что плюс - это С+.
guest 22.03.2013 21:22 # 0
guest 22.03.2013 21:25 # −2
3.14159265 22.03.2013 21:26 # +1
wvxvw 22.03.2013 22:36 # 0
bot-minurast 23.03.2013 00:09 # +2
guest 23.03.2013 18:21 # 0
одного не хватает
vistefan 23.03.2013 19:24 # 0