[過去ログ]
Qiita 3 - キータぞ、来たぞ、キータだぞー (1002レス)
Qiita 3 - キータぞ、来たぞ、キータだぞー http://mevius.5ch.net/test/read.cgi/tech/1685235361/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
必死チェッカー(本家)
(べ)
自ID
レス栞
あぼーん
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
261: デフォルトの名無しさん [sage] 2023/08/10(木) 19:42:46.48 ID:c2H9n5TK > しかし多くのケースではコンパイラのコード生成に任せることができる > 今回のケースならばif文のままでも条件ムーブ(CMOVcc)命令などが生成され条件分岐とならないだろう > ソースコードの可読性からもif文のままが好ましい なにやら知ったようなことを言ってるので検証してみるとするか。 http://mevius.5ch.net/test/read.cgi/tech/1685235361/261
262: デフォルトの名無しさん [sage] 2023/08/10(木) 19:43:13.35 ID:c2H9n5TK void hoge(int n, int num[n], int deleteNum) { for (int i = 0; i < n; i++) { if (num[i] == deleteNum) { //deleteNumで指定した要素を0にする num[i] = 0; } } } gcc 13.2 最適化オプション-O2でコンパイル hoge: testl %edi, %edi jle .L1 movslq %edi, %rdi leaq (%rsi,%rdi,4), %rax .L4: cmpl %edx, (%rsi) jne .L3 movl $0, (%rsi) .L3: addq $4, %rsi cmpq %rax, %rsi jne .L4 .L1: ret https://godbolt.org/z/noxvcGbff 条件分岐するじゃんw http://mevius.5ch.net/test/read.cgi/tech/1685235361/262
263: デフォルトの名無しさん [sage] 2023/08/10(木) 19:46:00.32 ID:c2H9n5TK 記事の計算による方法 void hoge(int n, int num[n], int deleteNum) { for (int i = 0; i < n; i++) { for (int i = 0; i < 6; i++) { num[i] -= deleteNum * (deleteNum == num[i]); // deleteNumで指定した要素を消す } } } hoge: xorl %r11d, %r11d leaq 24(%rsi), %r10 xorl %r9d, %r9d testl %edi, %edi jle .L9 .L2: movq %rsi, %rax .L4: movl (%rax), %ecx movl %r9d, %r8d cmpl %edx, %ecx cmove %edx, %r8d addq $4, %rax subl %r8d, %ecx movl %ecx, -4(%rax) cmpq %r10, %rax jne .L4 addl $1, %r11d cmpl %r11d, %edi jne .L2 ret .L9: ret https://godbolt.org/z/do55an9P9 cmov命令吐いてる http://mevius.5ch.net/test/read.cgi/tech/1685235361/263
264: デフォルトの名無しさん [] 2023/08/10(木) 19:47:40.53 ID:c2H9n5TK ちなみに計算による方法でもこう書くと2行短くなった void hoge(int n, int num[n], int deleteNum) { for (int i = 0; i < n; i++) { for (int i = 0; i < 6; i++) { num[i] *= deleteNum != num[i]; // deleteNumで指定した要素を消す } } } hoge: xorl %r10d, %r10d leaq 24(%rsi), %r9 xorl %r8d, %r8d testl %edi, %edi jle .L9 .L2: movq %rsi, %rax .L4: movl (%rax), %ecx cmpl %edx, %ecx cmove %r8d, %ecx addq $4, %rax movl %ecx, -4(%rax) cmpq %r9, %rax jne .L4 addl $1, %r10d cmpl %r10d, %edi jne .L2 ret .L9: ret https://godbolt.org/z/ro1qj98MG http://mevius.5ch.net/test/read.cgi/tech/1685235361/264
266: デフォルトの名無しさん [sage] 2023/08/10(木) 19:57:21.15 ID:c2H9n5TK > したがって>>253の記事は全面的に正しい boolへのキャストなんてしねーよ馬鹿か http://mevius.5ch.net/test/read.cgi/tech/1685235361/266
268: デフォルトの名無しさん [sage] 2023/08/10(木) 20:21:25.47 ID:c2H9n5TK >>263訂正 void hoge(int n, int num[n], int deleteNum) { for (int i = 0; i < 6; i++) { num[i] -= deleteNum * (deleteNum == num[i]); // deleteNumで指定した要素を消す } } hoge: leaq 24(%rsi), %r8 xorl %edi, %edi .L2: movl (%rsi), %eax movl %edi, %ecx cmpl %edx, %eax cmove %edx, %ecx addq $4, %rsi subl %ecx, %eax movl %eax, -4(%rsi) cmpq %rsi, %r8 jne .L2 ret https://godbolt.org/z/br4nPfcEa http://mevius.5ch.net/test/read.cgi/tech/1685235361/268
269: デフォルトの名無しさん [sage] 2023/08/10(木) 20:22:14.91 ID:c2H9n5TK >>264も訂正 void hoge(int n, int num[n], int deleteNum) { for (int i = 0; i < 6; i++) { num[i] *= deleteNum != num[i]; // deleteNumで指定した要素を消す } } hoge: leaq 24(%rsi), %rdi xorl %ecx, %ecx .L2: movl (%rsi), %eax cmpl %edx, %eax cmove %ecx, %eax addq $4, %rsi movl %eax, -4(%rsi) cmpq %rdi, %rsi jne .L2 ret https://godbolt.org/z/7xhMr6oae http://mevius.5ch.net/test/read.cgi/tech/1685235361/269
270: デフォルトの名無しさん [sage] 2023/08/10(木) 20:25:05.76 ID:c2H9n5TK すまん>>263再度訂正 void hoge(int n, int num[n], int deleteNum) { for (int i = 0; i < n; i++) { num[i] -= deleteNum * (deleteNum == num[i]); // deleteNumで指定した要素を消す } } hoge: testl %edi, %edi jle .L1 movslq %edi, %rdi leaq (%rsi,%rdi,4), %r8 xorl %edi, %edi .L3: movl (%rsi), %eax movl %edi, %ecx cmpl %edx, %eax cmove %edx, %ecx addq $4, %rsi subl %ecx, %eax movl %eax, -4(%rsi) cmpq %rsi, %r8 jne .L3 .L1: ret https://godbolt.org/z/9K6dj7Goc http://mevius.5ch.net/test/read.cgi/tech/1685235361/270
271: デフォルトの名無しさん [sage] 2023/08/10(木) 20:25:56.38 ID:c2H9n5TK >>264も再度訂正 void hoge(int n, int num[n], int deleteNum) { for (int i = 0; i < n; i++) { num[i] *= deleteNum != num[i]; // deleteNumで指定した要素を消す } } hoge: testl %edi, %edi jle .L1 movslq %edi, %rdi xorl %ecx, %ecx leaq (%rsi,%rdi,4), %rdi .L3: movl (%rsi), %eax cmpl %edx, %eax cmove %ecx, %eax addq $4, %rsi movl %eax, -4(%rsi) cmpq %rsi, %rdi jne .L3 .L1: ret https://godbolt.org/z/WTTadjj5a http://mevius.5ch.net/test/read.cgi/tech/1685235361/271
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.050s