Hi all, newbie here.
Does anyone know if it is possible to use GCC or Clang to multiply
two unsigned numbers and have it use for intel instructions, the mull instruction or an imul. I can't figure how to word this to accomplish this task:
result is max of 2^17 bits, and trying to retrieve high word >> 5 after a
mull or imul instruction. The above wording creates two multiply instructions.
This wording creates one instruction:
Not sure intel can handle first and that's why gcc breaks into two multiplies???
I believe the second will accomplish my task, but now need to recheck all my code.
Thanx, and I'll probably get kicked (was smoking and typing)
Pheonix
---------- Post updated at 10:25 AM ---------- Previous update was at 10:06 AM ----------
Researching this a bit, gcc asm doesn't have MUL/MULL, differentiating between the two based on their source operands. Or rather, it does have MULL, but if you use it it's VERY picky about which types it'll accept. Trying to figure out how to work this...
---------- Post updated at 10:33 AM ---------- Previous update was at 10:25 AM ----------
Here is how you get a 64-bit result from a 32-bit multiply in x86 gcc:
Hope this helps.
Thanx for reply, however maybe title a little misleading? I am trying to write "C"
code, usable by different processors. On an Intel processor using GCC or Clang
I wish to have:
to look like:
if I use the second "C" language code:
which is half of $2290649225 i get the first compiled result.
On i386 vs x86_64 the above codes should only differ in extension "l""d", but I believe the exact register reference with get you though both as "asm".
Again, I am trying to write "C" code, so I guess is there a way to tell compilers that (unsigned)2290649225, (uint32_t)2290649225, 2290649225U is an unsigned 32-bit number so shorter code is used?
Thanx Corona688! You got me in the direction I needed! Had me explain so understood what GCC might think? Strange that the 31st bit of a constant does this. Apparently the int result gets converted as long long then unsigned long long.
Resolved!
Sincere thanks! Pheonix
It wasn't about the imul instruction of intel, it was about GCC insisting that my "C" language statement wasn't a 32x32bit multiply just because the constant had the 31st bit set. GCC insisted that it should be done as a 64x32bit multiply. I saw no reason for a 2^17 * 2^32 should be done differently than a 2^17 *( 2^32 >> 1) considering they were unsigned multiplication. No reason to take high 32 of 2^17 = 0 * 2290649225 + low 32 of 2^17 * 2290649225, add in sign adjustment for the 2^17 for the answer. Especially since it doesn't do that on 2^17 * (2^32 >> 1).
I probably really shouldn't care how a compiler interprets a "C" statement. By the use of one "unsigned" where you normally don't need it, I can execute 4 instructions instead of 12 instructions. I never knew that it considered converting to "unsigned long long" was the same as converting to "long long" in this one instance. On a PPC execute 9 instructions instead of 21. And if done ppc asm only 5 (extra mr).
I have two files. Row id in File1 matches the column id in file2 (starting from column7 )except the last 2 characters. File1 has 50 rows and File 2 has 56 columns. If the id matches I want to multiply the value in column3 of File1 to the entire column in File2. and in the final output print only... (11 Replies)
Hi,
I can't find out how to create correct code to get multiplication of each elements of array. Let's say I enter array into command line (2 3 4 5 6 8) and i need output 2*3*4*5*6*8=5760.
I tried this one, but answer is 0.
for i in $@; do
mult=$((mult*i))done
echo "mult: " $mult
... (4 Replies)
Hi,
i have file1 which looks like:
x1 y1 z1
x2 y2 z2
...(and so on)
and file2 which looks like:
a11 a12 a13
a21 a22 a23
a31 a32 a33
and i want to replace file1 with the following values:
x1' y1' z1'
x2' y2' z2'
...(and so on) (2 Replies)
Hi,
I would like to carry out a multiplication in a for loop but some how I get always zero. The result of the multiplication must be assigned to the variable x.
Here is teh code
for (( i=1;i<=15;i++)); do
x=$( printf "%s\n " 'scale = 10; i*5.0*335.0*3.0/1000.0' | bc)
echo $x $i... (5 Replies)
Hi,
I am writing a script in Bourne shell
#!/bin/sh
used=`quota -v | tail -1 | awk '{print $2}'`
total=`quota -v | tail -1 | awk '{print $3}'`
echo "$used"
echo "$total"
perc=`expr ${used} / ${total} * 100 | bc`
echo "$perc"
I want to get a percentage of quota used to total limit
I... (5 Replies)
Suppose i have a file A
1*2*3*4
2*4*4*22
and second file B
2*3*4*5
4*4*6*7
By multiplying file A by file B that is file A by first column in file B respectively
output shud be
2*6*12*20
8*16*24*154
my code is
=$1
next
}
{for (f=1;f<=NF;f++) (2 Replies)
AIM- Install Oracle 11g on Solaris using VMWare
Steps
1.Logged on as root
2.Created subfolders à /usr/local/bin & /usr/local/bin/gcc
3.Downloaded gcc & libiconv & unzipped them on my harddrive & burnt them on CD
4.Copied files from CD to /usr/local/bin/gcc
5.Terminal (root) à pkgadd -d... (8 Replies)
Hello there,
how do i multiply a fraction and a whole number? Example 20% of 50,000.
I had gotten 0.2 using the following:
chk=echo 20 100 | awk `{print $1/$2}`
echo $chk
$chk \* 50000 displays the error: non-numeric expression. (1 Reply)
I'am doing a tutorial where a simple calculator was given, then i noticed that you can't actually multiply
this is how i have approached the problem so far. i just need if the user enters "*"
to change it to "/*" ,is it possible? i know that * means the name of the last file in the directory... (8 Replies)